Java SpringBoot实现PDF转图片

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

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

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

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

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

好了,直接上代码:

先在pom.xml导入依赖:

		<!--   pdf读取     -->
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.1</version>
        </dependency>

        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>fontbox</artifactId>
            <version>2.0.1</version>
        </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;
    }
  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Boot是一个用于创建独立的、基于生产级别的Spring应用程序的框架。它提供了许多开箱即用的功能和便利,其中包括将HTML换为PDF的功能。 要实现HTMLPDF,可以使用Spring Boot结合一些第三方库来完成。以下是一种常见的实现方式: 1. 首先,需要在Spring Boot项目的pom.xml文件中添加相关依赖。可以使用一些开源的Java库,如Flying Saucer、iText等。例如,可以添加以下依赖: ```xml <dependency> <groupId>org.xhtmlrenderer</groupId> <artifactId>flying-saucer-pdf</artifactId> <version>9.1.20</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.13</version> </dependency> ``` 2. 创建一个Controller类,用于接收HTML内容并将其换为PDF。可以使用`@RestController`注解来标识该类为一个控制器,并使用`@PostMapping`注解来处理POST请求。 ```java @RestController public class HtmlToPdfController { @PostMapping("/convert") public ResponseEntity<byte[]> convertHtmlToPdf(@RequestBody String htmlContent) throws Exception { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ITextRenderer renderer = new ITextRenderer(); renderer.setDocumentFromString(htmlContent); renderer.layout(); renderer.createPDF(outputStream); byte[] pdfBytes = outputStream.toByteArray(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_PDF); headers.setContentDispositionFormData("attachment", "converted.pdf"); return new ResponseEntity<>(pdfBytes, headers, HttpStatus.OK); } } ``` 3. 在应用程序的配置文件(如application.properties或application.yml)中,配置服务器端口等相关信息。 4. 启动Spring Boot应用程序,并发送POST请求到`/convert`接口,将HTML内容作为请求体发送。服务器将会将HTML换为PDF,并返回生成的PDF文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TandK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值