システム開発をするときに、phpのプログラムからPDFを作るためにはmpdfを使っています。mpdfは便利なのでWordPressでも使えないかなと思って探してみたら wp-mpdf というプラグインが見つかったので試してみました。
方法としてプラグインをハックしたりしますのでもし真似する場合は充分に注意して行って、決していきなり本番運用中のサイトでは行わないようにお願いしますm(_ _)m
追記:あたりで色々な問題に直面しましたので、ご利用は慎重に!お願いしますm(_ _)m
wp-mpdfをインストールする
プラグイン>新規追加 から
wp-mpdfを検索します。
このように表示されますので、 いますぐインストール をクリックします。
インストールの後、プラグインを有効化しておきます。
いきなり問題発生!
プラグインをインストールして有効化しただけでいきなり問題が発生しました。コンテンツを表示させると、
このようにコンテンツの頭に
Notice: format_to_post の使用はバージョン 3.9 から非推奨になりました。代替は用意されておりません。 in
のようなエラーが出てしまっています。format_to_postという関数が非推奨になっているようです(>_<)。うーん、困った…ええぃ!と該当の wp-mpdf\wp-mpdf.php
264行目付近の
format_to_post('the_content');
をコメントアウト
// format_to_post('the_content');
してしまいました。
エラーが出なくなりました(^^)/。
動作に問題が起こらないかなぁと心配しましたが、特に問題が出てこなかったので結果オーライでこのまま進めます。
PDFボタンを表示する
wp-mpdfのページにボタンの付け方が載っています。
4.Add to your template "<?php if(function_exists('mpdf_pdfbutton')) mpdf_pdfbutton(); ?>" as a small button or "<?php if(function_exists('mpdf_pdfbutton')) mpdf_pdfbutton(false, 'my link', 'my login text'); ?>" as a textlink. The second text specifies the text which should displayed if you have checked "needs login" and a user isn't logged in. (if you wish to open the pdf print in a new tab you may pass "true" for the first parameter)
この部分がボタンについての説明だと思います。一番最初に書いてある small button を付けてみたいと思います。
templateのどこかにこのコードを貼り付けておけば使えそうなので、投稿のsingleページでPDFボタンを表示してみようと思います。
子テーマの content.php を開き、
</div><!-- .entry-content -->
の直前に、
<?php if ( is_single() ) : if(function_exists('mpdf_pdfbutton')) mpdf_pdfbutton(); endif; ?>
投稿のsingleページだったらPDFボタンを表示する、みたいな感じでコードを入れて保存します。そうするとコンテンツの下部に、
こんな感じで小さなPDFボタンが表示されました。
デフォルト状態で動作確認をしてみました。エラー発生
この状態で動作確認をしてみます。
Notice: Trying to get property of non-object in /virtual/ryus/ryuscojpblog/wp-content/plugins/wp-mpdf/wp-mpdf.php on line 450 Warning: Cannot modify header information - headers already sent by (output started at /virtual/ryus/ryuscojpblog/wp-content/plugins/wp-mpdf/wp-mpdf.php:450) in/virtual/ryus/ryuscojpblog/wp-content/plugins/wp-mpdf/mpdf/mpdf.php on line 7447 Warning: Cannot modify header information - headers already sent by (output started at /virtual/ryus/ryuscojpblog/wp-content/plugins/wp-mpdf/wp-mpdf.php:450) in/virtual/ryus/ryuscojpblog/wp-content/plugins/wp-mpdf/mpdf/mpdf.php on line 1736 mPDF error: Some data has already been output to browser, can't send PDF file
このようなエラーが表示されました。
これはちょっと解決するのに時間がかかってしまい、あれこれ試したのですが原因がわかれば単純なことでした。
インストールした直後に見たような感じで、PDF出力時にもNoticeが出力されているのでその後のheaderを出すときに既に表示されている、というエラーになっているようです。これが出るか出ないかはエラーレベルの指定によるので、お使いの環境がNoticeを出さない設定であればこれは出ないので以下のハックについてはパスしてください。
出ちゃう場合なのですがちょっと乱暴ですが、Noticeが出ないようにしてみます。
wp-mpdf\wp-mpdf.php の 450行目
mpdf_output($pdf_output, true, $outputToBrowser, $dsatz->pdfname, $templatePath);
を
// notice off error_reporting(E_ALL & ~E_NOTICE); mpdf_output($pdf_output, true, $outputToBrowser, $dsatz->pdfname, $templatePath); // notice on error_reporting(E_ALL);
のようにします。noticeが出てしまう行の前で一旦出さないようにしておいて、その行が終わったら出すようにするというものです。ちゃんとやるためには修正前のエラー表示状態をちゃんと把握しておかないといけないかとは思うのですが、自分のサイトでまぁこういう感じでいいかなと思ったら上記のように修正してみてください。
これで、エラーは出なくなりPDFが表示されました。
日本語文字化けを修正する
エラーは出ないようになりましたが、画像以外の日本語が文字化けしています。mpdfを使ったことがあるので日本語が出るようにするには調整が必要と思っていましたのでここではあまり慌てませんでした(^^)/。
このプラグインの場合はどこをなおしたらいいかなと探ってみて、ハックする箇所がわかりました。
wp-mpdf\mpdf\config_cp.php
の
switch($lang){ CASE "en":
の直前に、
// for japanese $lang = 'ja'; $adobeCJK = true; switch($lang){ CASE "en":
コメントを含め3行追加してこういう感じにします。
wp-mpdfの設定画面の修正してキャッシュをクリアする
これでOKですが、先ほど表示したPDFを再表示する前に、
ダッシュボード>設定>wp-mpdf
からキャッシュを消したいと思います。
こちらもだいぶたくさんnoticeが出てしまっています。該当ソースの該当部分を見るとどうも $path という変数がないのに使っているからエラーが出てしまってるようです。
wp-mpdf\wp-mpdf_admin.php の 479行目の
if(!is_dir($path.$file) && $file != "." && $file != "..") { を if(!is_dir(dirname(__FILE__).'/cache/'.$file) && $file != "." && $file != "..") {
にして 494行目の
if(!is_dir($path.$file) && $file != "." && $file != "..") { を if(!is_dir(dirname(__FILE__).'/cache/'.$file) && $file != "." && $file != "..") {
にします。これで、エラーがなくなるので
Clear Cache をクリックすると、
キャッシュがクリアされます。これをしておかないとキャッシュがあるPDFについては再作成されないようなので注意が必要です。
キャッシュを使わない、という方法もありこの設定画面の
cacheという項目のチェックを外してsaveすればよいようです。
日本語文字化けが直ったことを確認して、修正終了♪
ということでこれで先ほどのPDFを表示してみると
このように日本語も文字化けせずにちゃんと表示されました(^^)/
まとめ:WordPressから簡単にPDFできるこのプラグインは超便利!
コメントアウトした部分がもしかするとそういう作用をしていたのかもしれませんがデザインが適用されていません(例、h2など)。その辺もうまいこと表示しているデザインと同じようなかんじにできたらいいなと思いますので、今後ちょっと調べたいと思います。
しかし、このプラグインを入れておけば簡単にPDFとして表示され、保存すればPDFファイルにもなるのでとても便利です。blogサイトだけでなく、業務的にもWordPressで作成されたサイトなどではかなり便利に使えそうです。
このblogでも各記事の一番下の方に小さいPDFボタンを表示してあるので押してみて動作を確認してみてください(^^)/。
実際にお使いになるには、ここに書いたようにいくつかハックする必要がありそうなので利用には注意が必要そうです。
も、もしかするとオプションの設定などでハックしなくてもできる!とかあるのかもしれませんが、その方法がわかったら是非是非教えてくださいませm(_ _)m
追記:他にもエラーが出ているところがありましたorz
今日blogを書こうと思って新規投稿画面を見たら、抜粋の上あたりに
こんな感じにエラーが出まくっていました(^_^;。まだまだ色々出てきそうですが、一応これは…この入力欄の意味がよくわからないので表示しないようにしようと思います。
*くさいものにふたというか…
plugins\wp-mpdf\wp-mpdf.php
の、
if(function_exists('add_meta_box')) { add_meta_box('mpdf_admin', 'wp-mpdf', 'mpdf_admin_printeditbox', 'post', 'normal', 'high'); add_meta_box('mpdf_admin', 'wp-mpdf', 'mpdf_admin_printeditbox', 'page', 'normal', 'high'); } else { add_action('dbx_post_advanced', 'mpdf_admin_printeditbox_old'); add_action('dbx_page_advanced', 'mpdf_admin_printeditbox_old'); }
あたりでこの辺を表示しているみたいなので、
if(function_exists('add_meta_box')) { // add_meta_box('mpdf_admin', 'wp-mpdf', 'mpdf_admin_printeditbox', 'post', 'normal', 'high'); // add_meta_box('mpdf_admin', 'wp-mpdf', 'mpdf_admin_printeditbox', 'page', 'normal', 'high'); } else { // add_action('dbx_post_advanced', 'mpdf_admin_printeditbox_old'); //add_action('dbx_page_advanced', 'mpdf_admin_printeditbox_old'); }
コメントにしてしまいました。これで、
投稿画面にwp-mpdfオプションが出なくなりました。
と、思ったのもつかの間、blogを書いているときに再度エラーに見舞われました。
どうやら投稿記事を修正して保存するときにPDFを作り替えているようです。そこでまた同じようなnoticeが出て、ということが起こっています。基本的に今後は設定でキャッシュを使わないという設定にして、noticeが出そうな所は極力コメントアウトしていきます(ちょっとかなりやっつけ気味です。自分のサイトでないとできないかも)。
今回は、plugins\wp-mpdf\wp-mpdf.php の
add_action('save_post', 'mpdf_admin_savepost');
が引っかかっていたので、
//add_action('save_post', 'mpdf_admin_savepost');
コメントアウトしました。
コメント