Java(JSF)がAdobereaderで直接PDFを生成する方法
-
25-09-2019 - |
質問
私はJSF 2.0(Eclipse IDE)を使用しており、Apache FOP 1.0を使用してPDFファイルを生成する豆の1つにメソッドがあります。 JSFページの[MakePDF]ボタンをクリックすると、PDFが生成された[PDF]が表示されているのと同じウィンドウで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");
それは同じウィンドウで開きます。そうしないと、保存または開くように頼みます。
前もって感謝します。
解決
新しいウィンドウでリクエストを開くことは、JSFの懸念事項ではありません。それはもっとHTMLの懸念です。
追加 target="_blank"
フォームに
<h:form target="_blank">
リクエストを新しいタブ/ウィンドウに送信します。
クライアントのプリンターに直接送信することは、アプレットのように中央の男性としてクライアント側で実行されるコードを導入することなく、直接不可能です。
他のヒント
私は同様の問題を抱えており、幸運にもそれを解決するエレガントな方法を見つけました。誰かがより良い解決策を持っているなら、私に知らせてください。
ユースケース:ユーザーは、PDF作成に必要なJSF生成フォームでデータを入力します(PDFはサーブレットから生成されます)。検証が失敗した場合、エラーメッセージがレンダリングされますが、すべてが正常になった場合、PDFファイルが新しいウィンドウで開きます。:-)
私の解決策:
template.xhtml(またはフェイスレットを定義するサイト)に入力してください。
<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-formのコマンドリンクは、MyBeanのアクションメソッドを指します(例:mybean.showpdf())
- フォームデータが有効で、showpdf()が呼び出された場合、pdfdownloadableフィールドをTrueに設定でき、同じ結果が再びレンダリングされますが、今回はwindow.open()を使用します。
それが誰かを助けることを願っています。
PDFを直接開いたい場合は、plsを使用します
response.setHeader("Content-Disposition", "inline");