tohokuaikiのチラシの裏

技術的ネタとか。

TCPDFで「右綴じ」を実現する方法

TCPDFでもFPDFでもFPDIでもFPDI_TMPLでもなんだかこのあたりの一群のライブラリはよく分かってなかったりしますが・・・・。

そもそも右綴じって?

PDFのプロパティでこんな感じです。Acrobatで開いた時のプレファレンス。 f:id:tohokuaiki:20151229131918j:plain

英語で言うとBinding Directionで、PDFファイルをテキストエディタで開くと

<< /Type /Catalog /Version /1.7 /Pages 1 0 R /Names << >> /ViewerPreferences << /Direction /L2R /Duplex /DuplexFlipLongEdge >> /PageLayout /TwoColumnRight /PageMode /UseNone

って思いっきり書いてあったりします。

tcpdf内では、tcpdf.php

 protected function _putviewerpreferences() {
        $vp = $this->viewer_preferences;
        $out = ' /ViewerPreferences <<';
      if ($this->rtl) {
          $out .= ' /Direction /R2L';
      } else {
          $out .= ' /Direction /L2R';
      }

って出力するときに指定してるので、setR2L()でrtlプロパティを設定することで決めるようになっている。

既にあるPDFファイルの綴じ方向ってどうやって???

PDFをインポートして加工して出力っていうのをしてたので、元のPDFがR2Lなのかどうかをチェックする必要が。

grep

テキスト形式領域内にあるので、grep

 grep -e "ViewerPreferences.*/Direction */R2L" foo.pdf

とかしても一応分かることは分かる。

FPDIのパーサを使う

だけど、まぁ、FPDIを使って他のファイルをsetSourceFileでインポートする時にViewerPreferencesをパースしてくれるのかな・・・と言うことで調査。

parsersプロパティがprivateかどうかは分かりませんが、

        $pagecount = $fpdi->setSourceFile($pdffile);
        $fpdi->parsers[$pdffile]->root[1][1]["/ViewerPreferences"][1]["/Direction"][1];

で調べたら30個ほどやってみてだいたい間違ってなかったのでおそらくここに入っているんだろう。

ということで。

こんな感じで。

        $pagecount = $fpdi->setSourceFile($pdffile);
        if ($fpdi->parsers[$pdffile]->root[1][1]["/ViewerPreferences"][1]["/Direction"][1] == '/R2L'){
            $fpdi->setRTL(true);
        }