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");
}
}