Posted on

TCPDFでセキュリティー設定をしたPDFを作る

この前、閲覧、印刷のみできる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');