使用java把一个文件夹下图片合并成一个pdf文件

发布于:2025-05-12 ⋅ 阅读:(20) ⋅ 点赞:(0)
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.Comparator;

import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Image;
import com.itextpdf.text.PageSize;

import jodd.util.NaturalOrderComparator;

/**
 * 文件夹下的图片合并成pdf文件
 *
 */
public class ImagesToPdf {

	public static void main(String[] args) {

		String imageFolderPath = "D:\\pic\\";
		String outputPdfPath = "D:\\pic\\output.pdf";

		try {
			convertImagesToPdf(imageFolderPath, outputPdfPath);
			System.out.println("PDF created successfully.");
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	@SuppressWarnings("unchecked")
	public static void convertImagesToPdf(String imageFolderPath, String outputPdfPath) throws IOException {
		// 创建PDF文档
		PdfWriter writer = new PdfWriter(new FileOutputStream(outputPdfPath));
		PdfDocument pdfDoc = new PdfDocument(writer);
		Document document = new Document(pdfDoc);

		// 获取文件夹中的所有文件
		File folder = new File(imageFolderPath);
		File[] listOfFiles = folder.listFiles();

		if (listOfFiles != null) {
			// 按照文件名排序
			// Arrays.sort(listOfFiles, Comparator.comparing(File::getName));
			// 使用Collator进行中文排序
			// Collator collator = Collator.getInstance(Locale.CHINA);
			// Arrays.sort(listOfFiles, Comparator.comparing(File::getName, collator));
			// 使用自然排序
			// Arrays.sort(listOfFiles, Comparator.comparing(File::getName, StringUtils.getNaturalComparator()));
			// 使用自然排序
			Arrays.sort(listOfFiles, Comparator.comparing(File::getName, new NaturalOrderComparator()));
			boolean firstImage = true; // 标记是否为第一张图片
			for (File file : listOfFiles) {
				if (file.isFile() && isImageFile(file)) {
					// 将图片添加到PDF文档
					Image img = new Image(ImageDataFactory.create(file.getAbsolutePath()));
					img.setAutoScale(true); // 自动缩放图片以适应页面
					// img.scaleToFit(PageSize.A4.getWidth(), PageSize.A4.getHeight()); // 调整图片尺寸以适应A4页面
					// 设置图片的边距为0
					img.setMargins(-30, -30, -30, -30);
					if (!firstImage) {
						// 如果不是第一张图片,添加新页面
						document.add(new com.itextpdf.layout.element.AreaBreak());
					} else {
						firstImage = false; // 标记为非第一张图片
					}
					document.add(img);
				}
			}
		}

		// 关闭文档
		document.close();
	}

	private static boolean isImageFile(File file) {
		String fileName = file.getName().toLowerCase();
		return fileName.endsWith(".jpg") || fileName.endsWith(".jpeg") || 
fileName.endsWith(".png") || fileName.endsWith(".bmp") || fileName.endsWith(".gif");
	}
}

上面的代码,图片无法整个覆盖页面。如果图片的文件名是数字的话,也可以使用以下方式:

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;

public class ImgToPdf {

	public static void main(String[] args) throws IOException {
		// Create a new PDF document
		PDDocument document = new PDDocument();
		try {
			// Get list of image files to merge
			List<File> imageFiles = getListOfImageFiles();

			for (File imageFile : imageFiles) {
				// Create a new page in the document
				PDPage page = new PDPage();
				document.addPage(page);

				// Load the image file and add it to the page
				PDImageXObject image = LosslessFactory.createFromImage(document, ImageIO.read(imageFile));
				PDPageContentStream contentStream = new PDPageContentStream(document, page);
				contentStream.drawImage(image, 0, 0, page.getMediaBox().getWidth(), page.getMediaBox().getHeight());
				contentStream.close();
			}
			// Save the merged PDF document
			document.save("output.pdf");
		} finally {
			document.close();
		}
	}

	private static List<File> getListOfImageFiles() {
		List<File> list = new ArrayList<>();
		for (int i = 1; i <= 7; i++) {
			File file = new File("D://pic/" + i + ".png");
			list.add(file);
		}
		return list;
	}

}

修改后:

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;

import jodd.util.NaturalOrderComparator;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Comparator;

public class ImagesToPdf {

    public static void main(String[] args) {
        String inputFolder = "D:\\pic\\";
        String outputPdf = "D:\\pic\\output.pdf";
        
        try {
            convertImagesToPdf(inputFolder, outputPdf);
            System.out.println("PDF created successfully with all images!");
        } catch (IOException e) {
            System.err.println("Error creating PDF: " + e.getMessage());
            e.printStackTrace();
        }
    }

    public static void convertImagesToPdf(String imageFolder, String outputPdf) throws IOException {
        // 创建PDF文档
        PDDocument document = new PDDocument();
        
        File folder = new File(imageFolder);
        File[] imageFiles = folder.listFiles();
        
        if (imageFiles != null) {
            // 按文件名排序
           // Arrays.sort(imageFiles, Comparator.comparing(File::getName));
            Arrays.sort(imageFiles, Comparator.comparing(File::getName, new NaturalOrderComparator()));
            for (File imageFile : imageFiles) {
                if (isImageFile(imageFile)) {
                    // 创建新页面
                    PDPage page = new PDPage(PDRectangle.A4);
                    document.addPage(page);
                    
                    // 加载图片
                    PDImageXObject image = PDImageXObject.createFromFile(imageFile.getAbsolutePath(), document);
                    
                    // 计算图片缩放比例以适应页面
                    float scale = Math.min(
                        PDRectangle.A4.getWidth() / image.getWidth(),
                        PDRectangle.A4.getHeight() / image.getHeight()
                    );
                    
                    float scaledWidth = image.getWidth() * scale;
                    float scaledHeight = image.getHeight() * scale;
                    
                    // 计算居中位置
                    float x = (PDRectangle.A4.getWidth() - scaledWidth) / 2;
                    float y = (PDRectangle.A4.getHeight() - scaledHeight) / 2;
                    
                    // 添加图片到页面
                    try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) {
                        contentStream.drawImage(image, x, y, scaledWidth, scaledHeight);
                    }
                }
            }
        }
        
        // 保存PDF
        document.save(outputPdf);
        document.close();
    }

    private static boolean isImageFile(File file) {
        String name = file.getName().toLowerCase();
        return name.endsWith(".jpg") || name.endsWith(".jpeg") || 
               name.endsWith(".png") || name.endsWith(".bmp") || 
               name.endsWith(".gif");
    }
}