gpt4 book ai didi

java - iText/Flying Saucer PdfStamper 使用 OutputStream

转载 作者:行者123 更新时间:2023-11-29 03:48:34 35 4
gpt4 key购买 nike

我几乎(我认为)能够在不先保存的情况下使用 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();

但是,我不确定如何在打开它时放置一个打印对话框。我已经将此代码用于 physical 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

最佳答案

警告:我使用的是旧版本的 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());

关于java - iText/Flying Saucer PdfStamper 使用 OutputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9738102/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com