引入依赖包
<!-- 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博客