2017-08-10 54 views
0

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

下面的代码工作并生成合并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(空)时上面的代码;抛出以下异常:

java.io.IOException: Error: End-of-File, expected line at org.apache.pdfbox.pdfparser.BaseParser.readLine(BaseParser.java:1119) at org.apache.pdfbox.pdfparser.COSParser.parseHeader(COSParser.java:2005) at org.apache.pdfbox.pdfparser.COSParser.parsePDFHeader(COSParser.java:1988) at org.apache.pdfbox.pdfparser.PDFParser.parse(PDFParser.java:269) at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:1143) at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:1059) at 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仅包含没有从第二个主文档和内容。所以看起来我错过了一些东西,文档没有合并。

+0

因为我不想打开一个新的问题。使用appendDocument而不是mergeDocuments有什么优点吗? – Stephan

+0

添加了Stacktrace。 – Stephan

+0

谢谢;这个堆栈跟你打开一个空文件时的结果完全一样。合并为我工作(非空)流。 –

回答

0

我能找到一个解决方案,但我仍然不明白使用流时出了什么问题。详细:

虽然下面的代码抛出异常(java.io.IOException的:错误:档案结尾,预期线)

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方法,一切似乎按要求工作。

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; 
} 

现在,为什么使用流的第一种方法,而直接使用该文件作品抛出一个异常,是什么我也想知道。

+0

*“为什么使用流的第一种方法在直接使用文件时引发异常,这是我还想知道的。”* - 如果您不认为您的问题没有得到正确回答,则应该发布当前的解决方案作为编辑问题,而不是回答... – mkl