从iTextSharp中的嵌入资源加载BaseFont

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

有人可以帮我实现这个吗?

这是关于IT技术的问题。请注意,保留HTML标记。


请查看iTextSharp网站上的此链接:http://www.mikesdotnetting.com/Article/81/iTextSharp-Working-with-Fonts - MethodMan
3
@DJKRAZE - 你所提到的网站中,哪里讲述了如何从嵌入式资源中加载字体? - M.Babcock
3个回答

10

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


2
+1 - 如果您还不知道API在这里,以及BaseFont文档在这里。这是Java的,但.NET也基本相同,或者足够接近以便理解。或者如果您喜欢查看源代码,请忽略 ;) - kuujinbo
谢谢您的指引,我已经成功让代码运行了,以下是我发布的代码。 - bigtv

7
这是一个关于如何执行此操作的示例代码:
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
您可以直接从资源中获取fontBytes。在下面的示例中,我有一个名为“FontFiles.resx”的资源文件。
var customFont = BaseFont.CreateFont("fontfilename.ttf", BaseFont.WINANSI, BaseFont.EMBEDDED, BaseFont.CACHED, FontFiles.fontfilename, null);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接