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

时间:2016-08-07 17:46:17

标签: java pdf xslt vaadin apache-fop

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

我的问题是无法将文件保存到服务器,因此我需要将其读取为某种bytearray,然后在用户单击“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();
    }

}
});

问题

如何将PDF文档转换为流,当用户在不将文件保存到服务器的情况下单击Vaadin 7应用程序中的打印按钮时,如何在浏览器中自动打开它?

2 个答案:

答案 0 :(得分:1)

在Vaadin中下载文件的工作方式与here相同。总结:

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

然后,您的StreamResource会提供包含文件数据的InputStream。因此,您不需要将文件保存在服务器上。关于打印,我不知道是否可以指示浏览器直接打开打印对话框。

答案 1 :(得分:0)

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

  • 将输入数据作为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()
    

希望这有帮助。