とあるPDF操作ライブラリのissue
とあるPDF操作ライブラリのissueに
ページの高さを取得する関数に問題がある。
595x842のはずが
幅は595になるが、高さが-842となる。
と指摘があった。
さて、これはどんなことが起きているのか?
最近PDF関連興味があっていろいろ触っているので、この問題について調べてみた。
PDFの座標
PDFの仕様を見てみた。
PDFの想定する空間
まず、PDFの空間は無限の平面と考えるとしていて、
「正のX軸が水平方向の右、正のy軸が垂直方向の上」としています。
これはよく見るx,y座標の図をイメージしてもらえばいいと思います。
その中で使う場所を矩形領域として指定します。
使用する矩形領域をPDFの中ではMediaBoxで指定しています。
さらに追加で領域指定することもできたりしますが、それは置いておいて
ここではMediaBoxが所謂ページのサイズ(紙のサイズ)と考えてください。
MediaBoxの指定値
MediaBoxは4つの数値で指定します。
この4つの数値は二つの(x,y)座標を示します。
仕様書では「通常、配列は以下の形式をとる」としており
[ llx lly urx ury ]
左下x,左下y,右上x,右上yの順となっています。
Microsoft OfficeでA4サイズのデータをPDFにエクスポートしたら
MediaBoxは[0 0 595.32 841.92]となっていました。1
これは
左下が(0,0)で右上が(595.32,841.92)となる矩形領域で
分かりやすくすると
左上から
(0,841)-(595.32,841.92)
(0,0)-(595.32,841.92)
となる矩形になります。
図にすると
そのライブラリの実装では
width = urx - llx;
height = ury - lly;
となっており
この場合
width = 595.32 - 0 = 595.32
height = 841.92 - 0 = 841.92
正しい幅と高さです。
問題を探る
で、問題のPDFのMediaBoxは
[0 842 595 0]
でした。
この場合
単純に読んでしまうと
左下が(0,842)で右上が(595.32,0)となる矩形領域で
? -(595.32,0)
(0,842)- ?
はい、変な配置です。
幅と高さも
width = 595 - 0 = 595
height = 0 - 841 = -841
と計算さて、指摘されている通りになります。
では、正しい動作なのか?
さきほど
左下x,左下y,右上x,右上y の順となっています。
としましたが、実は仕様では正確に言うと
「対角線上に対向する一対の角の座標を与える4つの数値の配列として記述」
であり「左下x,左下y,右上x,右上y」であるとはしていません。
矩形は慣例的に左下隅と右上隅で指定されます。
(その場合は)通常、「左下x,左下y,右上x,右上y」になる
と記載されている、というだけです。
なので、
[0 842 595 0]は
(0,842)と(595,0)を結ぶ線分を対角線として持つ矩形領域、です。
2点を配置した図にしてしまうとすぐわかるのですが、
これは以下のような領域です。
(0,842)-(595,842)
(0,0)-(595,0)
結論
これはバグでしょう。
ただ幅と高さの値を修正するだけなら簡単でしょうけど、
これを基準に描画アイテムの配置処理とかありそうなので、その辺の影響とか
もしかしたらマイナイスが出てしまうことと前提にしているアプリケーションとかありそうで、単純ではないかも?
ただ、このライブラリ最近メンテナンスされていなくてPRしたところで修正はされないと思われます。
それなりに動いているフォークがあるので、修正するとしたらそっちでやるかな。
-
ちなみに、単位は基本1/72インチ ↩