从iTextSharp中的嵌入式资源加载BaseFont

本文关键字:资源 加载 BaseFont 嵌入式 iTextSharp | 更新日期: 2023-09-27 18:19:43

我正在使用iTextSharp生成动态PDF文档。我需要使用一种非常特殊的字体,我有许可的.ttf文件。

我可以使用下面的代码来加载和使用字体,但我更希望字体文件作为类库中的嵌入式资源,而不是依赖于磁盘上的特定位置。

string fontpath = Server.MapPath(".");
BaseFont customfont = BaseFont.CreateFont(fontpath + "myspecial.ttf", BaseFont.CP1252,    BaseFont.EMBEDDED);
Font font = new Font(customfont, 12);
string s = "My expensive custom font.";
doc.Add(new Paragraph(s, font));

有人能帮我怎样才能做到这一点吗?

从iTextSharp中的嵌入式资源加载BaseFont

查看ITextSharp源代码后,您似乎可以使用以下BaseFont.CreateFont重载来将嵌入式资源用作字体(BaseFont.cs中的第543行):

public static BaseFont CreateFont(String name, String encoding, bool embedded, bool cached, byte[] ttfAfm, byte[] pfb)

ttfAfm应该将TTF文件表示为byte[]

这是关于如何做到这一点的示例代码:

Stream fontStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("font.resource.path.fontfilename.ttf");
var fontBytes = ReadByteArray(fontStream);
var customFont = BaseFont.CreateFont("fontfilename.ttf", BaseFont.WINANSI, BaseFont.EMBEDDED, BaseFont.CACHED, fontBytes, null);

我还发现,不设置字体名称(CreatFont()的第一个参数)会引发一个模糊的异常,但指定字体文件的确切名称效果很好。

您可以直接从资源中获取fontBytes。在下面的例子中,我有一个名为"FontFiles.resx"的资源文件

var customFont = BaseFont.CreateFont("fontfilename.ttf", BaseFont.WINANSI, BaseFont.EMBEDDED, BaseFont.CACHED, FontFiles.fontfilename, null);