『こぶたのラッパ』はサイトを移動しました!
今後はこちらをどうぞ
2006年 10月 08日
PHPでRTF出力
必要があってPHPからRTF出力(テンプレートRTFに「<?= $hoge?>」で出力)をしようと思ったのですが、「十」や「ソ」が文字化けするといういつもの問題が発生。
RTF独特のフォーマットに文字列を変換する必要があるようですが、RTFの仕様がよく分からないは、既存のライブラリはなんだか動かないはで、結局自作することにしました。

下のget_rtf_text関数がそれですが(ほかの2つはget_rtf_textから呼ばれる)、RTFの仕様を一切見ずに書いたものですので、この関数を使おうとして「動かないよ」ということになっても知りません。
私の必要には事足りたのでのっけておきます。

    function get_rtf_text($str) {
        $str = get_unicode_ascii($str);
        $str = str_replace("\n", "{\n\\par}", $str);
        return $str;
    }

    function get_unicode_ascii($str) {
        $ret = '';
        $code = 'UCS-2';
        $str = mb_convert_encoding($str, $code, 'EUC-JP');
        for ($i = 0; $i < mb_strlen($str, $code); $i++) {
            $char = mb_substr($str, $i, 1, $code);
            $char2 = mb_ord($char);
            if ($char2 == 10) {
                $ret .= "\n";
            } else {
                $ret .= '\u' . $char2 . "\\'83\\'69";
            }
        }
        return $ret;
    }

    function mb_ord($char){
      return (strlen($char) < 2) ?
        ord($char) : 256 * mb_ord(substr($char, 0, -1)) + ord(substr($char, -1));
    }

※2007/5/7 ちょっと修正


適当なRTFをWordで作って地道に解析した結果ですが、文字ごとに「\\'83\\'69」を後ろにくっつけるなど、私自身もよく分からない処理を行っています。
RTFわけ分からないです。

■PHPからRTF出力
//事前に「template1.rtf」を作り、
//その中に<%= $text1%>などと埋め込んでおく。
    $text1 = '埋め込みテキスト';
    $text1 = get_rtf_text($text1);
    header('Content-Type: text/rtf');
    header('Content-Disposition: attachment; filename=ドキュメント.rtf');
    mb_http_output('SJIS');
    ob_start('mb_output_handler');
    include('template/template1.rtf');

[PR]
by smilkobuta | 2006-10-08 15:56 | Webサイトシステム

<< Illustrator Tip... Power Chip DECO... >>