不定期戯言

戻る

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を設定する必要がある(EncodingもIdentity-Hに変更)。

・以上のことで日本語文字は表示されるようになったが,英字の表示がおかしい。文字幅が日本語文字と同じになっている様子。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だ…詰んだ。

コメント(0)

コメントの受付は終了しました。