pdf转单张或多张图片

package wuxu.test;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

import javax.imageio.ImageIO;

import org.apache.commons.io.FileUtils;
import org.apache.pdfbox.Loader;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.apache.pdfbox.tools.imageio.ImageIOUtil;

/**
 * pdf 工具类
 *
 * @author AnJia
 * @since 2021-09-09 16:05
 */
public class Pdf3Png2 {

    public static void main(String [] args) throws IOException{
        // pdf转换成单张图片
        convertPdf2Image("D:\\1234\\123.pdf", "D:\\", "sample.png");
        // pdf转换成多张
        //convertPdf2Images("https://file-examples-com.github.io/uploads/2017/10/file-sample_150kB.pdf", System.getProperty("java.io.tmpdir") + "anjia", "sample.png");
    }

    /**
     * 将pdf转成一张图片,如果要输出的文件已经存在,则不会进行转换
     *
     * @param url      pdf url
     * @param fileName 文件名带png后缀,例如 xxxx.png
     * @param dir      存放文件夹,如果不存在会自动创建
     * @return 文件,如果报错,则会返回null
     * @throws IOException 文件下载失败
     */
    public static File convertPdf2Image(String url, String dir, String fileName) throws IOException {
       /* File pdfFile = new File(new File(dir).getAbsolutePath() + File.separator + fileName + ".pdf");
        pdfFile.getParentFile().mkdirs();
        FileUtils.copyURLToFile(new URL(url), pdfFile);*/
        File pdfFile = new File(url);
        return convertPdf2Image(pdfFile, dir, fileName);
    }

    /**
     * 将pdf转成一张图片,如果要输出的文件已经存在,则不会进行转换
     *
     * @param pdfFile  pdf 文件
     * @param fileName 文件名带png后缀,例如 xxxx.png
     * @param dir      存放文件夹,如果不存在会自动创建
     * @return 文件,如果报错,则会返回null
     */
    public static File convertPdf2Image(File pdfFile, String dir, String fileName) {
        File pngFile = new File(new File(dir).getAbsolutePath() + File.separator + fileName);
        if (pngFile.exists()) {
            return pngFile;
        }
        try (final PDDocument document = Loader.loadPDF(pdfFile)) {
            PDFRenderer pdfRenderer = new PDFRenderer(document);
            // 不知道图片的宽和高,所以先定义个null
            BufferedImage pdfImage = null;
            // pdf有多少页
            int pageSize = document.getNumberOfPages();
            int y = 0;
            for (int i = 0; i < pageSize; ++i) {
                // 每页pdf内容
                BufferedImage bim = pdfRenderer.renderImageWithDPI(i, 180, ImageType.RGB);
                // 如果是第一页需要初始化 BufferedImage
                if (Objects.isNull(pdfImage)) {
                    System.out.print(bim.getWidth());
                    // 假设每页一样宽,一样高,高度就是每页高度*总页数
                    pdfImage = new BufferedImage(bim.getWidth(),
                        bim.getHeight() * pageSize, BufferedImage.TYPE_INT_ARGB);
                }
                // 将每页pdf画到总的pdfImage上,x坐标=0,y坐标=之前所有页的高度和
                pdfImage.getGraphics().drawImage(bim, 0, y, null);
                y += bim.getHeight();
            }

            assert pdfImage != null;
            ImageIO.write(pdfImage, "png", pngFile);
            return pngFile;
        } catch (Exception ex) {
            //log.error("pdf转换png失败", ex);
            System.out.print("失败" + ex + "meaage:" + ex.getMessage());
        }
        return null;
    }

    /**
     * 将pdf转换成多张图片(1页pdf转换成1张图片),如果要输出的图片已经存在,则不会进行转换
     *
     * @param url          pdf url
     * @param dir          存放目录
     * @param baseFileName pdf文件名
     * @return 如果转换成功会返回 图片文件list,如果失败会返回null
     * @throws IOException 下载文件失败
     */
    public static List<File> convertPdf2Images(String url, String dir, String baseFileName) throws IOException {
        File pdfFile = new File(dir + File.separator + baseFileName + ".pdf");
        pdfFile.getParentFile().mkdirs();
        FileUtils.copyURLToFile(new URL(url), pdfFile);
        return convertPdf2Images(pdfFile, dir, baseFileName);
    }

    /**
     * 将pdf转换成多张图片(1页pdf转换成1张图片),如果要输出的图片已经存在,则不会进行转换
     *
     * @param pdfFile      pdf 文件
     * @param dir          存放目录
     * @param baseFileName pdf文件名
     * @return 如果转换成功会返回 图片文件list,如果失败会返回null
     */
    public static List<File> convertPdf2Images(File pdfFile, String dir, String baseFileName) {
        List<File> images = null;
        File directory = new File(dir);
        directory.mkdirs();
        try (final PDDocument document = Loader.loadPDF(pdfFile)) {
            PDFRenderer pdfRenderer = new PDFRenderer(document);
            // pdf有多少页
            int pageSize = document.getNumberOfPages();
            images = new ArrayList<>(pageSize);
            File pageFile;
            for (int i = 0; i < pageSize; ++i) {
                pageFile = new File(String.format("%s%s%s-%s.png", directory.getAbsolutePath(), File.separator, baseFileName, i));
                if (pageFile.exists()) {
                    continue;
                }
                BufferedImage bim = pdfRenderer.renderImageWithDPI(i, 300, ImageType.RGB);
                ImageIOUtil.writeImage(bim, pageFile.getAbsolutePath(), 300);
                images.add(pageFile);
            }
        } catch (Exception ex) {
            //log.error("pdf转换png失败", ex);
            System.out.print("失败" + ex);
        }
        return images;

    }
}

 

posted @ 2024-03-25 11:55  愚蠢的程序员  阅读(17)  评论(0编辑  收藏  举报