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();
以上です。