1

我几乎(我认为)能够使用 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 聊天室: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,不如实现 flysacuer 的 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 回答