読者です 読者をやめる 読者になる 読者になる

tohokuaikiのチラシの裏

技術的ネタとか。

Confluenceのプラグイン開発を承ります。ご連絡はこちらのホームページからお願いいたします。

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

php

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);
        }