Java代码如何使用pdfBox将pdf转换为图片--同时处理中文乱码的方法分享

乔欣 Java经验 发布时间:2023-03-06 10:12:59 阅读数:9556 1
下文笔者讲述pdf转换为图片的方法分享,如下所示

pdf转换的实现思路

1.引入相应依赖
2.借助工具类进行pdf转换为图片
1.引入依赖

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

2.pdf转图片工具类

package com.java265.service.common.util;
 
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
 
public class PdfToImage {
 
    private static final Logger logger = LoggerFactory.getLogger(PdfToImage.class);
 
    //经过测试,dpi为96,100,105,120,150,200中,105显示效果较为清晰,体积稳定,dpi越高图片体积越大,一般电脑显示分辨率为96
    public static final float DEFAULT_DPI = 105;
    //默认转换的图片格式为jpg
    public static final String DEFAULT_FORMAT = "jpg";
 
    /**
     * pdf转图片
     * @param pdfPath PDF路径
     * @return 图片路径
     */
    public static void pdfToImage(String pdfPath, String imgPath) {
        try {
                       
           System.setProperty("sun.java2d.cmm","sun.java2d.cmm.kcms.KcmsServiceProvider");
            //图像合并使用参数
            // 总宽度
            int width = 0;
            // 保存一张图片中的RGB数据
            int[] singleImgRGB;
            int shiftHeight = 0;
            //保存每张图片的像素值
            BufferedImage imageResult = null;
            //利用PdfBox生成图像
            PDDocument pdDocument = PDDocument.load(new File(pdfPath));
            PDFRenderer renderer = new PDFRenderer(pdDocument);
            //循环每个页码
            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();
                //计算高度和偏移量
                if (i == 0) {
                    //使用第一张图片宽度;
                    width = imageWidth;
                    //保存每页图片的像素值
                    imageResult = new BufferedImage(width, imageHeight * len, BufferedImage.TYPE_INT_RGB);
                } else {
                    // 计算偏移高度
                    shiftHeight += imageHeight;
                }
                singleImgRGB = image.getRGB(0, 0, width, imageHeight, null, 0, width);
                // 写入流中
                imageResult.setRGB(0, shiftHeight, width, imageHeight, singleImgRGB, 0, width);
            }
            pdDocument.close();
            // 写图片
            ImageIO.write(imageResult, DEFAULT_FORMAT, new File(imgPath));
        } catch (Exception e) {
            logger.error("PDF转图片失败");
            e.printStackTrace();
        }
    }
 
    public static void main(String[] args) {
		 pdfToImage("d://test.pdf","d://test.jpg");
    }
}
注意事项:
    由于操作系统未安装相应的字体,所以转换中文会出现乱码现象
	    我们可以通过安装相应的字体,避免中文乱码

windows安装字体---解决方法

缺少什么字体去搜索引擎搜索下载对应字体
   然后再windows里直接安装ttf/otf等格式结尾的文件即可
   或在系统目录下C:\Windows\Fonts,只需把字体文件拖进来便会提示安装

linux下安装字体

通常linux缺少的常用字体
  在windows目录下C:\Windows\Fonts都能找到对应的字体文件
  拷贝到linux上即可
  没有的字体去搜索下载都能找到

$cd /usr/share/fonts/   // 进入系统自带的字体目录
$mkdir myfonts  // myfonts 是你自己随便取得文件夹名字
#将字体文件拷贝到这个文件夹下
#在cd /usr/share/fonts/目录下执行以下命令
$mkfontscale   
$mkfontdir
$fc-cache -fv           //更新字体缓存
$source /etc/profile    // 执行以下命令让字体生效
$fc-list    // 查看系统中所有得字体,可用于测试是否安装字体成功 
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202303/16780697875965.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者