2017-08-10 52 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