Java将本地PDF文件每一页转为png格式

pom引入依赖

<dependency>
   <groupId>org.apache.pdfbox</groupId>
   <artifactId>pdfbox</artifactId>
   <version>2.0.4</version>
</dependency>

创建工具类

package com.sage.common.utils.file;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;

import com.sage.common.utils.StringUtils;
import com.sage.common.utils.uuid.Seq;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;

/**
 * 描述: .
 *
 * @author fucc
 * @version 2023.09.24 2023/9/24 1:19
 */
public class PdfUtils {

    /**
     * 描述 根据文件url转为 文件(图片、pdf)
     *
     * @param fileUrl :文件url
     * @return java.io.File
     * @author fucc
     * @version 1.0.0 2023/9/24 1:22
     * @since 1.0.0
     */
    public static File fileUrlToFile(String fileUrl) {
        File file = null;
        String fileName = fileUrl.substring(fileUrl.lastIndexOf("."));
        URL urlfile;
        InputStream inputStream = null;
        OutputStream outputStream= null;
        try {
            file = File.createTempFile("pdf", fileName);
            //下载
            String filename = com.sage.common.utils.StringUtils.substring(fileUrl, fileUrl.lastIndexOf("/") + 1);
            filename = filename.replaceAll(" ", "%20");
            String encode = URLEncoder.encode(filename);
            String filepath = com.sage.common.utils.StringUtils.substring(fileUrl, 0,fileUrl.lastIndexOf("/") + 1);
            urlfile = new URL(filepath + encode);
            inputStream = urlfile.openStream();
            outputStream= new FileOutputStream(file);

            int bytesRead = 0;
            byte[] buffer = new byte[8192];
            while ((bytesRead = inputStream.read(buffer, 0, 8192)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if (null != outputStream) {
                    outputStream.close();
                }
                if (null != inputStream) {
                    inputStream.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return file;
    }

    /**
     * 描述  将PDF的每一页转换为png格式的图片文件.
     *
     * @param file :
     * @return java.util.List<java.io.File>
     * @author fucc
     * @since 1.0.0
     */
    public static List<File> pdfToPngImage(File file, String pdfImagePath) throws IOException {
        List<File> fileList = new ArrayList<>();
        // 打开要转换的 PDF 文件
        PDDocument document = PDDocument.load(file);
        // 创建 PDFRenderer 对象
        PDFRenderer renderer = new PDFRenderer(document);
        // 获取PDF的总页数
        int size = document.getNumberOfPages();
        for (int i = 0; i < size; i++) {
            // 将 PDF 中的第一页转换为 BufferedImage 对象
            // scale参数值越大,图片越清晰,相对应的速度越慢,转换后图片的越大
            BufferedImage image = renderer.renderImage(i, 3, ImageType.RGB);
            String filename = extractFilename();
            File pngImageFile = new File(pdfImagePath + filename);
            // 将 BufferedImage 对象保存为 PNG 图片
            ImageIO.write(image, "png", pngImageFile);
            fileList.add(pngImageFile);
        }
        // 关闭文档
        document.close();
        return fileList;
    }

    public static final String extractFilename() {
        return StringUtils.format("{}.png", Seq.getId(Seq.uploadSeqType));
    }

    public static void main(String[] args) {
        String url = "pdf文件url地址";
        try {
            File pdfFile = PdfUtils.fileUrlToFile(url);
            List<File> fileList = PdfUtils.pdfToPngImage(pdfFile, "PDF转换后的图片保存地址");
            System.out.println("PDF每页转图片完成");
            pdfFile.delete();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值