如何直接在Adobereader中显示Java(JSF)生成的PDF
-
25-09-2019 - |
题
我正在使用JSF 2.0(Eclipse IDE),并且我的一种bean中有一种方法,该方法使用Apache FOP 1.0生成了一些PDF文件。当我在JSF页面上单击“ makepdf”按钮时,生成的PDF在我的页面所在的同一窗口中打开(并且在查看/保存/打印PDF之后,我必须使用'Back'按钮)。
我可以以一种方式更改此操作,即当按下“ makepdf”按钮时,出现标准的弹出对话框,并问我是否要保存文件或使用Adobereader打开文件。
有什么方法是,当我单击“ makepdf”按钮时,生成的pdf直接在adobereader中打开(我仍然有我的JSF页面,不需要确认任何东西)???此外(这不是真正需要的,但很高兴知道),是否有一种方法可以在新窗口中打开它或直接将其发送给打印机?
这是我的代码的主要部分(我删除了一些无关紧要的内容):
public void makePDF(long contractId, int documentType) {
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
String basePath = externalContext.getRealPath("/");
try {
fopFactory.setUserConfig(new File(basePath + "/pdf_transform/config/userconfig.xml"));
fopFactory.setBaseURL(basePath);
fopFactory.getFontManager().setFontBaseURL(basePath);
} catch (Exception e) {
e.printStackTrace();
}
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
foUserAgent.setBaseURL(fopFactory.getBaseURL());
HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
response.reset();
response.setHeader("Content-Type", "application/pdf");
response.setHeader("Content-disposition", "attachment");
BufferedOutputStream output = null;
try {
output = new BufferedOutputStream(response.getOutputStream(), 10240);
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, output);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer(new StreamSource(xsltfile));
Source src = new DOMSource(makeXML(contract)); // my method
Result res = new SAXResult(fop.getDefaultHandler());
transformer.transform(src, res);
} catch (Exception e) {
e.printStackTrace();
}
facesContext.responseComplete();
}`
当我删除时 response.setHeader("Content-disposition", "attachment");
它在同一窗口中打开,否则要求我保存或打开。
提前致谢。
解决方案
在新窗口中打开请求并不是直接的JSF问题。这是HTML的问题。
添加 target="_blank"
到表格
<h:form target="_blank">
并将请求提交到新的选项卡/窗口中。
不可能直接发送到客户端的打印机,而如果不引入某些代码,这些代码像一个小程序一样在客户端以人为中间的方式运行。
其他提示
我也有类似的问题,幸运的是找到了一种优雅的解决方法。如果有人有更好的解决方案,请告诉我。
用例:用户以PDF创建所需的JSF生成的形式输入数据(PDF是从Servlet生成的)。如果验证失败,则呈现错误消息,但是如果一切顺利,则在新窗口中打开PDF文件。:-)
我的解决方案:
在template.xhtml(或定义facelets的站点)中输入:
<ui:define name="head"> <h:outputScript rendered="#{myBean.pdfDownloadable}"> window.open('#{myBean.pdfUrl}',"pdfWindow","width=800,height=900,left=50,top=10") </h:outputScript> </ui:define>
您的命令链接在JSF形式中也指向MyBean中的动作方法(例如mybean.showpdf())
- 如果表单数据有效,并且称为Showpdf(),则可以将PDFDownloadable的字段设置为TRUE,并再次呈现相同的结果,但是这次使用window.open()。
希望它能帮助某人。
如果您想直接打开PDF,请使用
response.setHeader("Content-Disposition", "inline");