【PHP】TCPDF 4.5.xxx+FPDIで既存PDFの読み込みと編集

TCPDF 4.5 + FPDI 1.2.1で既存PDFを編集しようとしてみたけど、バージョンの関係で動かず。どうしたものかと思ったらfpdi.phpを修正するパッチがありました。ここから。

FPDIのバージョンアップで対応すると思いますが、取り急ぎの場合はこれで解決。
<2009/03/22 追記>
最新のFPDI 1.3でパッチを当てなくても正常に動作することを確認。

日本語が含まれたPDFを読み込んでも正常に表示。独自にフォントを追加した場合はファイルサイズが大きくなるけど、フォントを埋め込んでいるのでこれはしょうがない。

TCPDFの標準日本語フォントを使った場合はファイルサイズは大きくならなかった。
・・・ということは、日本語OS以外で開いた場合は文字化けしそう。・・・ま、いっか。

TCPDFのマニュアルは下記サイトが分かりやすい。

TCPDFに関するリファレンス

 

<インストール方法>

TCPDFをダウンロードしてきて、TCPDFというフォルダに保存。

FPDIのダウンロードサイトからFPDIとFPDF_TPLをそれぞれダウンロードしてきてFPDIとフォルダに保存。もちろんパッチを適用しとく。FPDF_TPLはFPDIフォルダに置く。

次は2つのコンポーネントを読み込むPHPファイルを作成。

set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . '/FPDI');
require('TCPDF/config/lang/jpn.php');
require('TCPDF/tcpdf.php');
require('FPDI/fpdi.php'); 

class exPDF extends FPDI
{
}

これをexPDF.phpの名前で保存したとすると、動作確認は次のような感じ。

require_once('exPDF.php');

$objPdf =& new exPDF();
$objPdf->AddPage();
$objPdf->setSourceFile('template.pdf');
$iIndex = $objPdf->importPage(1);
$objPdf->useTemplate($iIndex);

$objPdf->SetFont("kozgopromedium", "", 9);
$objPdf->MultiCell(0, 0, "テスト", 1, 'R', 0, 1, 100, 10);

$objPdf->Output('newpdf.pdf', 'F');

TCPDF/config/lang/jpn.phpはeng.phpをコピーして作る。ファイルの文字コードはUTF-8で保存。

$l = Array();

// PAGE META DESCRIPTORS -----------------

$l['a_meta_charset'] = "UTF-8";
$l['a_meta_dir'] = "jpn";
$l['a_meta_language'] = "ja";

// TRANSLATIONS ---------------------------
$l['w_page'] = "ページ";

<関連記事>

