こんにちは,中西です。
Debian(buster)を使っていますが,Okularの注釈(インラインテキスト)で日本 語文字を入力しても,入力欄には表示されるものの,PDFの方には表示されません。 Okularの設定の注釈(インラインテキスト)のフォントを変えてみても変化があ りません。この点についてうまい方法はないものでしょうか。 poppler-data,poppler-utilsはインストールしてあります。
Okularというよりpopplerの方に問題があるような気がしています。またWindows 版も同じような挙動のようです。
こんにちは,中西です。
poppler-0.71.0のソースを眺めているところです。ちょこちょこ書き換えながら やってるので行数はちょこっとずれてるかもしれません。
poppler/poppler/Annot.cc 2664行目のcreateAnnotDrawFontの4つめのオプショ ン引数fontname = "Helvetica" がそのまま適用されているようで,ここをたと えば"IPAexMincho"にしてやると,日本語は表示されないものの英字のフォント が変更されます。 ただし,いずれにしてもAnnot::layoutTextの3744行目のエラーは文字数分だけ でます。
中西です。連投失礼しています。
Annot.cc のcreateAnnotDrawFontでfontDictに設定しているのが ・BaseFont <- fontname ・Subtype <- "Type0" ・Encoding <- "WinAnsiEncoding" の3つなので,EncodingをIdentity-Hにしたり,適当にDecendantFontsとか付け 加えたりして日本語が表示されるようにはしましたが,今度は英文字の文字幅が 何やらおかしくなりました。文字幅の情報を入れればいいのかなとか思うのです が,それも含めてこの手の情報は何かで取得できるものではないのかと思って探 しています。何か助言とかいただけると幸いです。
中西です。とりあえず一区切りついたという報告です。
ちゃんとやる方法がわからなかったので,とりあえず日本語文字を入れても表示 がおかしくならない力づくのパッチで対応しました。633とか意味不明な即値が あるのが気持ち悪いですが,それを求める方法がわからないからこんなことをし ているのでした。
--- poppler-0.71.0.orig/poppler/Annot.cc +++ poppler-0.71.0/poppler/Annot.cc @@ -2668,7 +2668,22 @@ static GfxFont * createAnnotDrawFont(XRe Dict *fontDict = new Dict(xref); fontDict->add("BaseFont", Object(objName, fontname)); fontDict->add("Subtype", Object(objName, "Type0")); - fontDict->add("Encoding", Object(objName, "WinAnsiEncoding")); + fontDict->add("Encoding", Object(objName, "Identity-H")); + Dict *subfontDict = new Dict(xref); + subfontDict->add("Subtype", Object(objName, "CIDFontType0")); + Dict *cidSystemInfo = new Dict(xref); + cidSystemInfo->add("Registry", Object(new GooString("Adobe"))); + cidSystemInfo->add("Ordering", Object(new GooString("Japan1"))); + subfontDict->add("CIDSystemInfo", Object(cidSystemInfo)); + Array *widthArray = new Array(xref); + widthArray->add(Object(0)); + widthArray->add(Object(632)); + widthArray->add(Object(500)); + subfontDict->add("W",Object(widthArray)); + subfontDict->add("DW", Object(1000)); + Array *descArray = new Array(xref); + descArray->add(Object(subfontDict)); + fontDict->add("DescendantFonts", Object(descArray));
Dict *fontsDict = new Dict(xref); fontsDict->add(resourceName, Object(fontDict)); @@ -2769,7 +2784,7 @@ void AnnotFreeText::generateFreeTextAppe
// Set font state appearBuilder.setDrawColor(da.getFontColor(), true); - appearBuilder.appendf ("BT 1 0 0 1 {0:.2f} {1:.2f} Tm\n", textmargin, height - textmargin - da.getFontPtSize() * font->getDescent()); + appearBuilder.appendf ("BT 1 0 0 1 {0:.2f} {1:.2f} Tm\n", textmargin, height - 2 * textmargin - da.getFontPtSize() * font->getDescent()); appearBuilder.setTextFont(da.getFontName(), da.getFontPtSize());
int i = 0; --- poppler-0.71.0.orig/poppler/CharCodeToUnicode.cc +++ poppler-0.71.0/poppler/CharCodeToUnicode.cc @@ -616,6 +616,8 @@ int CharCodeToUnicode::mapToCharCode(Uni return 1; } } + if(*u == 0x0020){*c = 1; return 1;} + if(*u == 0x3000){*c = 633; return 1;} *c = 'x'; } else { int i, j;