技術ブログ - 毎日が成長!

2009年3月 のアーカイブ

libHaruを使ったPDFの生成

2009年3月30日 by ogura

PHPでPDFファイルを生成する場合、PDFlibFPDFを利用するというケースが多いと思います。

どちらもフォントの設定を行うことで日本語が扱えますし、情報も豊富なのですが、つい先日、日本人の方が開発されたlibHaruというPDF生成ライブラリを発見しました。日本国内での知名度はあまり高くないようですが、なかなか高機能でしたので、これをPHPから使ったらどんな感じになるのかMac OS X上で試してみました。

libHaruとは?

libHaruは、2005年度下期未踏ソフトウェア創造事業で採択されたフリーでクロスプラットフォームなPDF生成ライブラリです。ANSI Cで書かれているため多くの環境で利用でき、C言語の他に

  • Ruby
  • Delphi/Free Pascal
  • C#
  • PHP
  • Perl
  • FreeBasic

といった言語向けのバインディングも用意されています。

機能

libHaruのサイトで挙げられている機能は以下の通りです。

  • 線、文字、画像を含むPDFファイルの生成
  • アウトライン、テキスト注釈、リンク注釈
  • ドキュメントの圧縮
  • PNGおよびJPEG画像の埋め込み
  • Type1フォントおよびTrueTypeフォントの埋め込み
  • 暗号化PDFファイルの生成
  • 多くの文字集合の利用 (ISO8859-1〜16, MSCP1250〜8, KOI8-R)
  • CJKフォントおよびエンコーディングのサポート

特に最後の点は日本人には嬉しいところ。フォントさえ存在していれば、MS明朝やMSゴシックといったフォントを特に設定をすることなく利用できます。

インストール

Mac OS Xの場合は、MacPortsにlibHaruが登録されているので以下のようにしてインストールすることができます。

$ sudo port install libharu

さらに、PHPからlibHaruを利用するためには、PECLに用意されているharuパッケージをインストールします。

$ sudo pecl install haru
(中略)
 1. Please provide the prefix of libharu installation : autodetect

1-1, 'all', 'abort', or Enter to continue:

インストール中に上記のように表示されlibHaruのインストール先を訊かれるので、allと入力しEnterキーを押した後、パスを入力します。MacPortsでインストールしている場合は/opt/localとします。入力後、再度Enterキーだけを押すとharuモジュールのビルドが始まります。

1-1, 'all', 'abort', or Enter to continue: all
Please provide the prefix of libharu installation [autodetect] : /opt/local
 1. Please provide the prefix of libharu installation : /opt/local

1-1, 'all', 'abort', or Enter to continue:
(中略)
Build process completed successfully
Installing '/opt/local/lib/php/extensions/no-debug-non-zts-20060613/haru.so'
install ok: channel://pecl.php.net/haru-1.0.0
configuration option "php_ini" is not set to php.ini location
You should add "extension=haru.so" to php.ini

ビルドが完了すると上記のようにモジュールがインストールされたパスが表示されるので、php.iniに以下のように設定を追加してharu.soが読み込まれるようにしておきます。

extension_dir="/opt/local/lib/php/extensions/no-debug-non-zts-20060613/"
extension=haru.so

使用例

では、早速PHPからlibHaruを利用して日本語を含んだPDFファイルを生成してみましょう。

<?php
// ドキュメントインスタンスを生成する
$doc = new HaruDoc;

// 日本語エンコーディングを利用する
$doc->useJPEncodings();

// 日本語フォントを利用する
$doc->useJPFonts();

// ドキュメントに新しいページを追加する
$page = $doc->addPage();

// ページのサイズと向きを設定する
$page->setSize(HaruPage::SIZE_A4, HaruPage::LANDSCAPE);

// MSゴシックをCP932エンコーディングで利用する
$font = $doc->getFont('MS-Gothic', '90ms-RKSJ-H');

// フォントのサイズを設定する
$page->setFontAndSize($font, 60);

// 塗の色を設定する
$page->setRGBFill(0, 0, 0);

// 文字を出力する
$page->beginText();
$page->textOut(210, 270, mb_convert_encoding('テストです。', 'SJIS-win', 'UTF-8'));
$page->endText();

// 結果をPDFファイルに保存する
$doc->save('./test.pdf');

上記のコードをUTF-8で保存して実行すると、以下の画像のようなPDFファイルが生成されます。

libHaruの使用例

次回は、Linux上でlibHaruを使用する場合のインストール手順を紹介します。

 

PHP 5.3.0RC1リリース

2009年3月26日 by ogura

