PDF转换成图片(Java pdfbox实现 附中文乱码解决方案)

本文介绍了一种使用Java将PDF文件转换为图片的方法,通过Apache PDFBox库实现,并提供了详细的代码示例。支持多种输入方式,包括文件路径、File对象及输入流。

PDF转换成图片(Java pdfbox实现)

pdf转成图片在java中主流的做法就是pdfbox和icepdf
然而我选择pdfbox

废话不多说上代码

引入依赖

        <!--pdfbox-->
		<dependency>
			<groupId>org.apache.pdfbox</groupId>
			<artifactId>pdfbox</artifactId>
			<version>2.0.13</version>
		</dependency>

导出工具类

/**
 * pdf操作工具类
 * @author chao11.lei
 */
public class PdfUtils {


    //经过测试,dpi为96,100,105,120,150,200中,105显示效果较为清晰,体积稳定,dpi越高图片体积越大,一般电脑显示分辨率为96
    public static final float DEFAULT_DPI = 144;
    //默认转换的图片格式为jpg
    public static final String DEFAULT_FORMAT = "jpg";

    public final static Logger logger = LoggerFactory.getLogger(PdfUtils.class);

    private static final String PROPERTY_KEY = "sun.java2d.cmm";

    private static final String PROPERTY_VALUE = "sun.java2d.cmm.kcms.KcmsServiceProvider";


    /**
     * pdf转图片
     *
     * @param pdfPath PDF路径
     * @return 图片路径
     */
    public static void pdfToImage(String pdfPath, String imgPath) {
        try {
            logger.debug(">>处理开始");
            System.setProperty(PROPERTY_KEY, PROPERTY_VALUE);
            //图像合并使用参数
            // 总宽度
            int width = 0;
            // 保存一张图片中的RGB数据
            int[] singleImgRGB;
            int shiftHeight = 0;
            //保存每张图片的像素值
            BufferedImage imageResult = null;
            File pdfFile = new File(pdfPath);
            //利用PdfBox生成图像
            PDDocument pdDocument = PDDocument.load(pdfFile);
            PDFRenderer renderer = new PDFRenderer(pdDocument);
            //生成目录
            String fileRealName = pdfFile.getName().replace(".pdf","");
            File fileDir = new File(imgPath + "/" +fileRealName);
            if(!fileDir.exists()) {
                fileDir.mkdirs();
            }
            //循环每个页码
            for (int i = 0, len = pdDocument.getNumberOfPages(); i < len; i++) {
                BufferedImage image = renderer.renderImageWithDPI(i, DEFAULT_DPI, ImageType.RGB);
                int imageHeight = image.getHeight();
                int imageWidth = image.getWidth();
                //计算高度和偏移量
                //使用第一张图片宽度;
                width = imageWidth;
                //保存每页图片的像素值
                imageResult = new BufferedImage(width, imageHeight , BufferedImage.TYPE_INT_RGB);
                singleImgRGB = image.getRGB(0, 0, width, imageHeight, null, 0, width);
                // 写入流中
                imageResult.setRGB(0, shiftHeight, width, imageHeight, singleImgRGB, 0, width);
                // 写图片
                ImageIO.write(imageResult, DEFAULT_FORMAT, new File(imgPath  +fileRealName+"/" +fileRealName + "_" + (i +1)+ ".jpg"));
                if(i%10==0||i+1==len) {
                    logger.debug("处理进度:{}/{}", i + 1, len);
                }
            }
            pdDocument.close();
            logger.debug("处理结束>>");
        } catch (Exception e) {
            logger.error("PDF转图片失败:{}",e);
            e.printStackTrace();
        }
    }


