pdf、pfd、img互转工具类

xml 复制代码
    <dependency>
            <groupId>com.itextpdf.tool</groupId>
            <artifactId>xmlworker</artifactId>
            <version>5.4.1</version>
        </dependency>
        <dependency>
            <groupId>org.ofdrw</groupId>
            <artifactId>ofdrw-full</artifactId>
            <version>2.0.6</version>
        </dependency>
        <dependency>
            <groupId>com.pansoft.xbrl</groupId>
            <artifactId>xbrl-json</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.27</version>
        </dependency>
java 复制代码
/**
 * @author : maqingbo
 * @email : qingbo.my@gmail.com
 * @date : 2023/8/8:13:04  周二
 */
public class OfdUtils {

    /**
     * ofd->img
     * @param ofdInputFile
     * @param imgOutputFile
     * @throws FileNotFoundException
     */
    public static void ofd2Img(String ofdInputFile, String imgOutputFile) throws FileNotFoundException {
        String tempPdfPath = System.getProperty("java.io.tmpdir") + File.separator + "temp.pdf";
        ofd2Pdf(ofdInputFile, tempPdfPath);
        pdf2Img(tempPdfPath, imgOutputFile,false);
        File file = new File(tempPdfPath);
        FileUtil.del(file);
    }

    /**
     * pdf->img
     * @param pfdInputFile
     * @param imgOutputFile
     * @param outLongImage 是否输出长图
     */
    public static void pdf2Img(String pfdInputFile, String imgOutputFile,boolean outLongImage) {
        if (imgOutputFile.lastIndexOf(".") == -1) {
            throw new RuntimeException("PDF转图片失败");
        }
        String suffix = imgOutputFile.substring(imgOutputFile.lastIndexOf(".") + 1);
        String imgFileName = imgOutputFile.substring(0, imgOutputFile.lastIndexOf("."));
        List<String> imagePath = new ArrayList<>();
        PDDocument document = null;
        try {
            document = PDDocument.load(new File(pfdInputFile));
            PDFRenderer renderer = new PDFRenderer(document);
            for (int pageIndex = 0; pageIndex < document.getNumberOfPages(); pageIndex++) {
                BufferedImage image = renderer.renderImageWithDPI(pageIndex, 300);
                String index = String.format("%03d", pageIndex + 1);
                String newFileName = imgFileName.concat("-").concat(index);
                File imgFile = new File(newFileName.concat(".").concat(suffix));
                ImageIO.write(image, suffix,imgFile);
                imagePath.add(imgFile.getAbsolutePath());
            }
            if (outLongImage){
                concatenateImages(imagePath,imgOutputFile);
            }
            System.out.println("OFD文件已成功转换为图片!");
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("PDF转图片失败");
        } finally {
            if (document != null) {
                try {
                    document.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 多张图片拼接成一张长图
     *
     * @param imagePaths
     */
    public static void concatenateImages(List<String> imagePaths, String outputImagePath) throws IOException {
        // 加载所有图片并获取宽度和高度
        BufferedImage[] images = new BufferedImage[imagePaths.size()];
        int totalHeight = 0;
        int maxWidth = 0;

        for (int i = 0; i < imagePaths.size(); i++) {
            try {
                images[i] = ImageIO.read(new File(imagePaths.get(i)));
            } catch (IOException e) {
                e.printStackTrace();
                throw new IOException();
            }
            totalHeight += images[i].getHeight();
            maxWidth = Math.max(maxWidth, images[i].getWidth());
        }

        // 创建空白长图
        BufferedImage concatImage = new BufferedImage(maxWidth, totalHeight, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2d = concatImage.createGraphics();
        g2d.setColor(Color.WHITE);
        g2d.fillRect(0, 0, maxWidth, totalHeight);

        // 拼接图片
        int currentHeight = 0;
        for (BufferedImage image : images) {
            g2d.drawImage(image, 0, currentHeight, null);
            currentHeight += image.getHeight();
        }

        g2d.dispose();

        // 保存拼接后的长图
        ImageIO.write(concatImage, "PNG", new File(outputImagePath));

        //删除零散图片
        for (String imagePath : imagePaths) {
            FileUtil.del(new File(imagePath));
        }
    }

    /**
     * ofd->pdf
     * @param ofdInputStream
     * @param pdfOutputStream
     */
    public static void ofd2Pdf(InputStream ofdInputStream, OutputStream pdfOutputStream) {
        ConvertHelper.toPdf(ofdInputStream, pdfOutputStream);
    }

    public static void ofd2Pdf(String ofdPath, String pdfPath) {
        FileInputStream ofdInputStream = null;
        FileOutputStream pdfOutputStream = null;
        try {
            ofdInputStream = new FileInputStream(ofdPath);
            pdfOutputStream = new FileOutputStream(pdfPath);
            ConvertHelper.toPdf(ofdInputStream, pdfOutputStream);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("OFD转PDF异常");
        } finally {
            if (ofdInputStream != null) {
                try {
                    ofdInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (pdfOutputStream != null) {
                try {
                    pdfOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
相关推荐
weixin_441003641 天前
2025年6月英语四六级真题及参考答案【三套全】完整版PDF电子版
pdf
南风微微吹1 天前
26考研数学一、二、三真题试卷及答案PDF电子版(1987-2025年)
考研·pdf
一头生产的驴1 天前
java整合itext pdf实现固定模版pdf导出
java·python·pdf
魔都吴所谓1 天前
【python】快速实现pdf批量去除指定位置水印
java·python·pdf
CodeCraft Studio1 天前
PDF处理控件Aspose.PDF教程:在C#中将PDF转换为Base64
服务器·pdf·c#·.net·aspose·aspose.pdf·pdf转base64
南风微微吹1 天前
26考研英语一、二真题试卷及答案解析PDF电子版(1980-2025年)
考研·pdf
weixin_402486342 天前
直接将ppt导出成pdf 图片失真严重,选中整个图片和需要的对象后保存成图片,格式选择为.svg
pdf
TextIn智能文档云平台2 天前
LLM 文档处理:如何让 AI 更好地理解中文 PDF 中的复杂格式?
人工智能·pdf
liliangcsdn2 天前
使用Deepseek解析PDF文件
pdf