• 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;
        }
    
  • 相关阅读:
    springBoot组件注册
    rocketmq消息发送源码学习
    一文读懂HTML的头部内容,希望有所帮助
    无硬盘的版本 1099,14寸笔记本,而且无硬盘的,特别有有意思,可以自己购买个硬盘,安装linux系统或者windows。
    Android 特权应用 privapp-permissions 权限解读
    pytorch生成CAM热力图-单张图像
    【c语言】atoi的模拟实现
    OCR是什么意思,有哪些好用的OCR识别软件?
    SpringBoot-快速搭建并快速验证是否可用
    【es5】标准库
  • 原文地址:https://blog.csdn.net/qq_41180335/article/details/141091137