我正在使用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));
有人可以帮我解决这个问题吗?
答案 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);