Java实现图片转pdf

该方法可以选择多个图片是否合并为一个pdf输出,也可以选择图片为横向或者纵向输出,也可以选择pdf页面为A3或者A4

第一步

java 复制代码
 <dependency>
        <groupId>org.apache.pdfbox</groupId>
        <artifactId>pdfbox</artifactId>
        <version>2.0.24</version>
 </dependency>

第二步

java 复制代码
package com.example.demo.file.pdf;

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 java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ImageConditionToPdfConverter {
    private static final List<String> SUPPORTED_IMAGE_SUFFIXES = Arrays.asList("png", "jpg", "jpeg", "gif", "bmp", "tiff");

    public static void main(String[] args) {
        String imagesFolder = "C:\\Users\\EDY\\Desktop\\测试图片"; // 图片文件夹路径
        String outputFolder = "C:\\Users\\EDY\\Desktop\\output"; // 输出PDF文件夹路径
        boolean mergePdf = true; // 是否将所有图片合并到同一个PDF文件中
        boolean landscape = false; // 图片布局方向,横向为true,纵向为false
        String pageSize = "A4"; // 页面大小,可以是"A3"或"A4"

        List<File> imageFiles = getImageFiles(imagesFolder, SUPPORTED_IMAGE_SUFFIXES);
        ensureOutputDirectoryExists(outputFolder); // 确保输出目录存在

        try {
            if (mergePdf) {
                // 如果合并到同一个PDF,创建一个文档并添加所有页面
                PDDocument document = new PDDocument();
                for (File imageFile : imageFiles) {
                    PDPage page = createPage(pageSize, landscape);
                    document.addPage(page);
                    PDImageXObject pdImage = PDImageXObject.createFromFile(String.valueOf(imageFile), document);
                    PDPageContentStream contentStream = new PDPageContentStream(document, page);
                    drawImage(contentStream, pdImage, page.getMediaBox(), landscape);
                    contentStream.close();
                }
                document.save(outputFolder + "\\output.pdf");
                document.close();
            } else {
                // 如果不合并到同一个PDF,为每个图片创建一个文档
                for (File imageFile : imageFiles) {
                    PDDocument document = new PDDocument();
                    PDPage page = createPage(pageSize, landscape);
                    document.addPage(page);
                    PDImageXObject pdImage = PDImageXObject.createFromFile(String.valueOf(imageFile), document);
                    PDPageContentStream contentStream = new PDPageContentStream(document, page);
                    drawImage(contentStream, pdImage, page.getMediaBox(), landscape);
                    contentStream.close();
                    document.save(outputFolder + "\\output_" + imageFiles.indexOf(imageFile) + ".pdf");
                    document.close();
                }
            }
            System.out.println("PDF created successfully!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static PDPage createPage(String pageSize, boolean landscape) {
        PDRectangle mediaBox = "A3".equalsIgnoreCase(pageSize) ? PDRectangle.A3 : PDRectangle.A4;
        PDPage page = new PDPage(mediaBox);
        if (landscape) {
            page.setRotation(90);
        }
        return page;
    }

    private static void drawImage(PDPageContentStream contentStream, PDImageXObject pdImage, PDRectangle mediaBox, boolean landscape) throws IOException {
        float imageWidth = pdImage.getWidth();
        float imageHeight = pdImage.getHeight();
        float pageWidth = mediaBox.getWidth();
        float pageHeight = mediaBox.getHeight();

        if (landscape) {
            float temp = pageWidth;
            pageWidth = pageHeight;
            pageHeight = temp;
        }

        float scale = Math.min(pageWidth / imageWidth, pageHeight / imageHeight);
        imageWidth *= scale;
        imageHeight *= scale;

        // Center the image on the page
        float x = (pageWidth - imageWidth) / 2;
        float y = (pageHeight - imageHeight) / 2;

        contentStream.drawImage(pdImage, x, y, imageWidth, imageHeight);
    }

    private static List<File> getImageFiles(String folderPath, List<String> supportedSuffixes) {
        File folder = new File(folderPath);
        File[] files = folder.listFiles();
        if (files != null) {
            List<File> imageFiles = new ArrayList<>();
            for (File file : files) {
                if (file.isFile() && isImage(file, supportedSuffixes)) {
                    imageFiles.add(file);
                }
            }
            return imageFiles;
        }
        return new ArrayList<>();
    }

    private static boolean isImage(File file, List<String> supportedSuffixes) {
        String fileName = file.getName().toLowerCase();
        return supportedSuffixes.stream().anyMatch(fileName::endsWith);
    }

    private static void ensureOutputDirectoryExists(String directoryPath) {
        File directory = new File(directoryPath);
        if (!directory.exists()) {
            directory.mkdirs();
        }
    }
}
相关推荐
EXI-小洲8 小时前
Java 操作 Word:字符串替换、图片插入、动态生成表格与API接口下载
java·开发语言·spring boot·word
2601_961901709 小时前
SpringBoot使用Nacos进行application.yml配置管理
java·spring boot·spring
何以解忧,唯有..9 小时前
LangChain 工具调用(Tool Calling)实战指南
java·前端·langchain
QQ_216962909610 小时前
【源码编号:project79475】SpringBoot校内二手交易平台:商品发布、分类检索、留言交流、订单管理全流程实战
java·spring boot·后端
前端 贾公子11 小时前
第09章:上下文与记忆 (2)
java·服务器·前端
2601_9622035111 小时前
Java进阶07集合(续)
java·开发语言
郑州光合科技余经理11 小时前
本地生活服务系统:模块边界与结算字段怎么拆
java·开发语言·前端·后端·系统架构·uni-app·php
roman_日积跬步-终至千里12 小时前
【数据治理(6)】DataOps 不是调度工具,而是让数据产品长期可信的运行机制
java·服务器·网络
小新科研测评12 小时前
2026 年 3 种 PDF 文献翻译方案横评:公式/表格/双栏排版保真度实测
人工智能·ai·pdf·自动翻译
落魄大学生之流水线上谋生计12 小时前
LangGraph 基本用法指南
java·windows·python·langchain