iframe 内で PDF を印刷するためのいくつかのオプションを調査しましたが、どれも機能していないようです。
簡単な詳細:
- ユーザーからいくつかの検索パラメーターを取得します。
- データベース検索を行い、Apachi FOP を使用して結果の PDF を生成します。
- 印刷ボタンとキャンセル ボタンのある Web ページに誘導されます。
- ユーザーが [印刷] ボタンをクリックすると、PDF を表示するウィンドウが開きます。
- ユーザーが PDF を印刷するための印刷ダイアログが開きます。
- PDF ファイルがサーバーから削除されます。
- 窓が閉まる
高度な詳細:
- これは IE8 でのみ動作する必要があります。
- FOP 統合は、XSLT 変換を使用しません。文字列としてフォーマットされた入力 FOP XML の StringReader のみを使用します。
- PDF を表示するウィンドウは、実際には 2 つの JSP ページです。
- 最初のページ:
- ソースとして 2 番目の JSP ページを含む iframe がある
- PDF を iframe に印刷する printPDF() 関数をロード時に実行します。
- 2 番目のページ:
- Java BufferedOutputStream および ServletOutputStream を使用
- 出力後にファイルを削除します
- out = pageContent.pushBody(); を使用します。
最初の jsp ページ (印刷関数を呼び出す実行) の一部を次に示します。
<body onload='printPDF()'>
<table>
<tr>
<td class="content">
<%
// get myfilename from the myfile parameter on the URL
String myfile = request.getParameter("myfile");
out.print("<iframe src='fc_view_letter.jsp?myfile="+ myfile + "' id='pdfFrame'></iframe>");
%>
</td>
</tr>
</table>
<script>
function printPDF()
{
var id = 'pdfFrame';
var iframe = document.frames ? document.frames[0] : document.getElementById(id);
var ifWin = iframe.contentWindow || iframe;
ifWin.focus();
ifWin.printPage();
//ifWin.print();
}
</script>
</body>
2 番目の JSP ページ (pdf を表示するページ) のほとんどを次に示します。
<%@ page session="false" %>
<%@ page import="java.io.*" %>
<%@ page import="java.net.URLDecoder" %>
<html>
<head>
</head>
<body>
<%
String myfile = request.getParameter("myfile");
String myfiledecoded = "";
myfiledecoded = URLDecoder.decode(myfile, "UTF8");
String myfilename = myfiledecoded;
String extension;
int dotPos = myfilename.lastIndexOf(".")+1;
extension = myfilename.substring(dotPos);
int slashPos = myfilename.lastIndexOf("/")+1;
String secondparam = "filename=" + myfiledecoded.substring(slashPos);
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", secondparam);
try {
ServletOutputStream sout = response.getOutputStream();
response.setHeader("Content-Disposition", secondparam);
File file = new File(myfilename);
FileInputStream fstream = new FileInputStream(file);
BufferedInputStream bis = null;
bis = new BufferedInputStream(fstream);
BufferedOutputStream bos = null;
bos = new BufferedOutputStream(sout);
byte[] buff = new byte[1024];
int bytesRead;
while(-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff, 0, bytesRead);
}
bis.close();
bos.close();
sout.flush();
sout.close();
//file.delete();
}
catch (Exception e) {
System.out.println("Exception Occured...................." );
}
out.clear();
out = pageContext.pushBody();
%>
</body>
</html>
私が問題だと思うのは、バッファがすべてのhtmlを排除し、PDFのみを表示すると考えていることです。または、少なくともIEでそれを行います。Firefox を見ると、PDF ファイルが埋め込まれていました。HTML ではないため、iframe のコンテンツを取得できない可能性があります。
これまでの私の情報源は次のとおりです。
http://www.ehow.com/how_7352227_use-javascript-print-pdf.html
http://www.webmasterworld.com/forum91/4086.htm