Java pdf转图片

这篇具有很好参考价值的文章主要介绍了Java pdf转图片。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.28</version>
        </dependency>
        <dependency>
    		<groupId>cn.hutool</groupId>
  		    <artifactId>hutool-all</artifactId>
 		    <version>5.8.16</version>
		</dependency>
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
import java.util.Objects;

/**
 * pdf转图片/图片Base64工具类
 */
@Slf4j
public class Pdf2ImageUtil {

    /**
     * pdf文件转换成jpg图片字节数组
     *
     * @param pdfBytes 要转换的pdf文件的字节数组
     */
    private static byte[] pdf2Image(byte[] pdfBytes) throws IOException {
        PDDocument doc = null;
        ByteArrayOutputStream baos = null;
        try {
            doc = PDDocument.load(pdfBytes);
            int pageCount = doc.getNumberOfPages();
            log.info("PDF转图片流,总页数:{}", pageCount);
            PDFRenderer pdfRenderer = new PDFRenderer(doc);
            // 不知道图片的宽和高,所以先定义个null
            BufferedImage pdfImage = null;
            // pdf有多少页
            int y = 0;
            List<BufferedImage> list = new ArrayList<>(pageCount);
            // 所有页高度综合
            int totalHeight = 0;
            if (pageCount > 0) {
                for (int i = 0; i < pageCount; i++) {
                    // 每页pdf内容 注意:图片设置100dpi, 设置太高容易OOM并且转不了几页
                    BufferedImage bim = pdfRenderer.renderImageWithDPI(i, 100, ImageType.RGB);
                    totalHeight += bim.getHeight();
                    list.add(bim);
                }
            }
            for (BufferedImage bim : list) {
                // 如果是第一页需要初始化 BufferedImage
                if (Objects.isNull(pdfImage)) {
                    // 创建一个总高、总宽 的图片缓冲区
                    pdfImage = new BufferedImage(bim.getWidth(), totalHeight, BufferedImage.TYPE_INT_RGB);
                }
                // 将每页pdf画到总的pdfImage上,x坐标=0,y坐标=之前所有页的高度和,属于向下偏移
                pdfImage.getGraphics().drawImage(bim, 0, y, null);
                y += bim.getHeight();
            }
            if (pdfImage != null) {
                baos = new ByteArrayOutputStream();
                ImageIO.write(pdfImage, "jpg", baos);
                baos.flush();
                byte[] imageInByte = baos.toByteArray();
                log.info("PDF转图片流成功");
                return imageInByte;
            }
            return null;
        } catch (Exception e) {
            log.error("PDF转图片流失败:{}", e.getMessage());
            e.printStackTrace();
        } finally {
            if (ObjectUtil.isNotNull(baos)) {
                baos.close();
            }
            if (ObjectUtil.isNotNull(doc)) {
                doc.close();
            }
        }
        return null;
    }

    /**
     * pdf转图片Base64编码
     *
     * @param filePath pdf路径
     * @return 图片Base64编码
     * @throws IOException IO异常
     */
    public static String image2Base64(String filePath) throws IOException {
    	// 获取云存储图片链接的字节
        byte[] pdfBytes = HttpUtil.createGet(filePath).execute().bodyBytes();
        // 获取本地图片的字节, 方便本地测试
//        byte[] pdfBytes = Files.readAllBytes(Paths.get(filePath));
        byte[] imageBytes = Pdf2ImageUtil.pdf2Image(pdfBytes);
        return getFileContentAsBase64Urlencoded(imageBytes);
    }

    /**
     * 获取文件base64编码
     *
     * @param imageBytes 图片字节数组
     * @return base64编码信息,不带文件头
     */
    private static String getFileContentAsBase64(byte[] imageBytes) {
        return Base64.getEncoder().encodeToString(imageBytes);
    }

