4

空飛ぶ円盤 xhtmlrenderer によって生成された PDF でカスタム TrueType フォントを使用しています。

ITextRenderer renderer = new ITextRenderer();
renderer.getFontResolver().addFont("myfont.ttf", BaseFont.CP1252, BaseFont.EMBEDDED);
renderer.setDocument(XMLResource.load(in).getDocument(), url);
renderer.layout();
renderer.createPDF(out);

レンダリングされているhtml内には、次のものがあります(たとえば)

<html>
<head>
<style type="text/css">
*{font-family:myfont;} /* <-- this works, trust me */
</style>
</head>
<body>
<p>some plain text<b>some bold text</b> <span style="font-weight:bold;">more bold</span></p>
</body>
</html>

しかし、<b>とを使用してもfont-weight:bold、テキストを太字にすることはできません。

今、私は同じフォントとプレーンな古いitext(つまりxhtmlrendererなし)を使用する同様の(レガシー)プロジェクトがあり、次の方法で太字のテキストを含むpdfを生成するため、これが機能するはずです。

myFont = BaseFont.createFont("myfont.ttf", BaseFont.CP1252, BaseFont.EMBEDDED);
Font boldFont = new Font(myFont);
boldFont.setStyle(Font.BOLD);

com.lowagie.text.Document document = ...;
document.add(new Paragraph("plain", myFont));
document.add(new Paragraph("bold", boldFont));

xhtmlrendererで太字を使用できない理由と、この問題を克服する方法を誰かが説明できますか?

ありがとう、p。

4

2 に答える 2

4

私は専門家ではありませんが、フォントに太字のバリエーションがない場合、FlyingSaucerは単に「太字にしない」可能性があります。プログラムでフォントを太字にする場合は、ある種の内部メカニズムを使用して、(舞台裏で)フォント自体を「太字」にすることができるフォントクラスを使用しています。実世界でのこの良い例はPhotoshopです。太字の種類がないフォントを使用している場合、太字にすることはできませんが、Photoshopには「シミュレートされた太字」オプションがあります。 「真の」太字を実際に使用せずにシンボル。

これを確実に診断する良い方法は、Flying Saucerで使用しているフォントを切り替えて、同じドキュメントを保持することです。新しいフォントも太字でない場合、問題はあまり話題になりません。太字になった場合は、太字のフォントがないためです。

お役に立てれば。

于 2010-07-27T00:58:23.087 に答える
2

従来の iText コードでボールド フォントを生成できる場合、フライング ソーサーが使用していなくても、実際には TTF ファイルにボールド体が含まれている可能性があります。CSS スタイルシートで太字バリアントの正確な名前を指定すると、Flying Saucer で太字バリアントを使用できる場合があります。

例えば:

<style type="text/css"> 
* {font-family:myfont;}
b {font-family:"myfont bold";}
</style> 

Adobe Reader でレガシー コードによって生成された PDF を開くと、フォントの正確な名前を見つけることができるはずです。[ファイル] --> [プロパティ...] --> [フォント] に移動して、ドキュメント内のすべてのフォントのリストを表示します。おそらく、「myfont」エントリと「myfont bold」エントリなどがあるでしょう。スタイルシートで後者を使用してください。

于 2010-07-27T13:42:30.670 に答える