Java利用PdfBox实现Pdf转图片

一、导入依赖

<!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox -->
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.pdfbox/fontbox -->
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>fontbox</artifactId>
    <version>2.0.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
</dependency>
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>jbig2-imageio</artifactId>
    <version>3.0.2</version>
</dependency>

二、代码实现

package com.example.pdf_box_to_images.contorller;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

/**
 * @author Wss8752@qq.com
 * @version 1.0
 * @date 2021/10/15 下午4:19
 */
public class PdfToImages {
    //可自由确定起始页和终止页
    public static void pdf2png(String fileAddress, String filename, int indexOfStart, int indexOfEnd) {
        // 将pdf装图片 并且自定义图片得格式大小
        File file = new File(fileAddress + "/" + filename + ".pdf");
        try {
            PDDocument doc = PDDocument.load(file);
            PDFRenderer renderer = new PDFRenderer(doc);
            int pageCount = doc.getNumberOfPages();
            for (int i = indexOfStart; i < indexOfEnd; i++) {
                BufferedImage image = renderer.renderImageWithDPI(i, 144); // Windows native DPI
                // BufferedImage srcImage = resize(image, 240, 240);//产生缩略图
                ImageIO.write(image, "PNG", new File(fileAddress + "/images/" + filename + "_" + (i + 1) + ".png"));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //转换全部的pdf
    public static void pdf2png(String fileAddress, String filename) {
        // 将pdf装图片 并且自定义图片得格式大小
        File file = new File(fileAddress + "/" + filename + ".pdf");
        try {
            PDDocument doc = PDDocument.load(file);
            PDFRenderer renderer = new PDFRenderer(doc);
            int pageCount = doc.getNumberOfPages();
            for (int i = 0; i < pageCount; i++) {
                BufferedImage image = renderer.renderImageWithDPI(i, 250); // Windows native DPI
                // BufferedImage srcImage = resize(image, 240, 240);//产生缩略图
                ImageIO.write(image, "PNG", new File(fileAddress + "/images/" + filename + "_" + (i + 1) + ".png"));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        String fileAddress = "/home/kv/IdeaProjects/MarkVeriousTests2/PdfBoxToImages/src/main/resources";
        String filename = "Safety, Efficacy, and Pharmacokinetics of Almo";
        int indexOfStart = 0;//开始转换的页码
        int indexOfEnd = -1;//停止转换的页码,-1为全部
        if (indexOfEnd == -1) {
            pdf2png(fileAddress, filename);
        } else {
            pdf2png(fileAddress, filename, indexOfStart, indexOfEnd);
        }

    }
}

三、中文乱码或者图片到处空白处理

在liux中部署到docker或者服务器端时可能会出现中文乱码或者图片到处一篇空白的情况,这是由于系统缺乏一定的字体,只需要将字体导入即可。
解决中文乱码: https://blog.csdn.net/neulily2005/article/details/106003527/

四、利用多线程pdfbox提高效率

@Test
    public void test07() {
        int threadNum = Runtime.getRuntime().availableProcessors();
        ThreadPoolExecutor pool =
                new ThreadPoolExecutor(threadNum, threadNum * 2, 3, TimeUnit.SECONDS, new ArrayBlockingQueue<>(3));
        String filePath = "/home/kv/IdeaProjects/MarkVeriousTests2/PdfBoxToImages/src/main/resources";
        String fileName = "ijms20010146";
        long start = System.currentTimeMillis();
        try {
            PDDocument doc = PDDocument.load(new File(filePath + "/" + fileName + ".pdf"));
            int pageCount = doc.getNumberOfPages();
            if (pageCount < threadNum) {
                VeriousTest.pdf2png(filePath, fileName, 0, pageCount);
            } else {
                CountDownLatch count = new CountDownLatch(threadNum);
                int page = pageCount / threadNum;
                for (int i = 0; i < threadNum; i++) {
                    int finalI = i;
                    if (finalI == threadNum - 1) {
                        pool.execute(() -> {
                            VeriousTest.pdf2png(filePath, fileName, finalI * page+1, pageCount);
                            count.countDown();
                        });
                    }
                    pool.execute(() -> {
                        VeriousTest.pdf2png(filePath, fileName, finalI * page, (finalI + 1) * page);
                        count.countDown();
                    });
                }
                count.await();
            }
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        } finally {
            pool.shutdown();
        }
        long end = System.currentTimeMillis();
        System.out.println((end - start) / 1000);
    }
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值