如何从 vaadin 7 中的流打印 pdf 文件?

How to print pdf-file from stream in vaadin 7?

我正在尝试使用 Apache FOP + xsl 直接从 vaadin 7 中的流打印 pdf。目前我可以成功创建新的 xml 文档并使用 xsl fo 从中重新生成 pdf 文件。我将文件保存到服务器,一切看起来都很好。

我的问题是无法将文件保存到服务器,因此我需要将其读取为某种字节数组,然后在用户单击 "Print" 按钮时将其打开。

out = new java.io.FileOutputStream(
        "/testPrint.pdf");

try {
    // Construct fop with desired output format
    Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);

    // XSL
    TransformerFactory factory = TransformerFactory.newInstance();
    Transformer transformer =
            factory.newTransformer(new StreamSource("printTemplate.xsl"));

    Result res = new SAXResult(fop.getDefaultHandler());

    //xml->xsl-fo-->pdf
    transformer.transform(xml, res);
} finally {
    out.close();
}

当用户点击打印按钮时,生成的 pdf 文档在我从服务器上检查时看起来不错。

 print.addClickListener(new ClickListener() {

@Override
public void buttonClick(ClickEvent event)
{
    PdfComponent pdf = new PdfComponent(lang, bookingDto);

    try {
        DOMSource xml = pdf.getXMLSource(bookingDto, lang);
        pdf.convertToPDF(lang,xml);
        } catch (Exception e) {
        e.printStackTrace();
    }

}
});

问题

当用户单击 Vaadin 7 应用程序中的打印按钮而不将文件保存到服务器时,如何将 PDF 文档获取到流以及如何在浏览器中自动打开它?

在 Vaadin 中下载文件的方式与描述的一样 here。摘要:

Button downloadButton = new Button("Download image");
StreamResource myResource = createResource();
FileDownloader fileDownloader = new FileDownloader(myResource);
fileDownloader.extend(downloadButton);

然后您的 StreamResource 提供一个包含文件数据的 InputStream。因此,您不需要将文件保存在服务器上。关于打印,不知道能不能让浏览器直接打开打印对话框。

我曾经基于此开发了一些东西,它遵循以下步骤:

  • 将输入数据作为 xml 从前端传递到服务器端(您可以使用 ajax)。
  • 在服务器端,使用 fop 创建您的 pdf 文件,将 pdf 文件保存在某处(可能在文件夹中)。
  • 再从前端调用获取pdf文件并显示。 不确定这是不是用 vaadin 写的,但它有点像这样:

    pdffile = "\path\"+pdfname+".pdf"
    file = new File(pdffile)
    response.setContentType("application/pdf")
    response.setHeader("Content-disposition" , "inline;   filename=${file.getName()}")
    response.outputStream << file.newInputStream()
    

希望对您有所帮助。