2012-03-16 123 views
1

我幾乎在那裏(我認爲)能夠使用servlet呈現PDF而不先保存它。我已經能夠成功設置它了,但是我一直試圖使用打印對話框在客戶端的瀏覽器中打開PDF。iText /飛碟使用OutputStream的PDFStamper

我已經能夠到我的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的聊天室,如果你想發佈有:http://chat.stackoverflow.com/rooms/8945/itext

回答

3

警告:我使用的是舊版本Itext的,所以我的經驗可能不適用。可以使用字節數組。所以你可以使用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()); 
+0

我一直在尋找使用ByteArrayOutputStream,但我無法弄清楚如何使用'resp.getOutputStream()'並將其轉換爲ByteArrayOutputStream。你是否熟悉如何去做? – 2012-03-16 13:39:49

+0

我想這樣做,但飛碟正在使用OutputStream進行所有渲染。我想我真的很想看看如何在渲染器之後使用OutputStream。createPDF(os);'並將其轉換爲PdfReader可以讀取它的格式(byte [],InputStream或URL)。我已經閱讀了將OutputStream轉換爲InputStream,但我對如何實際實現它感到困惑。你介意加入我聊天http://chat.stackoverflow.com/rooms/8945/itext嗎? – 2012-03-16 14:18:05

+0

嘿,我找不到類PdfReader,他們把它放在哪裏? – William 2012-12-19 19:19:05

1

而不是使用PdfStamper,爲什麼不實現flyingsacuer的PDFCreationListener來按摩創建的任何pdf。您可以獲取PdfWriter實例並從實現類中設置打印對話框。

從PDFCreationListener

PDFCreationListener的javadoc的是PDF創建回調偵聽器。要使用它,請調用ITextRenderer.setListener(PDFCreationListener)。注意,通過ITextRenderer實例上的句柄(在回調參數中提供),您可以訪問用於創建文檔的com.lowagie.text.pdf.PdfWriter實例,使用 ITextRenderer.getOutputDevice(),然後調用ITextOutputDevice.getWriter()。

相關的帖子是here