Загрузка BaseFont из встроенного ресурса в iTextSharp - PullRequest
3 голосов
/ 09 января 2012

Я использую 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 ]

9 голосов
/ 09 января 2012

После просмотра источника ITextSharp похоже, что вы можете использовать следующую перегрузку BaseFont.CreateFont, чтобы использовать встроенный ресурс в качестве шрифта (строка 543 из BaseFont.cs ):

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

ttfAfm должен представлять файл TTF как byte[].

5 голосов
/ 10 января 2012

Это пример кода о том, как это сделать:

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 голосов
/ 09 июля 2015

Вы можете получить fontBytes непосредственно из ресурсов. В приведенном ниже примере у меня есть файл ресурсов с именем "FontFiles.resx"

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