PHPの次期バージョン5.3.0のRelease Candidate 1が[PHP-QAT: Quality Assurance Team]にて公開されましたので、早速作業用のMacBookでビルドしてみました。とりあえずコマンドラインでの動作・検証が目的なのでSAPIモジュールはCGIのままで。

$ wget http://downloads.php.net/johannes/php-5.3.0RC1.tar.bz2
$ tar xvf php-5.3.0RC1.tar.bz2
$ cd php-5.3.0RC1
$ ./configure --prefix=/Users/ogura/apps/php-5.3.0RC1 \
--enable-mbstring \
--with-gd \
--with-jpeg-dir=/opt/local \
--with-png-dir=/opt/local \
--with-xpm-dir=/opt/local \
--with-freetype-dir=/opt/local \
--with-iconv=/opt/local \
--with-zlib-dir=/opt/local \
--with-pgsql=/usr/local/postgresql/current \
--with-pdo-pgsql=/opt/local/lib/postgresql83 \
--with-pdo-sqlite=/opt/local \
--with-xsl=/opt/local \
--enable-sqlite-utf8 \
--enable-zend-multibyte
$ make
$ make test
=====================================================================
TEST RESULT SUMMARY
---------------------------------------------------------------------
Exts skipped    :   45
Exts tested     :   33
---------------------------------------------------------------------

Number of tests : 9699              7298
Tests skipped   : 2401 ( 24.8%) --------
Tests warned    :    5 (  0.1%) (  0.1%)
Tests failed    :  151 (  1.6%) (  2.1%)
Expected fail   :    5 (  0.1%) (  0.1%)
Tests passed    : 7137 ( 73.6%) ( 97.8%)
---------------------------------------------------------------------
Time taken      :  663 seconds
=====================================================================
$ make install

$ ~/apps/php-5.3.0RC1/bin/php -v
PHP 5.3.0RC1 (cli) (built: Mar 26 2009 19:08:14)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies

とりあえずテスト、インストールまでを確認。

今後、既存のシステムのPHP 5.3への対応も必要となってくるので、とりあえずPHP 5.3のアップグレード・ノートを翻訳しておきました。今回は、やはりネームスペースのサポートが一番の目玉といえそうですが、それ以外にも色々と大きな変更があるようなので充分な検証が必要そうです。

アップグレード・ノート – PHP 5.3

予約語とクラス名

  • namespaceおよびgotoは予約語となりました
  • Closureは予約されたクラス名となりました (ラムダとクロージャで使用)

既存の関数に対する変更点

  • 配列関数natsort()、natcasesort()、usort()、uasort()、uksort()、array_flip()およびarray_unique()は、引数としてオブジェクトを受け付けなくなりました。オブジェクトのプロパティにアクセスする必要がある場合は、初めにオブジェクトの配列にキャストしてください
  • var_dump()の出力にオブジェクトのプライベートなメンバが含まれるようになりました
  • セッションの開始に失敗した場合にsession_start()がFALSEを返すようになりました
  • デフォルトでは、clearstatcache()はリアルパス(realpath)キャッシュをクリアしないようになりました
  • ファイルシステム関数opendir()、scandir()、dir()は、引数でコンテキストが指定されなかった場合、デフォルトコンテキストを使うようになりました
  • 引数を参照渡しで受け取る関数に、値渡しで引数を渡した場合の振る舞いが変更されました。これまで値渡しの引数が許容されていた部分で警告が発生するようになり、すべての参照渡し引数はNULLにセットされます。
  • 次の数学関数がネイティブサポートとなりました: asinh()、acosh()、atanh()、log1p()、expm1()
  • GDエクステンションにおいて、imagefilter()関数によるピクセレーション(pixelation)がサポートされました
  • crypt()がBlowfishとExtended DESをサポートしました。また、crypt()の機能は100%ポータブルなものとなり、システムでアルゴリズムがサポートされていない場合にPHPに含まれる実装が使われるようになりました
  • get_cfg_var()は配列形式のINIオプションを返せるようになりました
  • ストリーム・ラッパーをinclude_path()から使えるようになりました
  • 以下の新しいパラメータが増えました:
    • clearstatcache(): clear_realpath_cache と filename
    • copy(): context
    • fgetcsv(): escape
    • ini_get_all(): details
    • nl2br(): is_xhtml
    • parse_ini_file(): scanner_mode
    • round(): mode
    • stream_context_create(): params
    • strstr(), stristr(): before_needle

