使用OutputStream的java iText/flyingsaucer PdfStamper
我(我想)几乎可以用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文件,但我需要能够将输出流的内容作为字节数组读入,以便输入到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
# 1 楼答案
警告:我使用的是旧版本的Itext,因此我的经验可能不适用
PdfReader可以使用字节数组。因此,您可以使用ByteArrayOutputStream作为第一个输出流,然后使用它来获取读取器,而不是文件名
问候
编辑:关于你的问题:
我正在以其他方式进行操作:我正在处理ByteArrayOutputStream,然后将其写入响应流:
编辑2:最终解决方案(来自聊天室)
# 2 楼答案
与其使用PdfStamper,不如实现FlyingSauer的PDFCreationListener来处理创建的任何pdf。您可以获取PdfWriter实例,并在实现类中设置打印对话框
来自PDFCreationListener的javadoc
相关线程是here