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

打印 上一主题 下一主题

主题 1978|帖子 1978|积分 5944

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. import java.io.File;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. import java.util.Arrays;
  5. import java.util.Comparator;
  6. import com.itextpdf.io.image.ImageDataFactory;
  7. import com.itextpdf.kernel.pdf.PdfDocument;
  8. import com.itextpdf.kernel.pdf.PdfWriter;
  9. import com.itextpdf.layout.Document;
  10. import com.itextpdf.layout.element.Image;
  11. import com.itextpdf.text.PageSize;
  12. import jodd.util.NaturalOrderComparator;
  13. /**
  14. * 文件夹下的图片合并成pdf文件
  15. *
  16. */
  17. public class ImagesToPdf {
  18.         public static void main(String[] args) {
  19.                 String imageFolderPath = "D:\\pic\";
  20.                 String outputPdfPath = "D:\\pic\\output.pdf";
  21.                 try {
  22.                         convertImagesToPdf(imageFolderPath, outputPdfPath);
  23.                         System.out.println("PDF created successfully.");
  24.                 } catch (IOException e) {
  25.                         e.printStackTrace();
  26.                 }
  27.         }
  28.         @SuppressWarnings("unchecked")
  29.         public static void convertImagesToPdf(String imageFolderPath, String outputPdfPath) throws IOException {
  30.                 // 创建PDF文档
  31.                 PdfWriter writer = new PdfWriter(new FileOutputStream(outputPdfPath));
  32.                 PdfDocument pdfDoc = new PdfDocument(writer);
  33.                 Document document = new Document(pdfDoc);
  34.                 // 获取文件夹中的所有文件
  35.                 File folder = new File(imageFolderPath);
  36.                 File[] listOfFiles = folder.listFiles();
  37.                 if (listOfFiles != null) {
  38.                         // 按照文件名排序
  39.                         // Arrays.sort(listOfFiles, Comparator.comparing(File::getName));
  40.                         // 使用Collator进行中文排序
  41.                         // Collator collator = Collator.getInstance(Locale.CHINA);
  42.                         // Arrays.sort(listOfFiles, Comparator.comparing(File::getName, collator));
  43.                         // 使用自然排序
  44.                         // Arrays.sort(listOfFiles, Comparator.comparing(File::getName, StringUtils.getNaturalComparator()));
  45.                         // 使用自然排序
  46.                         Arrays.sort(listOfFiles, Comparator.comparing(File::getName, new NaturalOrderComparator()));
  47.                         boolean firstImage = true; // 标记是否为第一张图片
  48.                         for (File file : listOfFiles) {
  49.                                 if (file.isFile() && isImageFile(file)) {
  50.                                         // 将图片添加到PDF文档
  51.                                         Image img = new Image(ImageDataFactory.create(file.getAbsolutePath()));
  52.                                         img.setAutoScale(true); // 自动缩放图片以适应页面
  53.                                         // img.scaleToFit(PageSize.A4.getWidth(), PageSize.A4.getHeight()); // 调整图片尺寸以适应A4页面
  54.                                         // 设置图片的边距为0
  55.                                         img.setMargins(-30, -30, -30, -30);
  56.                                         if (!firstImage) {
  57.                                                 // 如果不是第一张图片,添加新页面
  58.                                                 document.add(new com.itextpdf.layout.element.AreaBreak());
  59.                                         } else {
  60.                                                 firstImage = false; // 标记为非第一张图片
  61.                                         }
  62.                                         document.add(img);
  63.                                 }
  64.                         }
  65.                 }
  66.                 // 关闭文档
  67.                 document.close();
  68.         }
  69.         private static boolean isImageFile(File file) {
  70.                 String fileName = file.getName().toLowerCase();
  71.                 return fileName.endsWith(".jpg") || fileName.endsWith(".jpeg") ||
  72. fileName.endsWith(".png") || fileName.endsWith(".bmp") || fileName.endsWith(".gif");
  73.         }
  74. }
