popplerでのworkaround
Annot::layoutTextから呼んでいるCharCodeToUnicode::mapToCharCodeの中で,Cmapから対応する番号を探しているのだけど,これでU+0020やU+3000が番号を返さなくて困っている様子。そこで適当にU+0020には1,U+3000には633を返してやることで,とりあえず空白はそれっぽく表示できるようになった。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;
コメントの受付は終了しました。