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>andfont-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 中使用粗体,也许是一种克服这个问题的方法?

谢谢,页。

4

2 回答 2

4

我不是专家,但如果你的字体没有加粗变体,那么飞碟可能只是“不加粗”。当您以编程方式使字体变粗时,您使用的字体类可能(在幕后)使用某种内部机制自行使字体“变粗”。现实世界中的一个很好的例子是 Photoshop:如果你的字体没有粗体,你就不能让它变粗,但是 Photoshop 有一个“模拟粗体”选项,它会进入并加粗这些符号没有真正使用“真正的”粗体。

确定诊断的一个好方法是切换您在飞碟中使用的字体,但保留相同的文档。如果新字体也不是粗体,那么问题就不那么热门了。如果它确实变成粗体,那是因为你的字体没有粗体版本。

希望这可以帮助。

于 2010-07-27T00:58:23.087 回答
2

如果您的旧 iText 代码可以生成粗体字体,那么 TTF 文件似乎确实包含粗体变体,即使 Flying Saucer 不使用它。如果您在 CSS 样式表中指定粗体变体的确切名称,则可以在飞碟中使用粗体变体。

例如:

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

您应该能够通过在 Adob​​e Reader 中打开由旧代码生成的 PDF 来找到字体的确切名称。转到文件 --> 属性... --> 字体以查看文档中所有字体的列表。可能会有“myfont”条目以及“myfont bold”条目或类似条目。在样式表中使用后者。

于 2010-07-27T13:42:30.670 回答