Apache PDFBox合并错误-java.io.IOException:拖车中缺少根对象规范

Apache PDFBox合并错误-java.io.IOException:拖车中缺少根对象规范,java,pdfbox,Java,Pdfbox,我正在尝试使用PDFBox中的PDFMergerUtility.mergeDocuments()方法将两个现有的PDF文档InputStreams合并在一起。这是我的密码;输入方法是pullDocumentsIntoSystem(): 我正在使用PDFBox 2.0.11 我的InputStreams列表都来自一个单独的HttpURLConnection.getInputStream()调用,以备不时之需。我已经确认,在HttpURLConnection中进行的调用确实返回了一些文档 更新 根据

我正在尝试使用PDFBox中的
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]