2012-01-08 4 views
2

Я использую iTextSharp для создания динамических PDF-документов. У меня есть требование использовать очень специфический шрифт, для которого у меня есть лицензионный файл .ttf.Загрузка BaseFont из встроенного ресурса в iTextSharp

Я могу использовать код, указанный ниже, для загрузки и использования шрифта, однако я бы предпочел, чтобы файл шрифта располагался как встроенный ресурс в моей библиотеке классов, а не зависел от определенного места на диске.

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

Оформить ссылку на сайт ITextSharp в http://www.mikesdotnetting.com/Article/81/iTextSharp-Working-with-Fonts – MethodMan

+3

@DJKRAZE - Где на сайте, на который вы ссылаетесь, он говорит о загрузке шрифта из встроенного ресурса? –

ответ

9

После просмотра источника 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[].

+2

+1 - Если вы еще не знаете [API здесь] (http://api.itextpdf.com/itext/) и [Документы BaseFont здесь] (http://api.itextpdf.com /itext/com/itextpdf/text/pdf/BaseFont.html). В Java, но то же самое в .NET или достаточно близко, чтобы понять. Или, если вы * любите * глядя на исходный код, не обращайте внимания;) – kuujinbo

+0

Спасибо за руководство, мне удалось получить код, который я разместил ниже. – bigtv

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

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

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