【问题标题】:Unable to merge streams with PDFBox无法将流与 PDFBox 合并
【发布时间】:2017-08-10 08:28:39
【问题描述】:

目前我可以在使用 java.io.File 时合并两个 PDF 文件,但在使用输入和输出流时无法合并它们。

下面的代码工作并成功生成合并的PDF。

File mainDoc = new File(path...);
File additionalDoc = new File(path...);

PDFMergerUtility pdfMerger = new PDFMergerUtility();
pdfMerger.setDestinationFileName(path + "/merged.pdf");
pdfMerger.addSource(mainDoc);
pdfMerger.addSource(additionalDoc);
pdfMerger.mergeDocuments(null);

然后我尝试通过使用流来做同样的事情。

ByteArrayOutputStream out = new ByteArrayOutputStream();
InputStream mainDocStream = new FileInputStream(path...);
InputStream additionalDocSteam = new FileInputStream(path...);
PDFMergerUtility pdfMerger = new PDFMergerUtility();
pdfMerger.addSource(mainDocStream);
pdfMerger.addSource(additionalDocSteam);
pdfMerger.setDestinationStream(out);
pdfMerger.mergeDocuments(null);

上面的代码在到达 pdfMerger.mergeDocuments(null); 行时会抛出以下异常:

java.io.IOException:错误:文件结束,预期的行在 org.apache.pdfbox.pdfparser.BaseParser.readLine(BaseParser.java:1119) 在 org.apache.pdfbox.pdfparser.COSParser.parseHeader(COSParser.java:2005) 在 org.apache.pdfbox.pdfparser.COSParser.parsePDFHeader(COSParser.java:1988) 在 org.apache.pdfbox.pdfparser.PDFParser.parse(PDFParser.java:269) 在 org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:1143) 在 org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:1059) 在 org.apache.pdfbox.multipdf.PDFMergerUtility.mergeDocuments(PDFMergerUtility.java:263)

最后我尝试以这个答案 (Merge Pdf Files Using PDFBox) 为例,但我生成的 pdf 似乎没有合并这两个 pdf。 这是我试过的代码。

public InputStream createPDF() {
    try{
        // Note, i have also tried to use java.io.File instead of an 
        // InputStream but the result was the same
        // File mainDoc = new File(path...);
        // PDDocument document = PDDocument.load(mainDoc);
        InputStream pdfInputStream = null;
        InputStream mainDocStream = new FileInputStream(path...);
        PDDocument document = PDDocument.load(mainDocStream);
        InputStream additionalDocSteam = new FileInputStream(path...);
        PDDocument additionalDocument = PDDocument.load(additionalDocSteam);
        PDFMergerUtility pdfMerger = new PDFMergerUtility();

        pdfMerger.appendDocument(additionalDocument, document);
        document.save(out);
        document.close();
        PDDocument.load(out.toByteArray());

        pdfInputStream = new ByteArrayInputStream(out.toByteArray());

    }catch(...){
        ....
    }
    return pdfInputStream;
} 

上面的代码确实生成了一个 PDF,但新创建的 PDF 仅包含主文档的内容,而不包含第二个文档的内容。所以看起来我遗漏了一些东西并且文档没有合并。

【问题讨论】:

  • 因为我不想打开一个新问题。使用 appendDocument 代替 mergeDocuments 有什么好处吗?
  • 添加了堆栈跟踪。
  • 谢谢;此堆栈跟踪正是您打开空文件时得到的堆栈跟踪。与(非空)流合并对我有用。
  • 在评论中重新提出您的问题:我建议使用文件,PDFBox 将负责关闭它们。对于流,您必须自己关闭它们。
  • @TilmanHausherr 我不确定这是由空文件引起的。我想说的是,在我提供文件位置的所有代码示例中,我使用的文件也是不变的。这是我在所有场景中唯一没有改变的东西。如果您有兴趣,我不介意详细说明为什么会引发此异常。感谢大家的支持。

标签: pdf pdfbox


【解决方案1】:

我能够找到解决方案,但我仍然无法理解使用流时出了什么问题。详细:

虽然以下代码抛出异常(java.io.IOException: Error: End-of-File, expected line)

ByteArrayOutputStream out = new ByteArrayOutputStream();
InputStream mainDocStream = new FileInputStream(path...);
InputStream additionalDocStream = new FileInputStream(path...);
PDFMergerUtility pdfMerger = new PDFMergerUtility();
pdfMerger.addSource(mainDocStream);
pdfMerger.addSource(additionalDocStream);
pdfMerger.setDestinationStream(out);
pdfMerger.mergeDocuments(null);

在 addSource 方法中使用 File 时,一切似乎都按要求工作。

public InputStream createPDF() {
    InputStream pdfInputStream = null;

    try{
        File mainDoc = new File(...);
        File additionalDoc = new File(path...);
        PDFMergerUtility pdfMerger = new PDFMergerUtility();
        pdfMerger.addSource(mainDoc);
        pdfMerger.addSource(additionalDoc);
        pdfMerger.setDestinationStream(out);
        pdfMerger.mergeDocuments(null);
        pdfInputStream = new ByteArrayInputStream(out.toByteArray());
    }catch(...){
        ...
    }
    return pdfInputStream;
}

现在,为什么使用流的第一种方法在直接使用文件时会引发异常,这也是我想知道的。

【讨论】:

  • “为什么使用流的第一种方法在直接使用文件时会引发异常,我也想知道。” - 如果您不考虑您的要正确回答问题,您应该将当前解决方案发布为问题的编辑,而不是答案...
猜你喜欢
  • 1970-01-01
  • 2012-11-28
  • 1970-01-01
  • 2012-05-19
  • 1970-01-01
  • 1970-01-01
  • 2017-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多