PDF转PNG

maven依赖

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

PDF2png 工具类

package cn.datang.pdf;

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

import javax.imageio.ImageIO;

import com.idrsolutions.image.png.PngCompressor;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;

import cn.hutool.core.img.ImgUtil;

public class PDF2png {
    private static Logger logger = LogManager.getLogger(PDF2png.class);

    // 可自由确定起始页和终止页
    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 + "\\" + filename + "_" + (i + 1) + ".png"));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 转换全部的pdf
    public static boolean pdf2png(String fileAddress, String filename, String source) {
        File file = null;

        if ("file".equals(source)) {
            file = new File(fileAddress + "\\" + filename);
        } else if ("url".equals(source)) {
            file = new File(fileAddress);
        }
        // 将pdf装图片 并且自定义图片得格式大小
        if (!file.exists()) {

//            logger.error("转换png时源文件不存在:{}", file.getAbsolutePath());
            return false;
        }
        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, 144); // Windows
                // native
                // DPI
                // BufferedImage srcImage = resize(image, 240, 240);//产生缩略图
                //ImageIO.write(image, "PNG", new File(fileAddress + "\\" + filename + "_" + (i + 1) + ".png"));

                if ("file".equals(source)) {
                    ImageIO.write(image, "PNG", new File(fileAddress + "\\" + filename + "_" + (i + 1) + ".png"));
//                    logger.info("转换PDF第{}页为图片{}", i + 1, fileAddress + "\\" + filename + "_" + (i + 1) + ".png");
                } else if ("url".equals(source)) {
                    filename = fileAddress.substring(0, fileAddress.lastIndexOf("."));
                    ImageIO.write(image, "PNG", new File(filename + "_" + (i + 1) + ".png"));
//                    logger.info("转换PDF第{}页为图片{}", i + 1, filename + "_" + (i + 1) + ".png");
                }
            }
            doc.close();
//            logger.info("删除源文件{},{}", file.getAbsolutePath(), file.delete());
            return true;
        } catch (IOException e) {
            logger.error("转换png时源文件异常:" + file.getAbsolutePath(), e);
            return false;
        }
    }

    public static boolean pdf2png(File pdfFile) {
        // 将pdf装图片 并且自定义图片得格式大小
        if (!pdfFile.exists()) {
//            logger.error("转换png时源文件不存在:{}", pdfFile.getAbsolutePath());
            return false;
        }
        try {
            PDDocument doc = PDDocument.load(pdfFile);
            PDFRenderer renderer = new PDFRenderer(doc);
            int pageCount = doc.getNumberOfPages();
            for (int i = 0; i < pageCount; i++) {
                BufferedImage image = renderer.renderImageWithDPI(i, 144); // Windows
                String fileAddress = pdfFile.getAbsolutePath();
                ImageIO.write(image, "PNG", new File(fileAddress + "_" + (i + 1) + ".png"));
//                logger.info("转换PDF第{}页为图片{}", i + 1, fileAddress + "_" + (i + 1) + ".png");
            }
            doc.close();
//            logger.info("删除源文件{},{}", pdfFile.getAbsolutePath(), pdfFile.delete());
            return true;
        } catch (IOException e) {
            logger.error("转换png时源文件异常:" + pdfFile.getAbsolutePath(), e);
            return false;
        }
    }

    public static List<String> pdf2png(String fileAddress) throws IOException {
        List<String> pngList = new ArrayList<String>();
        File file = new File(fileAddress);
        // 将pdf装图片 并且自定义图片得格式大小
        if (!file.exists()) {

//            logger.error("转换png时源文件不存在:{}", file.getAbsolutePath());
            return pngList;
        }
        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, 144); // Windows

                ImageIO.write(image, "PNG", new File(fileAddress + "_" + (i + 1) + ".png"));
//                logger.info("转换PDF第{}页为图片{}", i + 1, fileAddress + "_" + (i + 1) + ".png");
                pngList.add(fileAddress + "_" + (i + 1) + ".png");
            }
            doc.close();