既存のメソッドに対する変更点

  • マジックメソッド __get()、__set()、__isset()、__unset()、__call()は常にパブリックメソッドとして定義すべきとなり、またスタティックメソッドとしての定義はできなくなりました。メソッドシグネチャは強制です
  • __toString()マジックメソッドは引数を受け取れなくなりました
  • 新しいマジックメソッドとして__callStatic()が追加されました
  • count()とcount_elements()ハンドラの適用ルールが変更されました(カスタムPHPエクステンションに問題を発生させる可能性があります)
  • SplFileInfoおよび他のディレクトリクラスにおいて末尾のスラッシュが取り除かれるようになりました
  • SplFileInfo::getpathinfo()がパス名に関する情報を返すようになりました
  • 新しいパラメータ:
    • Exception::__construct(): previous

既存のクラスに対する変更点

  • SplObjectStorageがArrayAccessをサポートしました。SplObjectStorage内のオブジェクトにキーの関連付け情報を格納することができます

推奨されなくなったもの

  • Ticks: 定義(ticks=N)とregister_tick_function()はどちらもE_DEPRECATED警告を発生させます
  • define_syslog_variables()は非推奨となりました
  • すべてのereg関数は非推奨となりました。代わりにPCRE(`preg_*())を使ってください

非推奨ではなくなったもの

  • 多くの要望により、is_a()は非推奨ではなくなりました

エクステンション

  • PECLに移動しメンテナンスが続けられているもの
    • fpdf
    • ming
    • ncurses
  • もうメンテナンスされていないもの
    • dbase
    • fbsql
    • msql
    • sybase (まだPHPコアに含まれているsybase_ctを使ってください)
  • 振る舞いが変わったもの
    • hash: SHA-224ハッシュアルゴリズムがサポートされました
    • oci8a: 永続的な接続または永続的な接続を参照する変数に対するoci_close()の呼び出しは、コミットされていないトランザクションをロールバックするようになりました。必要に応じてコミットまたはロールバックを明示的に行う必要があります。従来の挙動に戻すには、php.iniをoci8.old_oci_close semantics=Onとします
    • openssl: OpenSSLダイジェスト関数および暗号関数をサポートしました。DSA、RSA、DHキーの内部的な値にアクセスすることも可能です
    • session: open_basedirによる制約が適用され、許可するパスに /tmp が明示的に追加されない限りセッションファイルは/tmpに格納されなくなりました。
  • 無効にできなくなったもの
    • PCRE
    • Reflection
    • SPL

SAPIサポートの変更点

  • FastCGIサポートは常に有効となり、無効にはできなくなりました。詳細はsapi/cgi/CHANGESを参照してください
  • 新しいCGI SAPIオプションとして-Tが追加されました。スクリプトの実行時間を計測することができます
  • CGIとFastCGIが.htaccessスタイルの、ユーザー定義php.iniファイルをサポートしました

INIディレクティブの変更点

  • zend.ze1_compatibility_modeは削除されました
  • 新しいユーザー初期化メカニズムと設定変数が追加されました: user_ini.filenameとuser_ini.cache_ttl
  • [PATH=/opt/httpd/www.example.com/]および[HOST=www.example.com]というスペシャルセクションのサポートが追加されました。これらのセクション内のディレクティブは、ユーザー定義のINIファイルによるオーバーライドおよび実行時のオーバーライドができません
  • mbstring.http_output_conv_mimetypeが追加されました。このディレクティブは、mb_output_handler()が有効となるコンテンツタイプを正規表現で指定します
  • extensionディレクティブでモジュールをロードする際にフルパスが使えるようになりました
  • ini-variablesがphp.iniファイルのほとんどの場所で使えるようになりました
  • iniオプション配列で英数字または変数インデックスが使えるようになりました
  • 実行時にopen_basedir制約を厳しくすることができるようになりました

構文の追加

  • シングルクォートを使ったヒアドキュメントのようなNOWDOC:

    <<<’LABEL’ …

通常のヒアドキュメントはスタティック変数の初期化およびクラスメンバや定数に対して使うことができます。

static $foo = <<<LABEL
ここに変数は無い...
LABEL;
  • ?:演算子が追加されました:

    var_dump(0 ?: ‘Hello!’);

Windowsサポート

  • サポートするWindowsの最低バージョンがWindows 2000となりました(Windows 98とNT4はサポート外となりました)
  • PHPのWindows版バイナリはi586以降をターゲットとします。i386とi486はサポートされません
  • 次の関数にWindowsサポートが追加されました: getopt()、imagecolorclosesthwb()、mcrypt_create_iv()、inet_ntop()、inet_pton()

PHP 5.3の新機能

  • 新しいライブラリ
    • mysqlndはPHPに同梱される新しいコアライブラリです。libmysqlを置き換えるネイティブドライバです。
  • 新しいエクステンション
    • fileinfo
    • intl
    • Phar
    • SQLite3
  • 新しいストリーム・ラッパー
    • glob://ストリームラッパー
    • pharアーカイブ用のphar://ストリームラッパー
  • 新しい関数
    • コア:
      • gc_collect_cycles()
      • gc_enabled()
      • gc_enable()
      • gc_disable()
      • class_alias()
      • get_called_class()
      • get_extension_funcs()
      • forward_static_call()
      • forward_static_call_array()
      • str_getcsv()
      • quoted_printable_encode()
      • lcfirst()
    • Array
      • array_replace()
      • array_replace_recursive()
    • Date
      • date_add()
      • date_sub()
      • date_diff()
      • date_parse_from_format()
      • date_create_from_format()
      • date_get_last_errors()
    • INI
      • parse_ini_string()
    • GMP
      • gmp_testbit()
    • Hash
      • hash_copy()
    • JSON
      • json_last_error()
    • MySQLi
      • mysqli_fetch_all()
      • mysqli_get_connection_stats()
      • mysqli_poll()
      • mysqli_reap_async_query()
    • OpenSSL
      • openssl_random_pseudo_bytes()
    • PCNTL
      • pcntl_signal_dispatch()
      • pcntl_sigprocmask()
      • pcntl_sigwaitinfo()
      • pcntl_sigtimedwait()
    • PCRE
      • preg_filter()
    • SHM
      • msg_queue_exists()
    • Streams
      • stream_supports_lock()
      • stream_context_set_default()
  • 新しいグローバル定数
    • コア
      • E_DEPRECATED
      • E_USER_DEPRECATED
      • DIR
      • NAMESPACE
    • INI
      • INI_SCANNER_NORMAL
      • INI_SCANNER_RAW
    • GD
      • IMG_FILTER_PIXELATE
    • JSON
      • JSON_ERROR_NONE
      • JSON_ERROR_DEPTH
      • JSON_ERROR_STATE_MISMATCH
      • JSON_ERROR_CTRL_CHAR
      • JSON_ERROR_SYNTAX
    • LDAP
      • LDAP_OPT_NETWORK_TIMEOUT
    • PCRE
      • PREG_BAD_UTF8_OFFSET_ERROR
    • PCNTL
      • SIG_BLOCK
      • SIG_UNBLOCK
      • SIG_SETMASK
      • SI_USER
      • SI_NOINFO
      • SI_KERNEL
      • SI_QUEUE
      • SI_TIMER
      • SI_MESGQ
      • SI_ASYNCIO
      • SI_SIGIO
      • SI_TKILL
      • CLD_EXITED
      • CLD_KILLED
      • CLD_DUMPED
      • CLD_TRAPPED
      • CLD_STOPPED
      • CLD_CONTINUED
      • TRAP_BRKPT
      • TRAP_TRACE
      • POLL_IN
      • POLL_OUT
      • POLL_MSG
      • POLL_ERR
      • POLL_PRI
      • POLL_HUP
      • ILL_ILLOPC
      • ILL_ILLOPN
      • ILL_ILLADR
      • ILL_ILLTRP
      • ILL_PRVOPC
      • ILL_PRVREG
      • ILL_COPROC
      • ILL_BADSTK
      • FPE_INTDIV
      • FPE_INTOVF
      • FPE_FLTDIV
      • FPE_FLTOVF
      • FPE_FLTUND
      • FPE_FLTRES
      • FPE_FLTINV
      • FPE_FLTSUB
      • SEGV_MAPERR
      • SEGV_ACCERR
      • BUS_ADRALN
      • BUS_ADRERR
      • BUS_OBJERR
  • 新しいクラス
    • Date
      • DateInterval
      • DatePeriod
    • Phar
      • Phar
      • PharData
      • PharFileInfo
      • PharException
    • SPL
      • SplDoublyLinkedList
      • SplStack
      • SplQueue
      • SplHeap
      • SplMinHeap
      • SplMaxHeap
      • SplPriorityQueue
      • SplFixedArray
      • FilesystemIterator
      • GlobIterator
      • RecursiveTreeIterator
      • MultipleIterator
  • 新しいメソッド
    • Date
      • DateTime::diff()
      • DateTime::add()
      • DateTime::sub()
      • DateTime::createFromFormat()
      • DateTime::getLastErrors()
    • PDO_Firebird
      • PDO::setAttribute()
    • Reflection
      • ReflectionProperty::setAccessible()
    • XSL
      • XSLTProcessor::setProfiling()
  • 新しいクラス定数
    • PDO_Firebird
      • PDO::FB_ATTR_DATE_FORMAT
      • PDO::FB_ATTR_TIME_FORMAT
      • PDO::FB_ATTR_TIMESTAMP_FORMAT