使用OutputStream的iText / flying-saucer PdfStamper

时间:2012-03-16 13:24:48

标签: java servlets itext flying-saucer

我几乎就在那里(我认为)能够使用servlet呈现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聊天室:http://chat.stackoverflow.com/rooms/8945/itext

2 个答案:

答案 0 :(得分: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());

答案 1 :(得分:1)

为什么不实现flyingsacuer的PDFCreationListener来按摩任何创建的pdf,而不是使用PdfStamper。您可以从实现类中获取PdfWriter实例并设置打印对话框。

来自PDFCreationListener的javadoc

  

PDFCreationListener是PDF创建的回调侦听器。要使用它,请调用ITextRenderer.setListener(PDFCreationListener)。注意,使用ITextRenderer实例上的句柄(在回调参数中提供),您可以访问用于创建文档的com.lowagie.text.pdf.PdfWriter实例,   ITextRenderer.getOutputDevice(),然后调用ITextOutputDevice.getWriter()。

相关帖子是here