コメント

  1. TCPDF+FPDIは、参考にできるページが少なく、こちらは大変参考になります。

    ただ、私の方でTCPDF4.7+FPDI1.3で、うまく動作させることができません。
    TCPDF単体では動作できますし、色々調べてみて、パスも問題はなさそうです。

    一つ、お尋ねさせて頂ければと思うのですが、FPDIはTCPDFをextendsしているので、FPDIを使わないような書き方…つまり

    $objPdf = new exPDF();
    $objPdf->AddPage();
    $objPdf->SetFont("kozgopromedium", "", 9);
    $objPdf->MultiCell(0, 0, "テスト", 1, 'R', 0, 1, 100, 10);
    $objPdf->Output('newpdf.pdf', 'I');

    でも動作するものでしょうか。?

    FPDFを含めて、実装経験がないのでトンチンカンな質問になっているかもしれませんが、もし「動作する」ということであれば、そこからつぶしていこうと思っています。

    返信削除
  2. > macchakaさん
    こんにちは。
    やろうとされているサンプルプログラムでも動作するはずです。
    ・・・が、私が実際に試したところTCPDF 4.7だと動作しないようです。
    今のところFPDIのバージョンが上がるか、修正パッチを見つけるか、自分で対処するしかないようですね。
    私はTCPDF 4.5を使っていたので、そちらをお勧めします。

    返信削除
  3. > ・・・が、私が実際に試したところTCPDF 4.7だと動作しないようです。

    ガ━━(゚Д゚;)━━━ン!!

    わ、私の苦労っていったい・・・w


    すみません、わざわざ試して頂いたんですね。ありがとうございます。

    4.5を探してきます。

    返信削除
  4. ちなみに4.6系でも大丈夫のようです。
    前のバージョンの取得方法は(私は昔分からなかったので)、SourceForgeのDevelopから
    http://sourceforge.net/projects/tcpdf/develop

    browse code→summary
    でほしいバージョンのsnapshotをクリックするとダウンロードできます。

    返信削除
  5. 4.5を探してみましたが、sourceforgeの方では4.7の最新版しか見つかりませんでした。

    こ、これは4.7と対決するしかないな、と色々探してみて、やっと問題が見つかりました。

    http://sourceforge.net/forum/forum.php?thread_id=3383094&forum_id=435310

    これによると、FPDI側のバグらしいのですが、4.5だと動くのは不思議です。もしくはFPDIも最新版を落としているので、そのあたりの問題なのかもしれませんが。

    いずれにしても、今、最新版を落として動かなくて困っている人のために書き残しておきます(笑)

    英語が苦手な人のために念のため、
    fpdi.phpの_newobj()の最後に
    return $obj_id;
    を足す、ということです。一応僕のところでは、これで動くようになりました。

    返信削除
  6. 4.8.001 使用で

    > fpdi.phpの_newobj()の最後に
    > return $obj_id;

    を試したところ、PDFを開くときに (110)エラーが出なくなりました。
    ありがとうございます。
    ただ、Text() が文字化けしているので・・・私のテンプレートが悪いのかもしれませんね f^^;

    返信削除
  7. ↑解決しました

    $pdf->setLanguageArray($l);

    を忘れてました orz

    返信削除
  8. fpdiがバージョンアップしていたので先ほど試したところ

    tcpdf 4.8.001
    fpdi 1.3.1
    fpdf_tpl 1.1.3

    でコードを修正することなく動きました。

    実行したサンプルコード

    require_once('exPDF.php');

    $objPdf =& new exPDF();
    $objPdf->AddPage();
    $objPdf->setSourceFile('template.pdf');
    $iIndex = $objPdf->importPage(1);
    $objPdf->useTemplate($iIndex);

    $objPdf->SetFont("kozgopromedium", "", 9);
    $objPdf->MultiCell(0, 0, "テスト", 1, 'R', 0, 1, 100, 10);

    $objPdf->Output('newpdf.pdf', 'I');

    参考に。

    返信削除
  9. 早速 fpdi 1.3.1 DLしてきました。
    fpdi 1.3 での苦労が何だったのかというくらいあっさり出来ました。
    ありがとうございます。

    返信削除
  10. 結局、タイミングが悪かったってことですかねぇ。複雑。。。

    ま、動けばよし!(爆

    みなさんのおかげで快適に使えます。ありがとうございます!

    返信削除
  11. 有用な記事をありがとうございます。

    サンプルのプログラムを走らせて見たのですが、「Warning: fopen(newpdf.pdf) [function.fopen]: failed to open stream: 許可がありません in /home/**************/TCPDF/tcpdf.php on line 8625
    TCPDF ERROR: Unable to create output file: newpdf.pdf」というエラーメッセージが出てしまいます。

    調べてみたところ、パーミッションかセーフモードが原因かと考えていますが、技量が足りずどうやっても解決できません。

    いいアドバイスをいただけたら幸いです。
    よろしくお願いいたします。

    返信削除
  12. >Unknownさん
    エラーメッセージを見るかぎり、newpdf.pdfを書き込む権限がないので、例えば「test」フォルダを作成して、書き込み権限を与え

    $objPdf->Output('test/newpdf.pdf', 'I');

    と変更して、実行すれば大丈夫かと思います。

    返信削除

コメントを投稿

このブログの人気の投稿

既存のディレクトリ(フォルダ)にgit cloneして上書きしたい

スタートアップで起動するアプリを停止する方法

オンサイトサポートとは(=出張サポート)