有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用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


共 (2) 个答案

  1. # 1 楼答案

    警告:我使用的是旧版本的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());
    
  2. # 2 楼答案

    与其使用PdfStamper,不如实现FlyingSauer的PDFCreationListener来处理创建的任何pdf。您可以获取PdfWriter实例,并在实现类中设置打印对话框

    来自PDFCreationListener的javadoc

    PDFCreationListener is the callback listener for PDF creation. To use this, call ITextRenderer.setListener(PDFCreationListener).Note that with a handle on the ITextRenderer instance (provided in the callback arguments) you can access the com.lowagie.text.pdf.PdfWriter instance being used to create the document, using ITextRenderer.getOutputDevice(), then calling ITextOutputDevice.getWriter().

    相关线程是here