飞碟(xhtmlrenderer)没有加粗我的字体?

时间:2010-07-23 09:11:07

标签: java itext flying-saucer xhtmlrenderer

我在飞碟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。

2 个答案:

答案 0 :(得分:4)

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

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

希望这有帮助。

答案 1 :(得分:2)

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

例如:

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

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