我正在尝试使用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应用程序中的打印按钮时,如何在浏览器中自动打开它?
答案 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)
我曾基于此开发了一些东西,它遵循以下步骤:
从前端拨打另一个电话以获取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()
希望这有帮助。