我几乎就在那里(我认为)能够使用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
答案 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。