TracWikiのPDF出力日本語化

こんな流れで

  1. TracWikiのPDF化しよう
  2. ググっても、文字化けするとかっていうのばっかり
  3. やり方発見!でも文字ずれまくり
  4. IPAGothicとか使えばいいんじゃね?
  5. TTFを直接使いたい

環境はCentOS5、Python2.6.4、Trac0.11.6ja

プラグイン

TracWikiのPDF化はいろいろプラグインがあるようで

  • PageToPdfPlugin → htmldocを使う
  • WikiPrintPlugin → xhtml2pdf/PISAを使う
  • WikiExportPlugin → openofficeを使う


まぁ、ほかにもあるかと思いますが大きく分けると3系統かな
今回は、openoffice入れるの面倒、htmldocはUTF-8対応してない
という理由から、WikiPrintPluginを使ってみることにしました。


プラグインのページ
TracWikiPrintPlugin – Trac Hacks - Plugins Macros etc.


とりあえずインストールしましょう。
必要なものはこれだけ。

  • xhtml2pdf/PISA → version 3.0.32
  • ReportLab version 2.2 → version 2.4
  • HTML5lib → version 0.90
  • pyPDF → version 1.12
  • PIL (Python Imaging Library) → version 1.1.7
  • Pygments → version 1.2.2


まぁ、PISAをeasy_installすればそれ以外も入るらしいです。
知らずに自力で入れましたが…。
※ 矢印の右側がインストールしたversionです。


で、とりあえず出力してみるとやっぱり文字化け…orz

とりあえず、方法を探す

PISAのフォーラムとか見てcssでできるよ!
見たいなこと書いてたので試しましたがうまくいかず…。
半日くらいさまよった結果こちらのページに辿りつきました。


pisaの日本語サポート
http://www.daionet.gr.jp/~knok/trac/trac.cgi/wiki/pisa-l10n


こちらの方がHeiseiKakuGo-W5に対応させるやり方を書いていたので
それを参考に変更していくと日本語がうまく表示されました。

ただし、日本語はいい感じだったんですが
英数字がずれてしまうという問題が発生。
フォントのせいなのかなぁとか思ったのでIPAGothicを使うことにしました。


M+とIPAの合成フォント


で、いざと思い読み込んでみるがエラーがもう
ここに書けないくらい出たので割愛

TTFを読み込むようにする

CIDじゃなくてTTFを読み込む用にすればOKじゃね?
ってことで、調べました。


ReportLab PDF Library Users Guid (注:PDFです。これの52ページ目)


ここにTTFを直接読み込む方法が乗ってるので、loadCIDFontをもとに(Pythonわからんのでコピペ)
こんな感じに書き換えました
※っていっても読み込むとこを書き換えただけですが

  • ライブラリを読み込むところに追加
from reportlab.pdfbase.ttfonts import TTFont
  • このメソッドを追加
    def loadTTFont(self,names,src):
        if names and src:
            if type(names) is types.ListType:
                fontAlias = names
            else:
                fontAlias = [x.lower().strip() for x in names.split(",") if x]

            # XXX Problems with unicode here
            fontAlias = [str(x) for x in fontAlias]
            src = str(src)

            fontName = fontAlias[0]
            try:

                if fontName in self.fontList:
                    self.warning("Repeated font embed for %s, skip new embed" % fontName)
                else:
                    self.registerFont(fontName, fontAlias)
                    font = TTFont(fontName,src)
                    pdfmetrics.registerFont(font)
            except Exception, e:
                self.warning(e)
  • フォントの処理を変更
        self.loadTTFont(['ipag','ipag'],'ipag.ttf')
        self.fontList['helvetica'] = 'ipag'


これでどうにかこうにか文字化けもせず、
文字ずれもなく表示できるようになりました。

どなたかもっと簡単に日本語化できる方法を知ってる方はいないですかね、
openoffice使えば?っていうのは言いっこなしで

dynamic-height

やっぱり高さの自動調節は必要よね。
っていうことでそれを試してみた。


使うのは"dynamic-height"ってやつです。
XMLの設定をちょこっと書き変えねばなりません。

   :
<Module>
<ModulePrefs title="sample">
<Require feature="opensocial-0.8" />
<Require feature="dynamic-height" />
</ModulePrefs>
   :

