java - Apache PDFBox 合并错误 - java.io.IOException : Missing root object specification in trailer

标签 java pdfbox

我正在尝试合并两个现有的 PDF 文档:InputStreams一起使用 PDFMergerUtility.mergeDocuments() PDFBox 中的方法。这是我的代码;输入方式为pullDocumentsIntoSystem() :

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]

我使用的是 PDFBox 2.0.11。

我的列表InputStream每个都来自单独的 HttpURLConnection.getInputStream()如有需要请调用。我已经确认确实有从 HttpURLConnection 中调用的电话返回的文件。 .

更新

根据下面 @Tilman Hausherr 的建议,我在不使用 InputStream 的情况下测试了相同的功能。 s。如果我使用 PDFMergerUtility.addSource(File source)方法而不是 PDFMergerUtility.addSource(List<InputStream>)合并成功。所以看起来好像我的 InputStream 有什么东西s 无法正常工作。

感谢您的帮助,并很乐意在需要时提供更多信息。

感谢您的宝贵时间!

最佳答案

最终这确实是一个愚蠢的错误。我太早关闭了 HttpURLConnection。如果我删除 getSpecificDocument() 方法末尾的 this.disconnect(connection) 调用,那么一切都会正常工作。

好吧,希望这对其他人有帮助。

感谢@Фарид Азаев 和@Tilman Hausherr 的领导!

关于java - Apache PDFBox 合并错误 - java.io.IOException : Missing root object specification in trailer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51485983/

相关文章:

java - 使用Java从PDF中提取图像

java - 使用pdfbox从pdf中提取文本时出错

java - 等待动画按钮停止

java - jsp中显示有限行数

java - 使用 Neo4j 2.0 和 Spring Data 3.0 Rest 启动时出现异常

java - 从pdf中提取粗体字

android - 更改字段文本的 PDFbox 字体

pdf-generation - 使用 PDFBox 生成的 PDF 为空白

java - Selenium 移动鼠标不适用于低分辨率

java - 按特定属性动态分组并排序