著作一覧 |
以下のように出力されるPDFがある。
これが、pdf-readerでは正しくテキストが取れない。
X座標が関連業の部分と(0.2%)の部分で入れ子になるからだ。x座標が(の部分で左に移動している。
x:81.15690000000001, y:428.4363, char=関 x:87.15690000000001, y:428.4363, char=連 x:93.15690000000001, y:428.4363, char=業 x:86.6769, y:428.4363, char=( x:92.6769, y:428.4363, char=0 x:95.6769, y:428.4363, char=. x:98.6769, y:428.4363, char=2 x:101.6769, y:428.4363, char=% x:107.6769, y:428.4363, char=)
生データは以下となっている。
/C2_0 1 Tf 4.44 0 0 6 51.1569 428.4363 Tm <0BBE0869020605CB0FF606FE10B207AA>Tj 6 0 0 6 86.6769 428.4363 Tm <022A00
(Tjで指定されている文字はUTF8変換で正しい)
Tmで設定されているメディアボックスの解釈をpdf-readerが間違っているのは明らかなので、要は86.6769のXまでに51.1569からのTjの文字がすべて入る必要があるのだが、4.44の倍率だけでは解釈できない。
それはそれとしてpdf-readerを修正した場合、PRするのは簡単だが、テストケースが作れない(変換元のPDFをどうすれば良いか?)のは難しいな。
書いてみたら、ふと気づいたが、そうではなく、次のメディアボックスのXに収まるようにXの位置を調整するのが正解なのではなかろうか? とすれば、メディアボックスを先読みするようにすれば良いのだな。(あるいは直前のメディアボックスの開始位置まで巻き戻してXを再設定する)
いや、今気づいたが、最初のメディアボックスの4.44が効いていないような。(以降は6ずつ増えているのだから、フォントサイズを1とすれば、最初の部分は4.44ずつ増えるべきだが、同じく6ずつ増えている。
コード( https://github.com/yob/pdf-reader/ )を眺めてもらちが明かないので、ばかでかくてすごく嫌だがPDFのリファレンスを眺めることにする。
P.410の5.3の最後に、Tmを適用している。この処理が、PageState#process_glyph_displacementでは正しく行われていない。というのは、font_sizeの計算がおかしいからだ。
--- /usr/local/lib/ruby/gems/2.6.0/gems/pdf-reader-2.4.0/lib/pdf/reader/page_state.rb 2019-12-27 11:54:10.395106352 +0900 +++ /tmp/page_state.rb 2020-01-20 01:48:27.286352348 +0900 @@ -109,8 +109,8 @@ def font_size @font_size ||= begin - _, zero = trm_transform(0,0) - _, one = trm_transform(1,1) + zero, _ = trm_transform(0,0) + one, _ = trm_transform(1,1) (zero - one).abs.round(2) # 小数点2位くらいまでは実際に設定されるのでそこに丸める。最後の文字は999999……になることが多い end end
なんだけど、元のコードはフォントサイズに縦を利用していて、もしかしてそれが正しい場合もあるのかも知れなくて、困るな(おれは困らないので、このパッチを適用するわけだが、PRしようがない)。
ジェズイットを見習え |