    public static void pdfToImage(File pdfFile, String imgPath) {
        try {
            logger.debug(">>处理开始");
            System.setProperty(PROPERTY_KEY, PROPERTY_VALUE);
            //图像合并使用参数
            // 总宽度
            int width = 0;
            // 保存一张图片中的RGB数据
            int[] singleImgRGB;
            int shiftHeight = 0;
            //保存每张图片的像素值
            BufferedImage imageResult = null;
            //利用PdfBox生成图像
            PDDocument pdDocument = PDDocument.load(pdfFile);
            PDFRenderer renderer = new PDFRenderer(pdDocument);
            //生成目录
            String fileRealName = pdfFile.getName().replace(".pdf","");
            File fileDir = new File(imgPath + "/" +fileRealName);
            if(!fileDir.exists()) {
                fileDir.mkdirs();
            }
            //循环每个页码
            for (int i = 0, len = pdDocument.getNumberOfPages(); i < len; i++) {
                BufferedImage image = renderer.renderImageWithDPI(i, DEFAULT_DPI, ImageType.RGB);
                int imageHeight = image.getHeight();
                int imageWidth = image.getWidth();
                //计算高度和偏移量
                //使用第一张图片宽度;
                width = imageWidth;
                //保存每页图片的像素值
                imageResult = new BufferedImage(width, imageHeight , BufferedImage.TYPE_INT_RGB);
                singleImgRGB = image.getRGB(0, 0, width, imageHeight, null, 0, width);
                // 写入流中
                imageResult.setRGB(0, shiftHeight, width, imageHeight, singleImgRGB, 0, width);
                // 写图片
                ImageIO.write(imageResult, DEFAULT_FORMAT, new File(imgPath  +fileRealName+"/" +fileRealName + "_" + (i +1)+ ".jpg"));
                if(i%10==0||i+1==len) {
                    logger.debug("处理进度:{}/{}", i + 1, len);
                }
            }
            pdDocument.close();
            logger.debug("处理结束>>");
        } catch (Exception e) {
            logger.error("PDF转图片失败:{}",e);
            e.printStackTrace();
        }
    }

    public static void pdfToImage(InputStream pdfFileInputStream, String fileName,String imgPath) {
        try {
            logger.debug(">>处理开始");
            System.setProperty(PROPERTY_KEY, PROPERTY_VALUE);
            //图像合并使用参数
            // 总宽度
            int width = 0;
            // 保存一张图片中的RGB数据
            int[] singleImgRGB;
            int shiftHeight = 0;
            //保存每张图片的像素值
            BufferedImage imageResult = null;
            //利用PdfBox生成图像
            PDDocument pdDocument = PDDocument.load(pdfFileInputStream);
            PDFRenderer renderer = new PDFRenderer(pdDocument);
            //生成目录
            String fileRealName = fileName.replace(".pdf","");
            File fileDir = new File(imgPath + "/" +fileRealName);
            if(!fileDir.exists()) {
                fileDir.mkdirs();
            }
            //循环每个页码
            for (int i = 0, len = pdDocument.getNumberOfPages(); i < len; i++) {
                BufferedImage image = renderer.renderImageWithDPI(i, DEFAULT_DPI, ImageType.RGB);
                int imageHeight = image.getHeight();
                int imageWidth = image.getWidth();
                //计算高度和偏移量
                //使用第一张图片宽度;
                width = imageWidth;
                //保存每页图片的像素值
                imageResult = new BufferedImage(width, imageHeight , BufferedImage.TYPE_INT_RGB);
                singleImgRGB = image.getRGB(0, 0, width, imageHeight, null, 0, width);
                // 写入流中
                imageResult.setRGB(0, shiftHeight, width, imageHeight, singleImgRGB, 0, width);
                // 写图片
                ImageIO.write(imageResult, DEFAULT_FORMAT, new File(imgPath  +fileRealName+"/" +fileRealName + "_" + (i +1)+ ".jpg"));
               if(i%10==0||i+1==len) {
                   logger.debug("处理进度:{}/{}", i + 1, len);
               }
            }
            pdDocument.close();
            logger.debug("处理结束>>");
        } catch (Exception e) {
            logger.error("PDF转图片失败:{}",e);
            e.printStackTrace();
        }
    }
}

方法调试过很多次,绝对好用
支持多种方式转换

  • 路径文件
  • File文件对象
  • 输入流

测试


	@Test
	void testPdfToImg() {
		PdfUtils.pdfToImage("D:\\img\\test.pdf", "D:\\img\\");
	}

在这里插入图片描述

这里我发现在部分pc上不存在STsong-light字体且不存在可替换字体就会有警告,同时导出的文件就会乱码。
这里我也没找到STsong-light 字体,但是我找到可以替换的字体 AdobeFangsongStd-Regular

这是adobe的一款仿宋字体
下载链接,我就不放在下载专栏,骗大家的c币啦
http://yun.dlblog.club/f/8f02d1b05cf04dc682bb/

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值