java(springboot)实现将一个pdf按页码转成多张图片

以下是一个将 PDF 转换成 JPG 格式图片的 Spring Boot 接口代码:

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.springframework.http.MediaType;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Base64;
import java.util.concurrent.CompletableFuture;

@Controller
public class PdfToJpgController {

    @PostMapping(value = "/pdf-to-jpg", produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
    public CompletableFuture<String> pdfToJpg(@RequestBody MultipartFile pdfFile) throws IOException {
        PDDocument document = PDDocument.load(pdfFile.getInputStream());
        int pageCount = document.getNumberOfPages();
        return CompletableFuture.supplyAsync(() -> {
            StringBuilder resultBuilder = new StringBuilder("{\"pages\":[");
            for (int pageIndex = 0; pageIndex < pageCount; pageIndex++) {
                try {
                    PDFRenderer pdfRenderer = new PDFRenderer(document);
                    BufferedImage image = pdfRenderer.renderImageWithDPI(pageIndex, 300);
                    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                    ImageIO.write(image, "jpg", outputStream);
                    String encodedImage = Base64.getEncoder().encodeToString(outputStream.toByteArray());
                    resultBuilder.append("{\"image\":\"").append(encodedImage).append("\"}");
                    if (pageIndex < pageCount - 1) {
                        resultBuilder.append(",");
                    }
                } catch (IOException e) {
                    // handle exception
                }
            }
            resultBuilder.append("]}");
            return resultBuilder.toString();
        });
    }

}

这个接口接收一个 PDF 文件,并将其转换成 JPG 格式的图片返回。注意导入以下依赖:org.apache.pdfbox:pdfboxjavax.xml.bind:jaxb-apicom.sun.xml.bind:jaxb-corecom.sun.xml.bind:jaxb-impl

方法介绍

`renderImageWithDPI` 是 PDFBox 库中的一个方法,用于将 PDF 文件中的指定页渲染成一个 `BufferedImage` 对象,并返回该对象。

这个方法包含两个参数:

- pageIndex:表示要渲染的 PDF 页码,从0开始计数。
- dpi:表示输出图片的分辨率,即每英寸像素数。

在上面的示例代码中,我们调用了 `renderImageWithDPI(0, 300)` 方法来将第一页转换为一个分辨率为 300 DPI 的 `BufferedImage` 对象。

posted @ 2023-06-09 14:15  夏威夷8080  阅读(383)  评论(0编辑  收藏  举报