で、アプリ側(opensocial-jquery

$(window).adjustHeight();

うほっ、簡単とか思って実行したら全然うまく動かない…。
Flash読み込んでるからかー?とか思って

var height = $(window).height();
$(window).adjustHeight( height + 550 );

とかやっても全然無理。
まったくわからんので、試しに色々$()に渡してたら
documentを渡したところで何気にうまくいった。。

$(window).adjustHeight( $(document).height() );

なんで?こことかにも一番最初の通りに書いてるのに…。
http://code.google.com/p/opensocial-jquery/wiki/ExamplePerson

よくわからんかった、Windows環境でFirefox、IE6、Chorme、Safariで試して
うまくいったからまぁ、いいかなぁとか思ったり。


何か詳しく知ってる方がいたら教えてください。

書き換えられるのね〜ん。

やりたいこと

javascriptで外部からHTMLを読み込んで対象のDIVに埋め込みたかった。
URLとかいっぱい書くのめんどいからどっか変数に保持したい。
で、思ったとおりにやってみてちょっと思った。
変数のチェックとかは割愛

var base    = 'http://www.example.com/';
var urllist = {
  a: 'a.html',
  b: 'b.html',
  c: 'c.html'
};

jQuery(function($){
  $('button').click(function(){
    $('#target').load( base + urllist[$('#num').val()] );
  });
});
<input type="text" id="num" /><button>読み込む</button>
<div id="target">ここに読み込む</div>

これって書き換えられるんじゃね?

アドレスバーにjavascript:base='http://www.yahoo.co.jp';urllist={a:''};void(0);
って打って、テキストにaを入れて読み込むとヤフーキター。

どうしようかなぁ

いろいろ考えてこれに落ち着きました。

var loadUrl = function () {
  var base    = 'http://www.example.com/';
  var urllist = {
    a: 'a.html',
    b: 'b.html',
    c: 'c.html'
  };
  return function (code) {
    $('#target').load( base + urllist[code] );
  };
}();

jQuery(function($){
  $('button').click(function(){
    loadUrl($('#num').val());
  });
});

こんな感じにしてやって、
読み込む処理をその内部でやってやった。
これで安心なのか・・・?

ちなみにこのとき、
javascript:loadUrl('b');void(0);
とかされると読み込まれるんだけど。それはいいよね!
loadUrl = function() { }; とかなら勝手にやってくれって感じ。
でも、結局そういうことされるとこっちとしてはどうしようもないから
こんなのも考えなくていいかなぁ・・・

やっぱりなんかopensocial-jquery使いたいよねってことで
調べてたけど導入がないようなので簡単にまとめてみる。

opensocial-jqueryをGETする

ここ
http://code.google.com/p/opensocial-jquery/


適当にダウンロードしてください。

続きを読む

アカウント申請も終わったんでちょこちょこ遊んでみます。
Flashでやりたいなぁ、とか思ってたんですけど
とりあえず、普通に開発してみてその後でFlashでやってみるという
そんな感じで考えてます。

まずは普通に作成opensocial-jqueryとかあるけど使わずやってみよう。

gadget.xml

<?xml version="1.0" encoding="UTF-8"?>

<Module>
  <ModulePrefs title="Hello, world!">
    <Require feature="opensocial-0.8" />
  </ModulePrefs>
  <Content type="html"><![CDATA[

<div>Hello, <span id="target"></span>!</div>

<script type="text/javascript">
function init() {
  var req = opensocial.newDataRequest();
  req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.VIEWER), "viewer");
  req.send(function(data) {
    var viewer = data.get("viewer").getData();
    var name = viewer.getDisplayName();
    document.getElementById("target").innerHTML = name;
  });
}
gadgets.util.registerOnLoadHandler(init);

</script>

  ]]></Content>
</Module>

mixiのサンプルそのまんまですけど…。
opensocial.newDataRequest()でリクエストオブジェクトの作成。
req.newFetchPersonAppDataRequest()でなんの情報がほしいかを設定。
ビューアーの情報を取得するリクエストを生成するっぽい。


req.send()でリクエスト発行、完了するとcallbackが呼ばれる。
data.get("viewer").getData()でリクエスト生成時に設定したキー"viewer"の値を取得する。


で、あとはそれをとってきて#targetな奴に突っ込むと。
単純ですな・・・。
あとはもうチョイ探りつつやっていくかなぁああ


一応参考URL
http://code.google.com/intl/ja/apis/opensocial/docs/0.8/reference/

Lhaコマンド

CentOSにLhaコマンド入れて解凍するとかいうのが
必要だったので、入れてみた。
RPMforgeリポジトリ導入してyumで入る。
ソースからでもいいよ。

yum -y lha

で一発。
なんだけどそっから先が
指定したディレクトリに解凍する方法がさっぱりわからなかったんで、
ちょっと調べて発見。

lha xw=/decompress/target/directory/ target.lzh

これでOK。

YAPC::ASIA 2008に参加しました

とにかくいろんな人と話をしました。
id:vkgtaroさんとにかくthanks!!


1日目は、懇親会が終わったあと
id:sugizouid:fuki1234さんとid:TeahousePhantom
あわせて4人でカラオケへ。
何時間か(多分2時間で入ったと思う)唄って終了。


2日目は、はしゃぎすぎてて最初ダウン。
思い出したくないくらい気持ち悪かった。
まぁ、昼までには復活。
id:sugizouがSpeakerとして参加とかっていうことだったので見る。
発表の時は自分が緊張したっていうね。
まぁ、マイク近すぎて声でかい。と思ったくらいであとは特になし、
無事に終わったって感じで。


んで、新幹線に乗って帰ってくる。
歩きすぎ(いや立ちすぎ?)で足が痛かった…。あと座り過ぎで腰も痛かった…。


とりあえず、DBIx::MoCoは後で使おう。