我正在使用 JSF 2.0 (Eclipse IDE),并且我的一个 bean 中有一个方法,它使用 Apache FOP 1.0 生成一些 PDF 文件。当我单击 JSF 页面上的“makePDF”按钮时,生成的 PDF 会在我的页面所在的相同窗口中打开(并且在查看/保存/打印 PDF 后我必须使用“返回”按钮)。
我可以改变这种方式,当按下“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");
它时,它会在同一个窗口中打开,否则它会要求我保存或打开。
提前致谢。