复制代码
上面的代码,图片无法整个覆盖页面。如果图片的文件名是数字的话,也可以使用以下方式:
  1. import java.io.File;
  2. import java.io.IOException;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import javax.imageio.ImageIO;
  6. import org.apache.pdfbox.pdmodel.PDDocument;
  7. import org.apache.pdfbox.pdmodel.PDPage;
  8. import org.apache.pdfbox.pdmodel.PDPageContentStream;
  9. import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory;
  10. import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
  11. public class ImgToPdf {
  12.         public static void main(String[] args) throws IOException {
  13.                 // Create a new PDF document
  14.                 PDDocument document = new PDDocument();
  15.                 try {
  16.                         // Get list of image files to merge
  17.                         List<File> imageFiles = getListOfImageFiles();
  18.                         for (File imageFile : imageFiles) {
  19.                                 // Create a new page in the document
  20.                                 PDPage page = new PDPage();
  21.                                 document.addPage(page);
  22.                                 // Load the image file and add it to the page
  23.                                 PDImageXObject image = LosslessFactory.createFromImage(document, ImageIO.read(imageFile));
  24.                                 PDPageContentStream contentStream = new PDPageContentStream(document, page);
  25.                                 contentStream.drawImage(image, 0, 0, page.getMediaBox().getWidth(), page.getMediaBox().getHeight());
  26.                                 contentStream.close();
  27.                         }
  28.                         // Save the merged PDF document
  29.                         document.save("output.pdf");
  30.                 } finally {
  31.                         document.close();
  32.                 }
  33.         }
  34.         private static List<File> getListOfImageFiles() {
  35.                 List<File> list = new ArrayList<>();
  36.                 for (int i = 1; i <= 7; i++) {
  37.                         File file = new File("D://pic/" + i + ".png");
  38.                         list.add(file);
  39.                 }
  40.                 return list;
  41.         }
  42. }
复制代码
修改后:
  1. import org.apache.pdfbox.pdmodel.PDDocument;
  2. import org.apache.pdfbox.pdmodel.PDPage;
  3. import org.apache.pdfbox.pdmodel.PDPageContentStream;
  4. import org.apache.pdfbox.pdmodel.common.PDRectangle;
  5. import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
  6. import jodd.util.NaturalOrderComparator;
  7. import java.io.File;
  8. import java.io.IOException;
  9. import java.util.Arrays;
  10. import java.util.Comparator;
  11. public class ImagesToPdf {
  12.     public static void main(String[] args) {
  13.         String inputFolder = "D:\\pic\";
  14.         String outputPdf = "D:\\pic\\output.pdf";
  15.         
  16.         try {
  17.             convertImagesToPdf(inputFolder, outputPdf);
  18.             System.out.println("PDF created successfully with all images!");
  19.         } catch (IOException e) {
  20.             System.err.println("Error creating PDF: " + e.getMessage());
  21.             e.printStackTrace();
  22.         }
  23.     }
  24.     public static void convertImagesToPdf(String imageFolder, String outputPdf) throws IOException {
  25.         // 创建PDF文档
  26.         PDDocument document = new PDDocument();
  27.         
  28.         File folder = new File(imageFolder);
  29.         File[] imageFiles = folder.listFiles();
  30.         
  31.         if (imageFiles != null) {
  32.             // 按文件名排序
  33.            // Arrays.sort(imageFiles, Comparator.comparing(File::getName));
  34.             Arrays.sort(imageFiles, Comparator.comparing(File::getName, new NaturalOrderComparator()));
  35.             for (File imageFile : imageFiles) {
  36.                 if (isImageFile(imageFile)) {
  37.                     // 创建新页面
  38.                     PDPage page = new PDPage(PDRectangle.A4);
  39.                     document.addPage(page);
  40.                     
  41.                     // 加载图片
  42.                     PDImageXObject image = PDImageXObject.createFromFile(imageFile.getAbsolutePath(), document);
  43.                     
  44.                     // 计算图片缩放比例以适应页面
  45.                     float scale = Math.min(
  46.                         PDRectangle.A4.getWidth() / image.getWidth(),
  47.                         PDRectangle.A4.getHeight() / image.getHeight()
  48.                     );
  49.                     
  50.                     float scaledWidth = image.getWidth() * scale;
  51.                     float scaledHeight = image.getHeight() * scale;
  52.                     
  53.                     // 计算居中位置
  54.                     float x = (PDRectangle.A4.getWidth() - scaledWidth) / 2;
  55.                     float y = (PDRectangle.A4.getHeight() - scaledHeight) / 2;
  56.                     
  57.                     // 添加图片到页面
  58.                     try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) {
  59.                         contentStream.drawImage(image, x, y, scaledWidth, scaledHeight);
  60.                     }
  61.                 }
  62.             }
  63.         }
  64.         
  65.         // 保存PDF
  66.         document.save(outputPdf);
  67.         document.close();
  68.     }
  69.     private static boolean isImageFile(File file) {
  70.         String name = file.getName().toLowerCase();
  71.         return name.endsWith(".jpg") || name.endsWith(".jpeg") ||
  72.                name.endsWith(".png") || name.endsWith(".bmp") ||
  73.                name.endsWith(".gif");
  74.     }
  75. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

篮之新喜

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表