base64格式超长pdf文件合并问题

引入依赖包

<!-- pom.xml -->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox-tools</artifactId>
<version>3.0.0-RC1</version>
</dependency>

Java后台

传入base64格式list

 public static byte[] mulFileToOneByList(JSONArray  list) throws Exception {
        PDFMergerUtility mergePdf = new PDFMergerUtility();
        ByteArrayOutputStream baos = null;
        for (int i = 0 ; i < list.size(); i++) {
            JSONObject data = list.getJSONObject(i);
            String base64String=JSONObject.toJSONString(data.get("data"));
            base64String=base64String.substring(1,base64String.length()-1).replaceAll("\\\\r\\\\n","").replaceAll("\\\\n","");
            ByteArrayInputStream bais = new ByteArrayInputStream(base64String.getBytes());
            mergePdf.addSource(Base64.getMimeDecoder().wrap(bais));

        }
        OutputStream outputStream = new ByteArrayOutputStream();
        // 指定目标文件输出流
        mergePdf.setDestinationStream(outputStream);
        //合并pdf
        /** MemoryUsageSetting.setupMainMemoryOnly() 这会将缓冲内存使用量设置为仅使用不受大小限制的主内存(无临时文件) setupMainMemoryOnly()
         * MemoryUsageSetting.setupTempFileOnly() 这将缓冲内存使用设置为仅使用不受大小限制的临时文件(无主内存)。
         * */
        mergePdf.mergeDocuments(MemoryUsageSetting.setupTempFileOnly());
        ByteArrayOutputStream mergerUtilityDestinationStream = (ByteArrayOutputStream) mergePdf.getDestinationStream();
        return mergerUtilityDestinationStream.toByteArray();
    }

报错:

java.io.IOException: Missing root object specification in trailer

在网上搜索很多例子,我这里的情况和网上的问题都不一样,我这里是从前端传到后台的base64格式数据默认加了\r\n 和 \n 导致的。

排除问题应该首先打印前后端的base64字符对比一下,如果长度不一样应该是有问题。

花了好长时间去网上查资料,(1、更换了包版本号2、修改了流的读取方式3、修改了setupTempFileOnly发现都不行)最后才比较字符串长度。

参考的文章:

解决:PDFBox报的java.io.IOException: Missing root object specification in trailer_拾年一剑的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将多页PDFbase64转换为图片base64,可以按照以下步骤进行操作: 1. 将PDFbase64编码字符串转换为byte数组。 2. 使用Java的PDFBox库将byte数组转换为PDF文档对象。 3. 遍历PDF文档的每一页,将每一页转换为BufferedImage对象。 4. 将每一页的BufferedImage对象转换为对应的图片base64编码字符串。 5. 将所有图片base64编码字符串拼接成一个字符串返回。 下面是一个示例代码,可以将多页PDFbase64转换为图片base64: ``` import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.rendering.PDFRenderer; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Base64; public class PdfToImageConverter { public static String convert(String pdfBase64) throws IOException { byte[] pdfBytes = Base64.getDecoder().decode(pdfBase64); PDDocument document = PDDocument.load(pdfBytes); PDFRenderer pdfRenderer = new PDFRenderer(document); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); for (int i = 0; i < document.getNumberOfPages(); i++) { BufferedImage image = pdfRenderer.renderImageWithDPI(i, 300); ImageIO.write(image, "png", outputStream); outputStream.flush(); } byte[] imageBytes = outputStream.toByteArray(); String imageBase64 = Base64.getEncoder().encodeToString(imageBytes); outputStream.close(); document.close(); return imageBase64; } } ``` 相关问题: 1. 如何将单页PDFbase64转换为图片base64? 2. 如何将图片base64转换为文件并保存到指定路径下? 3. 如何将多张图片合并为一张PDF文件并转换为base64编码字符串?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值