• Java SpringBoot实现PDF转图片


    不是单页图片,是多页PDF转成一张图片的逻辑。

    我这里的场景是PDF转成图片之后返回给前端,前端再在图片上实现签字,并且可拖拽的逻辑,就是签订合同的场景。

    但是这里只写后端多页PDF转图片的逻辑。

    先说逻辑,后面直接上代码,大致分为以下几步:

    1. 读取PDF文件(我的代码里是将在线的URL转成InputStream了)
    2. 按PDF的页面循环计算图片的宽度和高度,其中宽度为PDF最宽的那一页的宽度(毕竟有的PDF比较骚,可能一页是横的,一页是竖的),高度为所有页面加起来的高度
    3. 用Graphics2D绘制
    4. 将Graphics2D的绘制结果输出为图片(只要有outputStream都好说,我这里是输出成base64给前端了,没什么存起来的必要)

    好了,直接上代码:

    先在pom.xml导入依赖:

    		
            <dependency>
                <groupId>org.apache.pdfboxgroupId>
                <artifactId>pdfboxartifactId>
                <version>2.0.1version>
            dependency>
    
            <dependency>
                <groupId>org.apache.pdfboxgroupId>
                <artifactId>fontboxartifactId>
                <version>2.0.1version>
            dependency>
    
    	public String getSinglePicBase64Contracts(String fileUrl) throws IOException {
            byte[] pdfBytes = HttpUtil.createGet(fileUrl).execute().bodyBytes();
            InputStream inputStream = new ByteArrayInputStream(pdfBytes);
            PDDocument doc = PDDocument.load(inputStream);
            PDFRenderer pdfRenderer = new PDFRenderer(doc);
            List<BufferedImage> imageList = new ArrayList<>(doc.getNumberOfPages());
            int maxWidth = 0;
            int totalHeight = 0;
            for (int i = 0; i < doc.getNumberOfPages(); i++) {
                BufferedImage image = pdfRenderer.renderImage(i, 1.25f);
                imageList.add(image);
                if (image.getWidth() > maxWidth) {
                    maxWidth = image.getWidth();
                }
                totalHeight += image.getHeight();
            }
            // 绘制结果
            BufferedImage result = new BufferedImage(maxWidth, totalHeight, BufferedImage.TYPE_INT_RGB);
            Graphics2D g2d = result.createGraphics();
            int nowHeight = 0;
            for (BufferedImage bufferedImage : imageList) {
            	// padding 为页面的左边距
                int padding = (maxWidth - bufferedImage.getWidth()) / 2;
                g2d.drawImage(bufferedImage, padding, nowHeight, null);
                nowHeight += bufferedImage.getHeight();
            }
            ByteArrayOutputStream outputStream =  new ByteArrayOutputStream();
            ImageIO.write(result, "png", outputStream);
            String singlePicBase64 = "data:image/png;base64," + Base64.encodeBase64String(outputStream.toByteArray());
            return singlePicBase64;
        }
    
  • 相关阅读:
    【数据结构】——单链表
    Docker入门
    【附源码】Python计算机毕业设计汽车4S店管理系统
    预处理器Less
    【智能优化算法-灰狼算法】基于狩猎 (DLH) 搜索策略的灰狼算法求解单目标优化问题附matlab代码
    pandas print输出格式设置
    前端vue,后端springboot。如何防止未登录的用户直接浏览器输入地址访问
    基于Ubuntu16.04的docker准备ZMQ的C++开发环境
    分享购颠覆传统模式,创新互联网商业模式
    LeetCode刷题系列 -- 678. 有效的括号字符串
  • 原文地址:https://blog.csdn.net/qq_41180335/article/details/141091137