不定期戯言2

戻る

検索条件:2021年3月26日 

2021/03/26(Fri)

popplerのソースと格闘

13日に書いた, Okularの注釈(インラインテキスト)で日本語文字が表示できない件について探っている。 原因はPopplerの方にあるのだろうと思われる。 GfxFont::makeFontの中でGfx8BitFontでなくGfxCIDFontが呼び出されるためには, getFontTypeでfontCIDType0が帰らなくてはいけないのだが, そのためにはfontDictにいろいろ設定がなされていなくてはいけない。 Annot.ccのcreateAnnotDrawFont内でfontDictを作っているが, これにはBaseFont,Subtype,Encodingしか設定されていない。 しかしGfxFont::getFontTypeでfontCIDType0が返るためには, 最低でもDescendantFontsを設定する必要がある

以上のことで日本語文字は表示されるようになったが, 英字の表示がおかしい。 文字幅が日本語文字と同じになっている様子。 Annot::layoutTextから呼んでいるGfxFont::getNextChar(から継承しているGfxCIDFont::getNextChar) がGfxCIDFont::widthsを参照しているのだが, これの設定はGfxCIDFontコンストラクタに渡されるfontDictから情報を得ている。 結局fontDictに戻ってくるわけだ。 フォントを指定すればfontDictが得られるような仕組みくらいないとおかしいんだけど, それがまだ見つけられない。

そもそもこんなことになっているのは, AnnotFreeText::generateFreeTextAppearanceでGfxFont::makeFontを呼び出すことになっていて, そのときのfontDictはfontDictionaryから取り出されたもので, そのfontDictionaryはfontResoucesから取り出されたもので, そのfontResourcesはresDictから, そのresDictはresourceObjから, そのresouceObjはformからそれぞれ取り出されているのだけど, 肝心のformがdocから取り出されたCatalogにあるはずなのに,それが見つからないのだ。 コメントに「そんなときはてきとーにHelveticaにしとく」と書いてある通りになっていて, 第一段落で書いたのはそのHelveticaを無理やり変更したという話。

そんなわけでCatalogのコードを読む。 Catalog::getFormではacroFormから生成されたFormが返されるので, acroFormについて調べることにする。 Catalogコンストラクタの中で, acroFormはcatDictから取り出されており, catDictはxrefから取り出されている。 あれ,acroFormがNullだ…詰んだ。