//            logger.info("删除源文件{},{}", file.getAbsolutePath(), file.delete());
            return pngList;
        } catch (IOException e) {
            logger.error("转换png时源文件异常:" + file.getAbsolutePath(), e);
            throw e;
        }
    }

    public static List<String> pdf2png(String fileAddress, String filename) {
        List<String> pngList = new ArrayList<String>();
        File file = new File(fileAddress + "/" + filename);
        // 将pdf装图片 并且自定义图片得格式大小
        if (!file.exists()) {

//            logger.error("转换png时源文件不存在:{}", file.getAbsolutePath());
            return pngList;
        }
        try {
            PDDocument doc = PDDocument.load(file);
            PDFRenderer renderer = new PDFRenderer(doc);
            int pageCount = doc.getNumberOfPages();
            if (pageCount > 7) {
                logger.info("pic more then 7");
                return null;
            }
            String filePath;
            for (int i = 0; i < pageCount; i++) {
                filePath = fileAddress + "/" + filename + "_" + (i + 1) + ".png";
                BufferedImage image = renderer.renderImageWithDPI(i, 144); // Windows

                ImageIO.write(image, "PNG", new File(filePath));
//                logger.info("转换PDF第{}页为图片{}", i + 1, filePath);
                pngList.add(filePath);
            }
            doc.close();
//            logger.info("删除源文件{},{}", file.getAbsolutePath(), file.delete());
            return pngList;
        } catch (IOException e) {
            logger.error("转换png时源文件异常:" + file.getAbsolutePath(), e);
            return pngList;
        }
    }

    public static boolean pdf2png(File file, File pngFile) {
        // 将pdf装图片 并且自定义图片得格式大小
        if (!file.exists()) {
//			logger.error("转换png时源文件不存在:{}", file.getAbsolutePath());
            return false;
        }
        try {
            PDDocument doc = PDDocument.load(file);
            PDFRenderer renderer = new PDFRenderer(doc);
            int pageCount = doc.getNumberOfPages();

            if (pageCount > 1) {
                String path = file.getAbsolutePath();
                List<File> fileList = new ArrayList<File>(pageCount);
                long fileLength = 0;
                for (int i = 0; i < pageCount; i++) {
                    BufferedImage image = renderer.renderImageWithDPI(i, 144); // Windows
                    File newFile = new File(path + "_" + (i + 1) + ".png");
                    ImageIO.write(image, "PNG", newFile);
//					logger.info("len={},转换PDF第{}页为图片{}", pageCount, i + 1, newFile.getAbsolutePath());
                    fileList.add(newFile);
                    fileLength += newFile.length();
                }

                // 如果大于1.8M,则只使用第一页的图片
				/*if(fileLength > (1024*1024*1.8))
				{
					fileList.get(0).renameTo(pngFile);
//					logger.info("大于1.8M,则只使用第一页的图片,length:{}", fileLength);
					fileList.remove(0);
					for(File sonFile : fileList)
						sonFile.delete();
				}
				else
				{*/
                mergeImage(pngFile, fileList);
//					logger.info("图片合并:{}", pngFile.getAbsolutePath());
//				}
            } else {
                BufferedImage image = renderer.renderImageWithDPI(0, 144);
                ImageIO.write(image, "PNG", pngFile);
//				logger.info("len={},转换PDF第1页为图片{}", pageCount, pngFile.getAbsolutePath());
            }

            doc.close();
//			logger.info("删除源文件{},{}", file.getAbsolutePath(), file.delete());
            return true;
        } catch (IOException e) {
            logger.error("转换png时源文件异常:" + file.getAbsolutePath(), e);
            return false;
        }
    }

    public static void mergeImage(File targetFile, List<File> tempImgFileList) {
        BufferedImage targetImg = null;
        try {
            targetImg = mergeImage(false, tempImgFileList);
            if (targetImg != null)
                ImgUtil.write(targetImg, targetFile);
//			logger.info("图片合并:{}", targetFile.getAbsolutePath());
        } catch (IOException e) {
            logger.error("图片合并异常", e);
            targetFile.delete();
        } finally {
            for (File file : tempImgFileList)
                file.delete();
        }
    }

    public static BufferedImage mergeImage(boolean isHorizontal, List<File> imgFileList) throws IOException {
        if (imgFileList == null || imgFileList.size() < 1) {
            logger.warn("图片list长度为0");
            return null;
        }
        List<BufferedImage> bufferedImageList = new ArrayList<>();
        for (File file : imgFileList)
            bufferedImageList.add(ImgUtil.read(file));
        BufferedImage destImage = null;
        int sumW = 0, sumH = 0, maxW = 0, maxH = 0;
        for (int i = 0; i < bufferedImageList.size(); i++) {
            BufferedImage img = bufferedImageList.get(i);
            sumW += img.getWidth();
            sumH += img.getHeight();
            if (img.getWidth() > maxW)
                maxW = img.getWidth();
            if (img.getHeight() > maxH)
                maxH = img.getHeight();
        }
        if (isHorizontal) {
            destImage = new BufferedImage(sumW, maxH, BufferedImage.TYPE_INT_RGB);
        } else {
            destImage = new BufferedImage(maxW, sumH, BufferedImage.TYPE_INT_RGB);
        }
        int wx = 0, wy = 0;
        for (int j = 0; j < bufferedImageList.size(); j++) {
            BufferedImage img = bufferedImageList.get(j);
            int w1 = img.getWidth();
            int h1 = img.getHeight();
            int[] ImageArrayOne = new int[w1 * h1];
            ImageArrayOne = img.getRGB(0, 0, w1, h1, ImageArrayOne, 0, w1);
            if (isHorizontal) {
                destImage.setRGB(wx, 0, w1, h1, ImageArrayOne, 0, w1);
            } else {
                destImage.setRGB(0, wy, w1, h1, ImageArrayOne, 0, w1);
            }
            wx += w1;
            wy += h1;
        }
        return destImage;
    }

    
}

新增main方法测试

public static void main(String[] args) throws IOException {
        //pdf2png("D:/", "hw.pdf");

        String pdfFile = "E:\\data\\项目\\11.pdf";
        String outpath = "E:\\data\\项目\\11.PNG";

        File f = new File(pdfFile);
        File f2 = new File(outpath);
        pdf2png(f, f2);

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值