FPDF : してログ

PhD cat
PhD cat

PHP のマニュアルは DocBook という形式で整備されており、HTML や PDF などに変換して利用することができます。公式からダウンロードできる HTML 版が以前のようなシンプルなものでは無く、スタイルシートが適用された活用し難いものだったのでトライしてみたのですが、結論から言うと同じ構成のものが生成されるようです。そのため公式にない PDF を作りたい場合など、参考程度にどうぞ。

作業に必要なパッケージの確認

subversion と git が必要になりますので、入ってない場合は下記コマンドにてインストールしておきます。

yum install subversion
yum install git

XML ドキュメントを取得

マニュアルの日本語 XML ソースをリポジトリから取得します。

svn co https://svn.php.net/repository/phpdoc/modules/doc-ja doc-ja

続いてソース内の configure.php を実行しますが、-with-lang=ja を指定しないと英語版が出力されるのでご注意ください(処理時間も長いので)。

cd ~/php-docs/doc-ja
php doc-base/configure.php --with-lang=ja --enable-xml-details

関係ありませんが下記のような「AA」が出てきたのでご紹介します。

All good. Saving .manual.xml... done.
All you have to do now is run 'phd -d /root/php-docs/doc-ja/doc-base/.manual.xml'
If the script hangs here, you can abort with ^C.
         _ _..._ __
        \)`    (` /
         /      `\
        |  d  b   |
        =\  Y    =/--..-="````"-.
          '.=__.-'               `\
             o/                 /\ \
              |                 | \ \   / )
               \    .--""`\    <   \ '-' /
              //   |      ||    \   '---'
         jgs ((,,_/      ((,,___/

 (Run `nice php configure.php` next time!)

PhD(DocBook を PHP マニュアルに変換するツール)

以下のコマンドにて PhD をリポジトリから取得します。

cd ~/php-docs
git clone http://git.php.net/repository/phd.git

ここで生成処理が大量にメモリを消費するようなので、実行する前に PHP の使用メモリの上限を上げておきます。今回は memory_limit = 512M と設定してみました(php.ini を編集)。準備ができたら、xhtml 形式で randered-docs ディレクトリに生成します。

cd ~/php-docs/phd
php render.php --docbook ~/php-docs/doc-ja/doc-base/.manual.xml --package PHP --format xhtml --output ~/php-docs/rendered-docs

PDF 出力するには、--format pdf としますが、HaruDoc が必要になります。HaruDoc は今回はじめて聞いたのですが、使えそうな PDF 生成エンジンのようです。今回は試しませんが FPDF の代わりに今度使ってみようと思います。

マニュアル最新版のバグ

関数一覧ページがバグっていたので書いておきます。マルチバイト文字を ASCII として扱おうとしてバグっているように見えますが、ソース等確認していないのでわかりません。ちなみに、公式からダウンロードできる HTML もそうなっています。

indexes.functions.html
indexes.functions.html

FPDFは円や楕円を描画するメソッドがありません。 ググってみたところ、FPDFのクラスを継承して描画メソッドを追加する例が見つかりました。 日本語環境では、japanese.php を使っていると思いますので、この PDF_Japanese クラスのメソッドに追加します。 具体的には、下記コードを japanese.php の“class PDF_Japanese extends FPDF { ... }”の中にコピペしてください。 オリジナルを残しておきたい場合は、japanese.php のコピーで行って下さい。

円や楕円を描画するメソッド
function Circle($x, $y, $r, $style='D')
{
    $this->Ellipse($x,$y,$r,$r,$style);
}

function Ellipse($x, $y, $rx, $ry, $style='D')
{
    if($style=='F')
        $op='f';
    elseif($style=='FD' || $style=='DF')
        $op='B';
    else
        $op='S';
    $lx=4/3*(M_SQRT2-1)*$rx;
    $ly=4/3*(M_SQRT2-1)*$ry;
    $k=$this->k;
    $h=$this->h;
    $this->_out(sprintf('%.2F %.2F m %.2F %.2F %.2F %.2F %.2F %.2F c',
        ($x+$rx)*$k,($h-$y)*$k,
        ($x+$rx)*$k,($h-($y-$ly))*$k,
        ($x+$lx)*$k,($h-($y-$ry))*$k,
        $x*$k,($h-($y-$ry))*$k));
    $this->_out(sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c',
        ($x-$lx)*$k,($h-($y-$ry))*$k,
        ($x-$rx)*$k,($h-($y-$ly))*$k,
        ($x-$rx)*$k,($h-$y)*$k));
    $this->_out(sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c',
        ($x-$rx)*$k,($h-($y+$ly))*$k,
        ($x-$lx)*$k,($h-($y+$ry))*$k,
        $x*$k,($h-($y+$ry))*$k));
    $this->_out(sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c %s',
        ($x+$lx)*$k,($h-($y+$ry))*$k,
        ($x+$rx)*$k,($h-($y+$ly))*$k,
        ($x+$rx)*$k,($h-$y)*$k,
        $op));
}
利用方法
require('japanese.php');

$pdf=new PDF_Japanese();
$pdf->AddPage();
$pdf->Ellipse(100,50,30,20);
$pdf->SetFillColor(255,255,0);
$pdf->Circle(110,47,7,'F');
$pdf->Output();