この前、閲覧、印刷のみできるPDFて作れる?
という需要があったので色々と調査してみた。(しかもPHP4で)
最初はTCPDF無理やと思って、FPDFとかで試していたのですが、
実はPDF4バージョンもあることがわかった。
今回は、
PDFで「印刷禁止」「文字等コピー禁止」「編集禁止」「パスワード」「有効期限」「ローカルPCで開くの禁止」を
テストしてみました。
印刷禁止、文字等コピー禁止、編集禁止、パスワード
// PDFオブジェクト作成 $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); // 第1引数 // print:印刷禁止 // copy:文字等コピー禁止 // modify:編集禁止 // 第2引数 閲覧パスワード // 第3引数 セキュリティ変更パスワード(引数なしはランダムパスワード) $pdf->SetProtection(array('print', 'copy', 'modify'), 'password', 'password2'); // フォント設定 $pdf->SetFont('arialunicid0', '', 16); // 新規ページ作成 $pdf->AddPage(); // 文字表示 $pdf->Write(0, "表示したい文字", '', 0, 'L', true, 0, false, false, 0); // PDF出力 $pdf->Output('pdf_name.pdf', 'I');
有効期限
// PDFオブジェクト作成 $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); // フォント設定 $pdf->SetFont('arialunicid0', '', 16); // 新規ページ作成 $pdf->AddPage(); // 文字表示 $pdf->Write(0, "表示したい文字", '', 0, 'L', true, 0, false, false, 0); // javascript設定 $script = "theDay = new Date(2011, 6 - 1, 15, 0, 0, 0);\n"; $script .= "now = new Date();\n"; $script .= "if (theDay < now)\n"; $script .= "{\n"; $script .= "this.closeDoc(true);\n"; $script .= "}\n"; $pdf->IncludeJS($script); // PDF出力 $pdf->Output('pdf_name.pdf', 'I');
ローカルPCで開くの禁止
// PDFオブジェクト作成 $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); // フォント設定 $pdf->SetFont('arialunicid0', '', 16); // 新規ページ作成 $pdf->AddPage(); // 文字表示 $pdf->Write(0, "表示したい文字", '', 0, 'L', true, 0, false, false, 0); // javascript設定 $script = "cdata = \"http://xxxxxxxx/sample/tcpdf/tcpdf_test.php\";\n"; $script .= "var urldata = this.path;\n"; $script .= "var f = this.getField(\"ooi\");\n"; $script .= "if (urldata != cdata) { \n"; $script .= "this.closeDoc(true);\n"; $script .= "} \n"; $pdf->IncludeJS($script); // PDF出力 $pdf->Output('pdf_name.pdf', 'I');
「印刷禁止」「文字等コピー禁止」「編集禁止」「パスワード」はテストした数種類のPDFビューアーできちんと動くのですが、
「有効期限」「ローカルPCで開くの禁止」はjavascriptで動いてるのでjavascriptが効かないビューアーやavascriptを動かない設定にしてしまえばPDFは見れてしまいます。
じゃあ、サイト内のブラウザでだけPDFを閲覧、印刷したい時はどうすれば出来るのかと、えていたのですが、ブラウザからPDFをダウンロードさせないのはかなり難しかったので、ーカルに落としたら見えなくすればいいと思いました。
まず、「編集禁止」「文字等コピー禁止」「ローカルPCで開くの禁止」を設定します、の時にPDFの1番上にPDF全体を覆うPDFのフォームを設置して、たの文字を見えなくします。
それで、サイト内の指定したURLの時だけ、jacascriptでPDFの1番上のPDF全体を覆うPDFのフォームを表示にします。
こうすることで、ローカルに落とした時はPDFを開いても真っ白、フォームのエレメント削除も編集不可なので、削除できない!
よし!閲覧の制限は完璧と思ったのですが、刷するとフォーム無視されて、下の文章だけ印刷されてしまいました。
この後色々模索したんですが、いい解決方法見つからず、
とりあえず、「印刷禁止」にしてしまえばブラウザ内閲覧専用PDFは作れます。
まあ、一応実用性は多少あるんじゃないかと。
以下、ブラウザ内閲覧専用PDFコードです。
// PDFオブジェクト作成 $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); // セキュリティ設定 $pdf->SetProtection(array('print', 'copy', 'modify'), '', 'password2'); // フォント設定 $pdf->SetFont('arialunicid0', '', 16); // 新規ページ作成 $pdf->AddPage(); // 文字表示 $pdf->Write(0, "表示したい文字", '', 0, 'L', true, 0, false, false, 0); // 最前面のマスク $pdf->TextField('mask', 210, 297, array(), array(), 0, 0); // javascript設定 $script = "cdata = \"http://xxxxxxxx/sample/tcpdf/tcpdf_test.php\";\n"; $script .= "var urldata = this.path;\n"; $script .= "var f = this.getField(\"mask\");\n"; $script .= "if (urldata != cdata) { \n"; $script .= "f.display = display.visible; \n"; $script .= "this.closeDoc(true);\n"; $script .= "} else { \n"; $script .= "f.display = display.hidden; \n"; $script .= "}\n"; $pdf->IncludeJS($script); // PDF出力 $pdf->Output('pdf_name.pdf', 'I');