首页 > 编程语言 > 详细

java PDF转图片

时间:2021-05-12 14:33:30      阅读:23      评论:0      收藏:0      [点我收藏+]

1.所需jar包

<!--PDF转图片-->
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.20</version>
</dependency>

  如果需要改变字体的话,还需要加上这个:

<!-- https://mvnrepository.com/artifact/org.apache.pdfbox/fontbox -->
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>fontbox</artifactId>
    <version>2.0.9</version>
</dependency>

2.代码实现

  通过Apache的pdfbox实现

/*
 * PDF转图片
 * @attention: 将整个PDF文件转图片(所有页)
 * @date: 2021-05-12 10:46
 * @param: imgPath
 * 图片全路径
 * @param: imgNamePrefix
 * 图片名称前缀
 * @param: pdfBytes
 * PDF二进制流
 * @return: boolean
 */
public static boolean toImageFromBytes(String imgPath, String imgNamePrefix, byte[] pdfBytes) {
    return toImageFromBytes(imgPath, imgNamePrefix, pdfBytes, "png", 0, -1);
}

/*
 * PDF转图片
 * @attention: 支持自主选择起始页和结束页
 * @date: 2021-05-12 10:41
 * @param: imgPath
 * 图片全路径
 * @param: imgNamePrefix
 * 图片名称前缀
 * @param: pdfBytes
 * PDF二进制流
 * @param: imgType
 * 图片类型
 * @param: pageStartIndex
 * 开始页:开始转换的页码(第1页,页码为0)
 * @param: pageEndIndex
 * 结束页:结束转换的页码(最后1页,页码为-1)
 * @return: boolean
 * 只有PDF文件所有页数转换成功才返回true
 */
public static boolean toImageFromBytes(String imgPath, @NotNull String imgNamePrefix, byte[] pdfBytes, String imgType, int pageStartIndex, int pageEndIndex) {
    boolean isSuccess = false;

    // 图片名称处理(注意文件名里不要有点,否则一律视为后缀名被抹掉)
    if (imgNamePrefix.indexOf(".") > 0) imgNamePrefix = imgNamePrefix.substring(0, imgNamePrefix.indexOf(".") );

    // 添加路径分隔符
    if (!imgPath.endsWith("/") && !imgPath.endsWith("\\")) imgPath += File.separator;

    try {
        // 加载PDF
        PDDocument doc = PDDocument.load(pdfBytes);
        PDFRenderer renderer = new PDFRenderer(doc);
        // pdf总页数
        int pageCount = doc.getNumberOfPages();
        log.info("该pdf文件共有" + pageCount + "页");
        for (int i = 0; i < pageCount; i++) {
            // dpi越大转换后越清晰,但转换速度越慢
            BufferedImage image = renderer.renderImageWithDPI(i, 250); // Windows native DPI
            // BufferedImage srcImage = resize(image, 240, 240);//产生缩略图
            // 生成图片
            if (pageCount == 1)
                ImageIO.write(image, imgType, new File(imgPath + imgNamePrefix + "." + imgType));
            else
                ImageIO.write(image, imgType, new File(imgPath + imgNamePrefix + "_" + (i + 1) + "." + imgType));

            log.info("pdf第" + (i + 1) + "页转图片成功");
        }
        isSuccess = true;
    } catch (IOException e) {
        e.printStackTrace();
        log.error("pdf-->图片失败:" + e.getMessage());
    }

    log.info("pdf-->图片成功");
    return isSuccess;
}  

3.调用

toImageFromBytes("C:\\Users\\Marydon\\Desktop", "图片", Base64Utils.decodeToBytes(sb.toString()));  

  注意:

  我曾尝试直接将PDF数据强制输出到图片文件中,结果发现这样是行不通的(生成的图片文件无法打开)

  这,也就证明了PDF的数据流和图片的数据流,虽然都可以通过java转换成流,但两个本质还是不一样的。

技术分享图片

写在最后

  哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

 相关推荐:

 

java PDF转图片

原文:https://www.cnblogs.com/Marydon20170307/p/14759048.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!