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();
                }
            }
        }
    }
}
相关推荐
打工仔折腾 AI13 小时前
在线PDF工具隐私焦虑?把BentoPDF部署到极空间NAS本地处理
人工智能·后端·python·pdf·ai agent 实战
霸道流氓气质16 小时前
AI 简历制作平台:结构化输出解析、多模板渲染与 PDF 导出的 Vue3 + Spring AI 全栈实战
人工智能·spring·pdf
开开心心_Every16 小时前
黄金价格软件国内外价格实时监控超方便
运维·服务器·游戏·智能手机·pdf·lua·perl
JasonSJX17 小时前
DRM-X 5.0 PDF 保护更新:Windows 与 Mac 打印保留用户水印,ZJGet iOS 版支持 PDF 阅读
macos·pdf
shmily麻瓜小菜鸡2 天前
前端实现图片与PDF文字识别敏感信息打码方案
前端·pdf·状态模式
ComPDFKit2 天前
PDF 涂黑后还能复制?用 ComPDF 检查敏感文字是否真正删除
pdf
飞塔老梅子2 天前
21. 按页数或章节分割大PDF文件 ❀ 老梅子学AI
pdf·分割·basic·pdfsam·裁切
开开心心就好2 天前
文件关联被破坏怎么修?免费工具一键修复
java·服务器·开发语言·pdf·ocr·启发式算法·宽度优先
黄一一9112432 天前
吾爱大佬开发,离线可用!PDF文件处理工具,本地网页版文件-浏览器里就能搞定,所有操作系统可用
windows·安全·阿里云·pdf·.net·开源软件
开开心心就好2 天前
Windows视频播放器推荐,精简版体积更小
java·服务器·开发语言·eclipse·pdf·ocr·音视频