Apache PDFBox合并错误-java.io.IOException:拖车中缺少根对象规范
我正在尝试使用PDFBox中的Apache PDFBox合并错误-java.io.IOException:拖车中缺少根对象规范,java,pdfbox,Java,Pdfbox,我正在尝试使用PDFBox中的PDFMergerUtility.mergeDocuments()方法将两个现有的PDF文档InputStreams合并在一起。这是我的密码;输入方法是pullDocumentsIntoSystem(): 我正在使用PDFBox 2.0.11 我的InputStreams列表都来自一个单独的HttpURLConnection.getInputStream()调用,以备不时之需。我已经确认,在HttpURLConnection中进行的调用确实返回了一些文档 更新 根据
PDFMergerUtility.mergeDocuments()
方法将两个现有的PDF文档InputStreams
合并在一起。这是我的密码;输入方法是pullDocumentsIntoSystem()
:
我正在使用PDFBox 2.0.11
我的InputStream
s列表都来自一个单独的HttpURLConnection.getInputStream()
调用,以备不时之需。我已经确认,在HttpURLConnection
中进行的调用确实返回了一些文档
更新
根据下面@Tilman Hausherr的建议,我在没有使用InputStream
s的情况下测试了相同的功能。如果使用PDFMergerUtility.addSource(文件源)
方法,则PDFMergerUtility.addSource(列表)
合并会成功。因此,似乎我的InputStream
s的某些功能无法正常工作
我感谢任何帮助,如果需要,我很乐意提供更多信息
谢谢你的时间 输入流中可能出现问题,请尝试添加应用程序/pdf mime类型。最后,这确实是一个愚蠢的错误。我过早地关闭了
HttpURLConnection
。如果在getSpecificDocument()
方法的末尾删除this.disconnect(连接)
调用,则一切正常
好吧,希望这能帮助其他人
感谢@Фааааааааааааааа 请使用
code
formatting而不是blockquote重新格式化错误消息。请验证在不使用http的情况下对文件调用load()时是否也遇到此错误。此类错误通常来自严重损坏/截断的PDF文件。如果可能,请共享文件。很遗憾,我无法共享文件。但是,我采纳了您的建议,从http调用中提取相同的文件,将它们存储在本地,然后使用PDFMergerUtility.addSource(File source)
方法代替PDFMergerUtility.addSource(List)
方法。它成功了。因此,如果先将PDF写入本地目录,则PDF是有效的。不幸的是,我需要使用流媒体解决方案。那么,InputStream
s有什么问题呢?谢谢你在这方面的帮助;我将相应地更新帖子。我添加了更多代码,以便您可以查看我的HttpURLConnection
的详细信息。我将“接受”和“内容类型”请求属性设置为“application/pdf”。是的,从稍后编辑的代码中可以明显看出发生了什么:-)现在不要忘记在获得所有流后断开连接,否则可能会发生泄漏。一种解决方案是使用IOUtils.copy()将其传输到ByteArrayOutputStream中,然后返回一个字节[](这比返回一个流快,PDFBox将该流复制到缓冲区或文件中)。如果您的PDF不是太大/太多。是的,我仍在断开连接…但现在正是时候。:)另外,关于您建议使用IOUtils.copy()
…我将有一些非常大的PDF,可能有几百页。ByteArrayOutputStream
是否仍然是具有该大小文件的选项?
private boolean pullDocumentsIntoSystem(final String id, final String filePathAndName, final List<Letter> parsedLetters)
throws IOException {
final List<InputStream> pdfStreams = new ArrayList<InputStream>();
final ByteArrayOutputStream mergedPdfOutputStream = new ByteArrayOutputStream();
// make a call to retrieve each document
for (final Letter letter : parsedLetters) {
pdfStreams.add(this.getSpecificDocument(letter.getKey(), id));
}
// merge all the documents together
this.mergePdfDocuments(pdfStreams, mergedPdfOutputStream);
// write file to directory
this.writeMergedPdfDocument(mergedPdfOutputStream, filePathAndName); //...more code below...
}
private InputStream getSpecificDocument(final String id, final String key) throws IOException {
HttpURLConnection conn = null;
InputStream pdfStream = null;
try {
final String url = this.getBaseURL() + "/letter/" + id + "/documents/" + key;
conn = (HttpURLConnection) new URL(url).openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("X-Letter-Authentication", this.getAuthenticationHeader());
conn.setRequestProperty("Accept", "application/pdf");
conn.setRequestProperty("Content-Type", "application/pdf");
conn.setDoOutput(true);
pdfStream = connection.getInputStream();
}
finally {
this.disconnect(connection);
}
return pdfStream;
}
private void mergePdfDocuments(final List<InputStream> pdfStreams, final ByteArrayOutputStream mergedPdfOutputStream)
throws IOException {
final PDFMergerUtility merger = new PDFMergerUtility();
merger.addSources(pdfStreams);
merger.setDestinationStream(mergedPdfOutputStream);
merger.mergeDocuments(MemoryUsageSetting.setupTempFileOnly()); // ERROR THROWN HERE
}
Caused by: java.io.IOException: Missing root object specification in trailer.
at org.apache.pdfbox.pdfparser.COSParser.parseTrailerValuesDynamically(COSParser.java:2832) ~[pdfbox-2.0.11.jar:2.0.11]
at org.apache.pdfbox.pdfparser.PDFParser.initialParse(PDFParser.java:173) ~[pdfbox-2.0.11.jar:2.0.11]
at org.apache.pdfbox.pdfparser.PDFParser.parse(PDFParser.java:220) ~[pdfbox-2.0.11.jar:2.0.11]
at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:1144) ~[pdfbox-2.0.11.jar:2.0.11]
at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:1060) ~[pdfbox-2.0.11.jar:2.0.11]
at org.apache.pdfbox.multipdf.PDFMergerUtility.legacyMergeDocuments(PDFMergerUtility.java:379) ~[pdfbox-2.0.11.jar:2.0.11]
at org.apache.pdfbox.multipdf.PDFMergerUtility.mergeDocuments(PDFMergerUtility.java:280) ~[pdfbox-2.0.11.jar:2.0.11]