对于您的浏览器遇到的每个字符,它都会在当前字体中查找匹配的字形。如果字体没有该字形,则它会查找任何备用字体以查看它们是否具有该字形。最终,每个浏览器都有一组核心的默认字体,它们是最终的后备。当您指定 Bliss 字体但使用阿拉伯字符时,您可能只是看到浏览器的后备字体。
PDF 不是这样工作的。如果您说某些东西正在使用字体XYZ
,那么它将尝试使用该字体呈现它或失败。
最简单的方法可能是在您的 CSS 中添加支持这些字符的字体。
.myclass{font-family: blissregular, Arial}
如果这不起作用,您可能需要手动注入字体。(实际上,我也不是 100% 确定 iText 支持 @font-face。)iText 有一个帮助程序类,可以为您解决Bruno 在这里谈到的事情,但不幸的是 C# 链接不再工作了。这非常简单,您只需创建该类的一个实例,按照您希望在其中查找字符的顺序FontSelector
调用,然后将一个字符串传递给该方法,该方法会返回您可以添加的 a。下面是展示这一点的基本示例代码。我为我的示例文本道歉,我是英语母语,所以我只是搜索了一些可以使用的东西,我希望我没有弄乱它或让它倒退。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();
}
}
}