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;
コメントの受付は終了しました。