    /**
     * 获取文件base64 UrlEncode编码
     *
     * @param imageBytes 图片字节数组
     * @return base64编码信息,不带文件头
     * @throws IOException IO异常
     */
    private static String getFileContentAsBase64Urlencoded(byte[] imageBytes) throws IOException {
        return URLEncoder.encode(getFileContentAsBase64(imageBytes), "utf-8");
    }
}

文章来源地址https://www.toymoban.com/news/detail-524487.html

到了这里,关于Java pdf转图片的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java Word转PDF(直接转和以图片形式转)、PDF转图片、图片转PDF

    在淘宝上找了一家写代码的店铺写了一个工具类,再参考网上的代码,改了改 用到的类库: 工具类代码:

    2024年02月12日
    浏览(41)
  • java中预览pdf或者图片

       

    2024年02月12日
    浏览(42)
  • JAVA 实现PDF转图片格式

    依赖: pdf存放路径 正文开始: pdf转换多张图片、长图 展示效果: 附加:小程序预览wxml代码

    2024年02月06日
    浏览(42)
  • pdf转图片【java版实现】

    引入需要导入到项目中的依赖,如下所示: pdf转图片的工具类如下所示,直接拷贝到项目即可 执行工具类中的main方法就行,会将pdf文件转换成多张图片到同级目录中。

    2024年02月13日
    浏览(40)
  • 【生成PDF】【JAVA】纯后台生成Echarts图片,并将图片生成到PDF文档

    目录 前言 一、如何后台生成Echarts图片? 1.PhantomJS 2.PhantomJS的下载  3.用phantomjs调用echarts-converts.js生成图片 二、Java如何将Echarts图生成到PDF 1.生成PDF依赖 2.Java代码测试例子:  3.测试结果   三、下载生成的PDF ReportFormUtil 提示:本文仅用于记录日常,多有不足,仅供参考。

    2024年02月09日
    浏览(45)
  • java读取图片、PDF中图片上的文字

    提示:本文是基于tess4j 总是有一些与众不同的需求在等着研发人员去探索,本文介绍如何通过java读取图片上的文字。 说tess4j之前,先说说Tesseract,因为tess4j是基于它的封装。 Tesseract的OCR引擎最先由HP实验室于1985年开始研发,至1995年时已经成为OCR业内最准确的三款识别引擎之

    2024年02月09日
    浏览(64)
  • java实现向PDF中插入图片

    目录 一、场景 二、案例结果 三、环境准备 四、引入的第三方jar包坐标 五、思路 六、单元测试代码 七、总结         现有一个PDF文件、需向PDF中插入图片              1、  maven3.8.6、jdk17              2、PDF文件和一张图片                 1、得到PDF文件流对象【

    2024年02月06日
    浏览(73)
  • JAVA 实现PDF转图片(spire.pdf.free版)

    1. 引入 jar 包 导入方法1: 手动引入。将Free Spire.PDF for Java下载到本地,解压,找到lib文件夹下的Spire.PDF.jar文件。在IDEA中打开如下界面,将本地路径中的jar文件引入Java程序:  导入方法2:如果您想通过 Maven安装,则可以在 pom.xml 文件中添加以下代码导入 JAR 文件。 1 2 3 4 5

    2024年02月05日
    浏览(39)
  • JAVA 实现PDF转图片(pdfbox版)

    依赖: pdf存放路径 正文开始: pdf转换多张图片、长图 展示效果: 附加:小程序预览wxml代码 依赖: pdf存放路径 正文开始: pdf转换多张图片、长图

    2024年02月06日
    浏览(55)
  • Java使用pdfbox将pdf转图片

    目前比较主流的两种转pdf的方式,就是pdfbox和icepdf,两种我都尝试了下,icepdf解析出来有时候会出现中文显示不出来,网上的解决方式又特别麻烦,不是安装字体,就是重写底层类,所以我选择了pdfbox 在windows上好好的,x86_64的linux上也好好的,就是arm架构的linux上会出现 网上

    2024年02月10日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包