2017-03-13 18 views
1

私はPDFを含むブロブの配列を持っています。これらのPDFをすべて追加し、サーブレットresponse.getOutputStreamを使用して結果をクライアントに送信しようとしています。しかし、どういうわけか私は15バイトの文書を取得しており、Acrobat Readerで読むことができません。itext 7 concat pdfと応答に送信

データは、Word文書でいくつかのブロブを含むList<Data>です。 私はまずAsposeを使ってPDFに変換します。私はこのコードが動作すると確信しています。 これは問題ではありません。 DocumentここのオブジェクトはAsposeライブラリです。 PDFとして出力ストリームに書き込まれるオブジェクトです。 問題はiText 7のドキュメントや例でこれに関するドキュメントが見つかりません。それが正しいよう

はここで、SYSOUTは2を返し、私は1つの文書の2つのPDFを抱えている場合は、私が今

List<PdfDocument> listPDF = new LinkedList<>(); 
for (Data aData : data) { 
    byte[] input = aData.getBlobValue(); 
    ByteArrayInputStream inStream = new ByteArrayInputStream(input); 
    Document srcDocWord = new Document(inStream); 
    ByteArrayOutputStream pdfOStream = new ByteArrayOutputStream();   
    srcDocWord.save(pdfOStream, SaveFormat.PDF); 
    ByteArrayInputStream pdfIStream = new ByteArrayInputStream(pdfOStream.toByteArray()); 
    PdfReader reader = new PdfReader(pdfIStream); 
    PdfDocument pdfDoc = new PdfDocument(reader); 
    listPDF.add(pdfDoc); 
}  
PdfDocument result = new PdfDocument(new PdfWriter(new ByteArrayOutputStream())); 
for (PdfDocument pdfDoc : listPDF) { 
    pdfDoc.initializeOutlines(); 
    List<PdfPage> list = pdfDoc.copyPagesTo(1, pdfDoc.getNumberOfPages(), result);   
    pdfDoc.close(); 
}  
System.out.println(result.getNumberOfPages()); 
ByteArrayInputStream is = new ByteArrayInputStream(((ByteArrayOutputStream)pdfDoc.getWriter().getOutputStream()).toByteArray()); 
OutputStream os = response.getOutputStream(); 
os.write(is.read()); 
os.flush(); 
os.close(); 

を使用しているコードです。 しかし、応答に返される文書は15バイトだけです。

+0

こんにちは、iTextの7 APIを見て、あなたはそれがPdfDocumentオブジェクトが導入されてiTextの5以降に変更された見つけることができますdocによれば、pdfDoc.copyPagesToがこれを行う方法です。このメソッドは、結果オブジェクトをサーブレットに戻し、次にそれをストリーミングしようとします。 listPDFオブジェクトをサーブレットに戻し、上記のforループを使用して、responseオブジェクトのoutputstreamを使用して、次のように 'result'オブジェクトを作成することによって解決策が見つかった場合: PdfDocument result = new PdfDocument (新しいPdfWriter(response.getOutputStream())); しかし、これを行うには奇妙な方法があります。 – chnoe

答えて

1

まず、結果のドキュメントを閉じる必要があります。第二に、私はあなたがどのようにレスポンスに何かを書くのか分かりません。 os.write(is.read());に電話すると、isからosにコピーされません。

すぐosへの書き込みを試してみてください、これは非常にクリーンなアプローチです:

OutputStream os = response.getOutputStream(); 
PdfDocument result = new PdfDocument(new PdfWriter(os)); 
for (PdfDocument pdfDoc : listPDF) { 
    pdfDoc.initializeOutlines(); 
    List<PdfPage> list = pdfDoc.copyPagesTo(1, pdfDoc.getNumberOfPages(), result);   
    pdfDoc.close(); 
} 
result.close(); 
関連する問題