トップ «前の日記(2020-01-13) 最新 次の日記(2020-01-20)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2020-01-19

_ PDFは難しい

以下のように出力される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しようがない)。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|

ジェズイットを見習え