1

最初に保存せずにサーブレットを使用してPDFをレンダリングできるようになるまで、私はほぼそこにいます(私は思います)。私はそれをうまくセットアップすることができました、しかし私は最初に印刷ダイアログでクライアントのブラウザでPDFを開かせようとして立ち往生しています。

次の方法でPDFをクライアントに正常に送信できました。

DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
Document doc = builder.parse(new StringBufferInputStream(buf.toString())); 

OutputStream os = resp.getOutputStream(); 

ITextRenderer renderer = new ITextRenderer(); 
renderer.setDocument(doc, null); 
renderer.layout(); 
renderer.createPDF(os); 

os.close();

しかし、それを開くときに印刷ダイアログを配置する方法がわかりません。このコードを物理PDFファイルに使用しましたが、OutputStreamの内容をPdfReaderに入力するためのバイト配列として読み取ることができる必要があります(私は思います)。

PdfReader reader = new PdfReader("a_physical_file.pdf"); 
PdfStamper stamper = new PdfStamper(reader, os); 
stamper.setPageAction(PdfWriter.PAGE_OPEN, new PdfAction(PdfAction.PRINTDIALOG), 1); 
stamper.close();

実際のファイルではなく、OutputStreamを使用してこれを行う方法がわからない...

そこに投稿したい場合は、iTextチャットルームも作成しました:https ://chat.stackoverflow.com/rooms/8945/itext

4

2 に答える 2

3

警告:古いバージョンのItextを使用しているため、私の経験が当てはまらない可能性があります。

PdfReaderはバイト配列を使用できます。したがって、最初の出力ストリームとしてByteArrayOutputStreamを使用し、ファイル名の代わりにそれを使用してリーダーを取得できます。

よろしく

編集:あなたの質問について:

私はそれを他の方法でやっています:私はByteArrayOutputStreamに取り組んでいて、それを応答ストリームに書き込んでいます:

ByteArrayOutputStream out = new ByteArrayOutputStream();
// creating / modifying the pdf
...
byte[] pdfoutput = out.toByteArray();
res.setContentLength(pdfoutput.length);
res.getOutputStream().write(pdfoutput);

編集2:最終的な解決策(チャットルームから)

DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
Document doc = builder.parse(new StringBufferInputStream(buf.toString())); 

OutputStream os = new ByteArrayOutputStream(); 
ITextRenderer renderer = new ITextRenderer(); 
renderer.setDocument(doc, null); 
renderer.layout(); 
renderer.createPDF(os); 
os.close(); 

PdfReader reader = new PdfReader(((ByteArrayOutputStream)os).toByteArray()); 
OutputStream out = new ByteArrayOutputStream(); 
PdfStamper stamper = new PdfStamper(reader, out); 
stamper.setPageAction(PdfWriter.PAGE_OPEN, new PdfAction(PdfAction.PRINTDIALOG), 1); 
stamper.close(); 

resp.getOutputStream().write(((ByteArrayOutputStream)out).toByteArray());
于 2012-03-16T13:35:57.177 に答える
1

PdfStamperを使用する代わりに、flyingsacuerのPDFCreationListenerを実装して、作成されたpdfをマッサージしてみませんか。PdfWriterインスタンスを取得し、実装クラス内から印刷ダイアログを設定できます。

PDFCreationListenerのjavadocから

PDFCreationListenerは、PDF作成のコールバックリスナーです。これを使用するには、ITextRenderer.setListener(PDFCreationListener)を呼び出します。ITextRendererインスタンス(コールバック引数で提供)のハンドルを使用すると、ドキュメントの作成に使用されているcom.lowagie.text.pdf.PdfWriterインスタンスにアクセスできます。 ITextRenderer.getOutputDevice()、次にITextOutputDevice.getWriter()を呼び出します。

関連するスレッドはこちらです。

于 2013-05-08T06:49:10.683 に答える