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

‘MacPorts’ タグのついている投稿

よろしい、ならばxmlstarletだ

2009年4月28日 火曜日

どうも、サーバーワークスでプログラマさせてもらっている川口です。

みなさん、シェルスクリプト書いてますか?コマンドラインの延長みたいなものなので欲張って色んな動作をさせようとすると非常に面倒なんですが、一度書いておけば様々な作業が一気に楽にそして正確に行えるようになるので重宝します。

今回紹介するのはコマンドライン上で動作するオープンソースのXMLツール xmlstarletです。コマンドラインでXMLをいじれるのでシェルスクリプトとも相性バッチリ。インストールも簡単、かつ対応形式も主要なのは押さえており機能面でも通常使用なら問題ないレベルなので是非試して見て下さい。

xmlstarletとは?

コマンドラインからXMLの書式化、変換、修正、および編集を行う事ができる様になるツールキットです。シェルスクリプト作成時にコマンドラインからXML文法チェックやパースの必要がある場合に、PHPやperlでわざわざコードを書かなくても対応できるようになります。

ちなみに使用にはlibxml2およびlibxsltライブラリーが必要です。

MacPortsで検索

% sudo port search xmlstarlet
xmlstarlet @1.0.1 (textproc)
    xml command line utilities

インストール

特に注意する点は有りません。MacPortsコマンドでそのままインストールしてください。

(今回のインストール環境)

  • Mac OS X 10.5.6
  • MacPorts 1.700

    % sudo port install xmlstarlet

確認

% port contents xmlstarlet
Port xmlstarlet contains:
  /opt/local/bin/xmlstarlet
  /opt/local/share/man/man1/xmlstarlet.1.gz

使用方法

今回は簡単な文法チェックが目的でしたのでバリデートのwell-formed形式で試してみます。その他のパリデート定義形式は以下のような形式(スキーマ言語)。(もしかしたらオプションで表示されないだけでもっと多いかも・・・)

  • DTD
    • 元々SGMLのスキーマ言語として開発された文書構造(文書型)定義スキーマ言語
  • RELAX NG
    • RELAX NG 技術委員会が策定したスキーマ言語
  • XSD
    • W3Cが開発・標準化にあたっているスキーマ言語
  • well-formed
    • W3Cが定めた整形XML文書形式

正常なXMLデータの場合

% xmlstarlet val -w test.xml
ptest.xml - valid

1. 「homepage」 -> 「homepega」等のタイプミス

(test.xml)

<?xml version="1.0" encoding="EUC-JP"?>
<company_list>
    <company>
        <name>株式会社サーバーワークス</name>
        <address>東京都文京区音羽1丁目26-11 大和出版ビル2F, 3F</address>
        <tel>03-5940-3282</tel>
        <fax>03-5940-3548</fax>
        <homepega>http://www.serverworks.co.jp</homepage>
        <email>sales@serverworks.co.jp</email>
    </company>
</company_list>

(実行結果)

% xmlstarlet val -w test.xml
test.xml:8: parser error : Opening and ending tag mismatch: homepega line 8 and homepage
    <homepega>2363</homepage>
                             ^
test.xml - invalid

2. ‘<’ or ‘>’ 等のタグ閉じ忘れ

(test2.xml)

<?xml version="1.0" encoding="EUC-JP"?>
<company_list>
    <company>
        <name>株式会社サーバーワークス</name>
        <address>東京都文京区音羽1丁目26-11 大和出版ビル2F, 3F</address>
        <tel>03-5940-3282</tel>
        <fax>03-5940-3548</fax>
        <homepage>http://www.serverworks.co.jp</homepage>
        <email>sales@serverworks.co.jp</email>
    </company
</company_list>

(実行結果)

% xmlstarlet val -w test2.xml
test.xml:11: parser error : expected '>'
</company_list>
^
test2.xml - invalid

参考リンク

libHaruを使ったPDFの生成

2009年3月30日 月曜日

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の使用例

libHaruの使用例

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