Для каждого символа, с которым сталкивается ваш браузер, он ищет соответствующий глиф в текущем шрифте. Если шрифт не имеет этого глифа, он ищет любые резервные шрифты, чтобы увидеть, есть ли у них этот глиф. В конечном счете, у каждого браузера есть основной набор стандартных шрифтов, которые являются окончательным резервом. Когда вы указываете шрифт Bliss, но используете арабские символы, вы, вероятно, просто видите резервные шрифты вашего браузера.
PDF-файлы не работают таким образом. Если вы скажете, что что-то использует шрифт XYZ
, тогда он попытается отобразить его с помощью этого шрифта или сбой.
Проще всего просто добавить шрифт в CSS, который поддерживает эти символы.
.myclass{font-family: blissregular, Arial}
Если это не сработает, возможно, вам придется вводить шрифты вручную. (На самом деле, я не на 100% уверен в поддержке iText @ font-face.) IText имеет вспомогательный класс, который может подсказать вам, что Bruno talks about it here, но, к сожалению, ссылка C# больше не работает. Это очень просто, просто создайте экземпляр класса FontSelector
, позвоните по номеру AddFont
в том порядке, в котором вы хотите, чтобы символы были просмотрены, а затем передайте строку в метод Process()
, который возвращает обратно Phrase
, который вы можете добавить. Ниже приведен базовый пример кода, который показывает это. Я извиняюсь за свой образец текста, я англичанин, поэтому я просто искал что-то для использования, я надеюсь, что я не исказил его или не отбросил назад.
Вам нужно будет перепрыгнуть через несколько дополнительных обручей при обработке HTML-кода, но, надеюсь, вы сможете с ним справиться.
//Sample string. I apologize, this is from a Google search so I hope it isn't backward
var testString = "يوم الاثنين \"monday\" in Arabic";
var outputFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Test.pdf");
//Standard PDF setup
using (var fs = new FileStream(outputFile, FileMode.Create, FileAccess.Write, FileShare.None)) {
using (var doc = new Document()) {
using (var writer = PdfWriter.GetInstance(doc, fs)) {
doc.Open();
//This is a font that I know *does not* support Arabic characters, substitute with your own font if you don't have it
var gishaFontPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "gisha.ttf");
var gishaBaseFont = BaseFont.CreateFont(gishaFontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
var gishaFont = new iTextSharp.text.Font(gishaBaseFont, 20);
//Add our test string using just a normal font, this *will not* display the Arabic characters
doc.Add(new Phrase(testString, gishaFont));
//This is a font that I know *does* support Arabic characters
var arialFontPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "ARIALUNI.TTF");
var arialBaseFont = BaseFont.CreateFont(arialFontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
var arialFont = new iTextSharp.text.Font(arialBaseFont, 20);
//Create our font selector specifying our most specific font first
var Sel = new FontSelector();
Sel.AddFont(gishaFont);
Sel.AddFont(arialFont);
//Have the font selector process our text into a series of chunks wrapped in a phrase
var newPhrase = Sel.Process(testString);
//Add the phrase, this will display both characters
doc.Add(newPhrase);
//Clean up
doc.Close();
}
}
}
Итак, у Bliss нет арабских символов, но ваш сайт покажет их еще? И ваш PDF не показывает их вообще? –
Точно. Простите за мой английский, если не было ясно. –
Я столкнулся с этой проблемой раньше, вы можете взглянуть на мой вопрос «Конвертировать арабский» unicode «content html или xml в pdf с помощью itextsharp», который может помочь вам http://stackoverflow.com/questions/16080741/convert-arabicunicode -поперечник-HTML или XML-к PDF-использования-itextsharp –