如何从 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()
希望对您有所帮助。
我正在尝试使用 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()
希望对您有所帮助。