2017-08-10 92 views
0

現在、java.io.Fileを使用しているときに2つの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は、第1からのみメイン文書の内容及びませんが含まれています。だから、私は何かが足りなくて、ドキュメントがマージされていないように見えます。

+0

私は新しい質問を開きたくないので、 mergeDocumentsの代わりにappendDocumentを使用することに利点がありますか? – 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

関連する問題