Java使用pdfbox进行pdf和图片之间的转换

简介

pdfbox是Apache开源的一个项目,支持pdf文档操作功能。

官网地址: Apache PDFBox | A Java PDF Library
支持的功能如下图.
引入依赖

复制代码
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox-app</artifactId>
            <version>2.0.19</version>
        </dependency>

pdf转换成图片

复制代码
   /**
     * 经过测试,dpi为96,100,105,120,150,200中,105显示效果较为清晰,体积稳定,dpi越高图片体积越大,一般电脑显示分辨率为96
     */
    public static final float DEFAULT_DPI = 105;

    /**
     * 默认转换的图片格式为jpg
     */
    public static final String DEFAULT_FORMAT = "jpg";


    /**
     * pdf转换成图片
     *
     * @param pdfPath    pdf文件的路径   例如: D:\\test\\test.pdf (2页)
     * @param targetPath 输出的图片路径        D:\\test\\
     * @return 抽取出来的图片路径数组         Arrays.asList( "D:\\test\\1.jpg","D:\\test\\2.jpg" )
     */
    public static List<String> pdfToManyImage(String pdfPath, String targetPath) {
        File file = new File(pdfPath);
        if (!file.exists()) {
            return null;
        }
        try {
            //加载pdf文件
            PDDocument doc = PDDocument.load(file);
            //读取pdf文件
            PDFRenderer renderer = new PDFRenderer(doc);
            int pageCount = doc.getNumberOfPages();
            List<String> stringList = new ArrayList<>(pageCount);
            String filePath = null;
            BufferedImage image;
            for (int i = 0; i < pageCount; i++) {
                //96/144/198
                // Windows native DPI
                image = renderer.renderImageWithDPI(i, DEFAULT_DPI);
                // BufferedImage srcImage = resize(image, 240, 240);//产生缩略图
                filePath = targetPath + (i + 1) + "." + DEFAULT_FORMAT;
                //保存图片
                ImageIO.write(image, DEFAULT_FORMAT, new File(filePath));
                stringList.add(filePath);
            }
            return stringList;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

图片合成pdf

复制代码
    /**
     * 多图片合成pdf的限制后缀
     */
    private static final List IMAGE_SUFFIX = Arrays.asList("jpg", "png", "jpeg");
   /**
     * 多个图片合成一个pdf
     *
     * @param imgFolder 多图片的文件夹路径  例如:"D:\\image\\"
     * @param target    合并的图片路径          "D:\\image\\merge.pdf"
     * @throws IOException
     */
    public static void manyImageToOnePdf(String imgFolder, String target) throws IOException {
        PDDocument doc = new PDDocument();
        //创建一个空的pdf文件
        doc.save(target);
        
        PDPage page;
        PDImageXObject pdImage;
        PDPageContentStream contents;
        BufferedImage bufferedImage;
        String fileName;
        float w, h;
        String suffix;
        File tempFile;
        int index;
		
		File folder = new File(imgFolder);
        for (int i = 0; i < folder.listFiles().length; i++) {
            tempFile = folder.listFiles()[i];
            if (!tempFile.isFile()) {
                continue;
            }

            fileName = tempFile.getName();
            index = fileName.lastIndexOf(".");
            if (index == -1) {
                continue;
            }
            //获取文件的后缀
            suffix = fileName.substring(index + 1);
            //如果文件后缀不是图片格式,跳过当前循环
            if (!IMAGE_SUFFIX.contains(suffix)) {
                continue;
            }
            
            bufferedImage = ImageIO.read(folder.listFiles()[i]);
            //Retrieving the page
            pdImage = LosslessFactory.createFromImage(doc, bufferedImage);
            w = pdImage.getWidth();
            h = pdImage.getHeight();
            page = new PDPage(new PDRectangle(w, h));
            contents = new PDPageContentStream(doc, page);
            contents.drawImage(pdImage, 0, 0, w, h);
            System.out.println("Image inserted");
            contents.close();
            doc.addPage(page);
        }
        //保存pdf
        doc.save(target);
        //关闭pdf
        doc.close();
    }

多个pdf合成1个pdf

复制代码
 /**
     * pdf合并拼接
     *
     * @param files      pdf文件列表    例如:  Arrays.asList(new File("D:\\1.pdf"),new File("D:\\2.pdf"))
     * @param targetPath 合并后的文件         D:\\merge.pdf
     * @return 合并后的文件File对象
     */
    public static File manyPdfToOne(List<File> files, String targetPath) {
        try {
            PDFMergerUtility mergePdf = new PDFMergerUtility();
            for (File f : files) {
                if (f.exists() && f.isFile()) {
                    // 循环添加要合并的pdf
                    mergePdf.addSource(f);
                }
            }
            // 设置合并生成pdf文件名称
            mergePdf.setDestinationFileName(targetPath);
            // 合并pdf
            mergePdf.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly());
            return new File(targetPath);
        } catch (Exception e) {
            return null;
        }
    }
相关推荐
用户40315986396632 分钟前
ARP 缓存与报文转发模拟
java·算法
小林ixn5 分钟前
大一新手小白跟黑马学习的第一个图形化项目:拼图小游戏(java)
java
nbsaas-boot18 分钟前
Go语言生态成熟度分析:为何Go还无法像Java那样实现注解式框架?
java·开发语言·golang
hi0_621 分钟前
03 数组 VS 链表
java·数据结构·c++·笔记·算法·链表
朝如青丝暮成雪_25 分钟前
java的三大特征
java
用户05956611920926 分钟前
Java 8 + 特性与 spring Boot 及 hibernate 等最新技术实操内容全解析
java·架构·设计
xiaocainiao88128 分钟前
Python 实战:构建可扩展的命令行插件引擎
开发语言·python
长安有故里y42 分钟前
tomcat设置预防host头攻击
java·tomcat·firefox
生产队队长43 分钟前
Tomcat问题:启动脚本startup.bat中文乱码问题解决
java·ajax·tomcat
碧海蓝天20221 小时前
C++法则21:避免将#include放在命名空间内部。
开发语言·c++