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();
                }
            }
        }
    }
}
相关推荐
Kyln.Wu10 小时前
【python实用小脚本-190】Python一键删除PDF任意页:输入页码秒出干净文件——再也不用在线裁剪排队
服务器·python·pdf
阿幸软件杂货间1 天前
免费万能电子书格式转换器!Neat Converter支持 ePub、Azw3、Mobi、Doc、PDF、TXT 文件的相互转换。
pdf·格式转换
星马梦缘1 天前
CSDN转PDF【无水印且免费!!!】
pdf·免费·pandoc·转pdf·无水印·csdn转pdf·wkhtmlpdf
画月的亮1 天前
前端处理导出PDF。Vue导出pdf
前端·vue.js·pdf
伊织code2 天前
pdfminer.six
python·pdf·图片·提取·文本·pdfminer·pdfminer.six
HAPPY酷2 天前
给纯小白的Python操作 PDF 笔记
开发语言·python·pdf
代码AI弗森3 天前
PDF OCR + 大模型:让文档理解不止停留在识字
pdf·ocr
小周同学:4 天前
在 Vue2 中使用 pdf.js + pdf-lib 实现 PDF 预览、手写签名、文字批注与高保真导出
开发语言·前端·javascript·vue.js·pdf
Kyln.Wu4 天前
【python实用小脚本-187】Python一键批量改PDF文字:拖进来秒出新文件——再也不用Acrobat来回导
python·pdf·c#
迪尔~6 天前
Apache POI中通过WorkBook写入图片后出现导出PDF文件时在不同页重复写入该图片问题,如何在通过sheet获取绘图对象清除该图片
java·pdf·excel