- 締切済み
サンプル通り入力してもエラーになり、PDFファイルが使えません。
市販のサンプル集を用いて、PHPを独学中の者です。プログラミング言語を学ぶのは今回が初めてです。 基本構文やフォームについて等を学び、現在「PDFファイルを使用する」という章を学習中なのですが、サンプル通り入力してもエラーが表示されてしまいます。 ・一つ目 <?php $pdf=pdf_new(); $fname="/file/testdir/test.pdf"; pdf_open_file($pdf, $fname); pdf_begin_page($pdf,595, 842); //A4:595-842 //A5:421-595 $font = pdf_findfont($pdf, "Century", "winansi", 1); pdf_setfont($pdf, $font, 20); pdf_show_xy($pdf, "TEST---".date("Y/m/d H:i:s"), 0, 800); pdf_end_page($pdf); pdf_close($pdf); ?> これは、 Fatal error: Uncaught exception 'PDFlibException' with message 'Function must not be called in 'object' scope' in C:\xampp\htdocs\_test\pdf_gen.php:5 Stack trace: #0 C:\xampp\htdocs\_test\pdf_gen.php(5): pdf_begin_ page() #1 {main} thrown in C:\xampp\htdocs\_test\pdf_gen.php on line 5 というエラーが出ます。 ・2つ目 <?php $pdf = pdf_new(); pdf_open_file($pdf, ""); pdf_begin_page($pdf, 595, 842); $font= pdf_findfont($pdf, "Times New Roman", "winansi", 1); pdf_setfont($pdf, $font, 20); pdf_set_text_pos ($pdf, 50, 800); for ($i=1;$i<=5;$i++) { pdf_continue_text($pdf,$i); } pdf_end_page($pdf); $buf=pdf_get_buffer($pdf); header("content-type: application/pdf"); header("content-length: ".strlen($buf)); echo $buf; ?> これに対しては Fatal error: Uncaught exception 'PDFlibException' with message 'Metrics data for font 'Century' not found' in C:\xampp \htdocs\_test\disp_pdf.php:7 Stack trace: #0 C:\xampp\htdocs\_test\disp_pdf.php(7): pdf_findfont() #1 {main} thrown in C:\xampp\htdocs\_test\disp_pdf.php on line 7 というエラーです。 もうひとつ別のスクリプトを記述した場合には、一つ目とほぼ同じエラーになります。 最初は、3つとも動かないということはPDFlibのインストール自体の問題かと思ったのですが、書かれた通りに設定したはずですし、何より一つ目と二つ目ではエラーの中身が異なることから、別々の問題なのだろうと考えています。 素人である私の推測に過ぎませんが、一つ目に関しては エラー自体は5行目だが、本当は3行目、 「$fname="/file/testdir/test.pdf";」の部分が問題なのかと考えています。 テキストに突然これが出てきたからそのまま入力してみましたが、"/file/testdir/test.pdf"のファイルは事前に用意しておかなければならなかったのでしょうか? もしそうなら、どこにどのように作れば良いのでしょうか? テキストの「表示例」のURL欄を見る限り、C:\file\testdir・・となっているのですが、C:の下にいきなり「file」というディレクトリを作れということなのですか? 2つ目については、単に「Century」というフォントの問題なのだろうと思い、php_findfontを調べたときの使用例で使われているのことの多かった「Times New Roman」などに変更してみたのですが、同様のエラーが表示されてしまいます。 これもやはり事前に何か(Centuryというフォントに関する何か)を用意しておかなければならないのでしょうか? 以上、2点について教えてください。よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- nyalio
- ベストアンサー率58% (20/34)
#1です。 こんにちわ。 前回私が書いた2行は無視してください。 その部分は解決したと見て問題ないようです。 で、今回のエラーは、お察しの通りFontが見つかりませんってことです。 'Century'という英字フォントをが見つからないと怒られています。(質問にあるとおりですね) フォントの指定なのですが、参考URLをご覧ください。 すごくよくまとまっていて、わかりやすいです。 findfontも古い関数で、PDFlib5で廃止されているとマニュアルに乗っていました。 質問者さんの環境ならload_fontをつかった方がよいです。 さらに、load_fontでは(というかPDFlibのローカルフォントとしては?)指定できるフォントは限られていて、 CenturyもTimes New Romanも指定できないようです。 (なのでエラーが出ている可能性が高いです) さらに、それらはすべて英字フォントなので、日本語が表示できません。 もし日本語出力が1文字でもあるようなら、 URLのサイトの <<日本語を使用する際の注意点>> をよくよんでください。 たぶん、ここからは自分が説明するよりも、URLをご覧いただいた方がわかりやすいので、丸投げします。 URLにあることでまた何かわからなければここで補足してください。 あと、URLにある「フォントを埋め込む」というのは、PDFにフォントファイルをくっつけて出力するので、非常にファイルが重くなります。メガを超えることも。ですので、あまりお勧めはしません。
- nyalio
- ベストアンサー率58% (20/34)
ちょっと気になったことがあるんですが、 お使いのPDFlibのバージョンとPHPのバージョンはおいくつですか? エラーの出ている箇所(pdf_begin_page) この関数ってかなり古い関数なのですよ。 今はたぶんほとんどのところで使われていません。 もしかすると、バージョン違いによるエラーかもしれませんので、 そちらを補足お願いします。 それから <?php $pdf=pdf_new(); $fname="/file/testdir/test.pdf"; を <?php var_dump(pdf_new()); exit; そして、画面に何が出力されるかをチェックしてみてください。 あまりないとは思いますが、もし bool(false) が帰ってきたら、このpdf_newの時点で失敗しています。 なんだか文字列がたくさんでてくるようなら、次の行も同じように var_dumpしてデバッグしてみてください。 近いどこかでfalseがかえっているはずです。
補足
ご回答、ありがとうございます。 また、補足が大変遅くなり、申し訳ありませんでした。 (回答通知の設定をしたつもりが、メールが来てませんでした。いずれにせよ、私の注意不足なのは間違いありません。失礼しました) PDFlibのバージョンはPDFlib6.0.2です。(サンプル集に付随されたCD-ROMからインストールしました) PHPのバージョンはPHP5.2.8です。(xampp最新版から、MySQLなどとセットでインストールしました) ご指摘くださった箇所なのですが、 $pdf=pdf_new(); $fname="/file/testdir/test.pdf"; の2行の代わりに(その2行は削除して) var_dump(pdf_new()); exit; を入力するということなのでしょうか? ところで、私が冒頭に書いた質問2つのうち、一つ目は解決したと思われます。 $fname="/file/testdir/test.pdf"; は、付録CDのファイルを示してたわけで、 一方、私がPHPを動かすときには C:\xampp\htdocs\_testの下にファイルをつくっていたわけで。 なので、その箇所を単純に $fname="test.pdf"と書き直したら、「そのエラーは」出なくなりました。 が、やはり今度は2つ目の質問と同じエラー Uncaught exception 'PDFlibException' with message 'Metrics data for font 'Century' not found' in C:\xampp\htdocs\_test\pdf_gen.php:10 Stack trace: #0 C:\xampp\htdocs\_test\pdf_gen.php(10): pdf_findfont() #1 {main} thrown in C:\xampp\htdocs\_test\pdf_gen.php on line 10 が表示されてしまいます。 もしおわかりでしたら、この部分のエラーの解決方法を教えてください。