在某些情况下,我们常常需要将PDF格式的文件转为图片格式,如PNG,这时候使用pdfbox就很容易实现这一功能。

以下代码主要是使用了pdfbox这个第三方库,关于PDF转为图片,网页上有很多免费的网站,但是这些网站往往都需要上传文件,有泄漏文件内容的风险,WPS内部也有PDF转图片的选项,但是需要付费才能使用,因此使用下面的代码,实现PDF的无损转换。

其实对于PDF文件,如果对转换后的图片没有太高的质量要求,完全可以使用截图软件进行截图

1. Gradle引入依赖

//PDF box
implementation 'org.apache.pdfbox:pdfbox:2.0.25'

2. 实现代码

package com.flywinter;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import javax.imageio.ImageIO;
import java.io.File;
import java.io.IOException;

/**
 * Created by IntelliJ IDEA
 * User:Zhang Xingkun
 * Date:2022/4/15 17:58
 * Description:
 */
public class PdfToImage {
    public static void main(String[] args) throws IOException {
        final var filePath = "E:\\study\\Code\\Demo\\water-heat-pipe-pressure-loss-2.pdf";
        convertToPNG(filePath);
    }

    private static void convertToPNG(String filePath) throws IOException {
        final var targetFile = new File(filePath);
        final var imageType = "png";
        try (final var document = PDDocument.load(targetFile);
        ) {
            final var renderer = new PDFRenderer(document);
            final var pageSize = document.getNumberOfPages();
            for (int i = 0; i < pageSize; i++) {
                final var image = renderer.renderImage(i);
                final File outputPath = getOutputPath(targetFile, imageType, i + 1);
                ImageIO.write(image, imageType, outputPath);
            }
        }
    }

    private static File getOutputPath(File file, String imageType, int page) {
        final var fullName = file.getName();
        final var preName = new StringBuilder(fullName).substring(0, fullName.length() - 4);
        final var parentPath = file.getParent();
        return new File("%s%s%s_%d.%s".formatted(parentPath, File.separator, preName, page, imageType));
    }

}

关于上述代码,filePath为pdf文件的路径,运行该程序后,将会将PDF的每一页都转为原文件名_页码.png的格式,并存放在同级目录下。

上述代码只能转换一个pdf文件,可以根据自己需要进行修改,比如批量转换等