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

时间:2012-01-08 22:40:20

标签: c# asp.net itextsharp

我正在使用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));

有人可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:9)

在查看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[]

答案 1 :(得分:5)

这是关于如何操作的示例代码:

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()的第一个参数)引发了一个模糊的异常,但是指定字体文件的确切名称就可以了。

答案 2 :(得分:2)

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

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