0

我有一个代码,可以在 Visual Studio 中使用 itextsharp 在表中写入一个三角形字符(它可以是 vb 或 c#)。为此,我使用包含它的 threbuchet 字体。它工作正常,但我想将三角形​​着色为红色。当试图这样做时 iTextSharp.text.FontFactory.GetFont(我认为这是很好的颜色),根本没有符号被写入pdf。

还有其他方法可以为里面的字体着色New iTextSharp.text.Font(bf, 8)吗?

这是代码

' table
Dim nTbl As PdfPTable = New PdfPTable(2)
nTbl.HorizontalAlignment = PdfContentByte.ALIGN_CENTER
nTbl.SetTotalWidth({40, 60})

' this works and adds the triangle char
Dim FONT As String = "fonts\trebucbd.ttf"
Dim bf As BaseFont = BaseFont.CreateFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED)
Cell = New PdfPCell(New Phrase("Δ", New iTextSharp.text.Font(bf, 8)))
Cell.HorizontalAlignment = 1
Cell.VerticalAlignment = 1
nTbl.AddCell(Cell) 

' this does not work, when trying to colour triangle 
Cell = New PdfPCell(New Phrase("Δ", iTextSharp.text.FontFactory.GetFont("fonts\trebucbd.ttf", 8, iTextSharp.text.Font.NORMAL, New iTextSharp.text.Color(128, 0, 0))))
Cell.HorizontalAlignment = 1
Cell.VerticalAlignment = 1
nTbl.AddCell(Cell)
4

1 回答 1

1

问题在于,您BaseFont.CreateFont()明确表示要嵌入,但在您的系统中,您FontFactory.GetFont()依赖的是不嵌入的系统默认值。您需要使用GetFont()指定嵌入的方法的较长版本。

看起来您正在使用我没有放置的 4.1.6 版本,但这应该几乎相同,除了最后一个参数:

iTextSharp.text.FontFactory.GetFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 20, iTextSharp.text.Font.BOLD, BaseColor.RED)

此外,GetFont()它的目的是采用字体名称,而不是路径,尽管如果该名称查找失败,它仍然会恢复调用BaseFont.Create(),但我不确定你是否应该依赖它。相反,您应该预先注册您的字体:

iTextSharp.text.FontFactory.Register(FONT, "Treb")

然后你可以使用GetFont()别名。

iTextSharp.text.FontFactory.GetFont("Treb", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 20, iTextSharp.text.Font.BOLD, BaseColor.RED)

这样做的好处是,如果由于某种原因您的字体文件被重命名或删除, FontFactory.Register()将引发异常,而FontFactory.GetFont()后备字体会静默失败。无声后备听起来不错,但您也可能会花费数小时排除故障,这很容易解决。

于 2013-10-13T15:57:31.563 回答