PDFをWebブラウザに簡単に印刷する備忘録です。
仕事では、1)クライアント側で印刷したい旨の情報をサーバ側に伝える。2)サーバ側で動的にPDFを作成して、そのPDFをWebサーバに配置(決まった場所に保存)して、保存したURLをクライアント側(Webブラウザ)に伝え、3)Webブラウザで(自動で)印刷する。というパターンが多いと思います。
今回は、一連の手順を示したいと思います。
1)これは、Jquey.ajaxを使えば簡単にサーバとの連携ができます。
具体的には、
//PDF作成依頼 var fileURLdata ; fileURLdata = JSON.parse($.ajax({ url: "サーバ側処理URL.aspx?targetid=" + targetid --今回はASP.NETで処理しています + "&year=" + year --引数は処理に合わせて適当に + "&month=" + month + "&kbn=" + kbn + "&sub_cd=" + sub_cd , async: false --ファイルの作成を待つため同期処理で }).responseText);
2)サーバ側でPDF作成
細々とした部分は割愛して書きます。
try Dim fileURL As String = "0" 'パラメータ取得 'year, month, targetid, 等々の取得 '定義ファイル指定 ReportViewer1.LocalReport.ReportPath = "xxxxx.aspx.rdlc" 'パラメータセット param.Add(New ReportParameter("Report_Parameter_0", "パラメータ文言")) ReportViewer1.LocalReport.SetParameters(param) 'データバインド Dim oQA As New TableAdapters.xxxxxTableAdapter Dim oDT As New xxxxx.xxxxxDataTable oDT = oQA.GetData(year, month, targetid, kbn) 'クライアント側からパラメータで貰ったもの Dim oRDS As New ReportDataSource oRDS.Name = "DataSet1_xxxxx" oRDS.Value = oDT ReportViewer1.LocalReport.DataSources.Add(oRDS) 'データ再セット ReportViewer1.LocalReport.Refresh() Dim warnings As Warning() = Nothing Dim streamids As String() = Nothing Dim mineType As String = Nothing Dim encoding As String = Nothing Dim extension As String = Nothing Dim bytes As Byte() 'PDFデータ取得 bytes = ReportViewer1.LocalReport.Render("PDF", Nothing, mineType, encoding, extension, streamids, warnings) 'PDFデータ書き出し Dim outputfile As String = "指定ディレクトリ" Dim snt As String = Now().ToString("yyyyMMddHHmmss") outputfile += snt + "_" + sub_cd + "-" + targetid + ".pdf" fileURL = "指定URLディレクトリ" fileURL += snt + "_" + sub_cd + "-" + targetid + ".pdf" Dim fs As New IO.FileStream(outputfile, IO.FileMode.Create) fs.Write(bytes, 0, bytes.Length) fs.Close() Catch ex As Exception fileURL = "0" Finally Dim result As New List(Of printInfo) Dim pi As New printInfo() pi.fileURL = fileURL pi.alert1 = "" pi.alert2 = "" result.Add(pi) Dim serializer As System.Web.Script.Serialization.JavaScriptSerializer = New System.Web.Script.Serialization.JavaScriptSerializer() Response.Write(serializer.Serialize(result)) Response.End() --------------- Public Class printInfo Public fileURL As String Public alert1 As String Public alert2 As String End Class
3)Webブラウザで(自動で)印刷する
//ファイル作成成否確認 if (fileURLdata[0].fileURL == "0") { alert("印刷用PDF作成に失敗しました"); (window.open('', '_self').opener = window).close(); } //ファイル名取得 var fileURL = fileURLdata[0].fileURL; //OBJECTタグを作成 var tid = 'objPdf' + targetid + jQuery.now().toString(); var obj = document.createElement('object'); obj.setAttribute('id', tid); obj.setAttribute('classid', 'clsid:CA8A9780-280D-11CF-A24D-444553540000'); // PDFのクラスID(固定値) obj.setAttribute('height', '1'); obj.setAttribute('width', '1'); //PDFのソースを設定 var param = document.createElement('param'); param.setAttribute('name', 'src'); param.setAttribute('value', fileURL); obj.appendChild(param); //作成したOBJECTタグをDIVタグの中にセット $(" <div id="pdfDiv" + i + "" style="border-style: none; height: 1px; width: 1px; background-color: #ffffff;"></div> ").appendTo($("#div_footter"));--差し障りの無い所へ追加 var div = document.getElementById('pdfDiv' + i); div.appendChild(obj); div.innerHTML = obj.outerHTML; document.getElementById(tid).printAll();
以上です。