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