iTextSharp的国际文本
您可以尝试设置您正在使用的字体的编码。在Java中是这样的:
BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.EMBEDDED);
其中BaseFont.CP1252是编码。尝试搜索所需字符的确切编码。
正确显示替代字符集(俄语,中文,日语等)的关键是在创建BaseFont时使用IDENTITY_H编码。
Dim bfR As iTextSharp.text.pdf.BaseFont
bfR = iTextSharp.text.pdf.BaseFont.CreateFont("MyFavoriteFont.ttf", iTextSharp.text.pdf.BaseFont.IDENTITY_H, iTextSharp.text.pdf.BaseFont.EMBEDDED)
IDENTITY_H为您选择的字体提供unicode支持,所以您应该能够显示几乎任何字符。我用它来写俄语,希腊语和所有不同的欧洲语言信件。
编辑 - 2013 - 月 - 28
这也适用于iTextSharp的的V5.0.2。
编辑 - 2015年六月-23
下面给出的是一个完整的代码示例(在C#):
private void CreatePdf()
{
string testText = "đĔĐěÇøç";
string tmpFile = @"C:\test.pdf";
string myFont = @"C:\<<valid path to the font you want>>\verdana.ttf";
iTextSharp.text.Rectangle pgeSize = new iTextSharp.text.Rectangle(595, 792);
iTextSharp.text.Document doc = new iTextSharp.text.Document(pgeSize, 10, 10, 10, 10);
iTextSharp.text.pdf.PdfWriter wrtr;
wrtr = iTextSharp.text.pdf.PdfWriter.GetInstance(doc,
new System.IO.FileStream(tmpFile, System.IO.FileMode.Create));
doc.Open();
doc.NewPage();
iTextSharp.text.pdf.BaseFont bfR;
bfR = iTextSharp.text.pdf.BaseFont.CreateFont(myFont,
iTextSharp.text.pdf.BaseFont.IDENTITY_H,
iTextSharp.text.pdf.BaseFont.EMBEDDED);
iTextSharp.text.BaseColor clrBlack =
new iTextSharp.text.BaseColor(0, 0, 0);
iTextSharp.text.Font fntHead =
new iTextSharp.text.Font(bfR, 12, iTextSharp.text.Font.NORMAL, clrBlack);
iTextSharp.text.Paragraph pgr =
new iTextSharp.text.Paragraph(testText, fntHead);
doc.Add(pgr);
doc.Close();
}
这是所创建的pdf文件的屏幕截图:
重要的一点要记住的是,如果你选择的字体不支持你试图发送到PDF文件的字符,你在iTextSharp中做的任何事情都会改变这种情况。 Verdana很好地显示了我所知道的所有欧洲字体中的字符。 其他字体可能无法显示更多字符。
BaseFont.CreateFont()的第二个参数是编码。而“身份-H”不是一个有效的编码体名,你确定吗? – 2012-08-31 16:02:17
@ManitraAndriamitondra,这适用于iTextSharp v4.1.2。我有一段时间没有使用它,所以不知道这个版本是否仍然适用于当前版本。 – Stewbob 2012-09-03 13:49:18
你必须指定字体文件的完整路径。您不能使用内部字体。例如,如果你想要Helvetica 12,你需要指定'BaseFont.CreateFont(“C:\ Windows \ Fonts \ Ariel.ttf”,BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED)'。如果您使用内部字体(例如BaseFont.HELVETICA),您将获得“Identity-H”不是有效的编码主体名称。 – 2013-06-27 17:49:10
有字符不会被渲染的可能原因:
- 编码。正如Stewbob所指出的那样,Identity-H是完全避免此问题的好方法,但它确实需要您嵌入字体的子集。这有两个后果。
- 它增加了非嵌入字体的文件大小。
- 字体必须获得嵌入子集的许可。大多数是,有些不是。
- 字体必须包含该字符。如果你用西里尔文(俄罗斯)字体索要一些阿拉伯语连字,那么它可能会出现在那里并不好。很少有包含各种语言的字体,而且它们往往很大。我遇到的最大/最全面的字体是“Arial Unicode MS”。超过23兆字节。
这是需要嵌入SUBSETS的另一个很好的理由。因为你想添加几个中国字形,所以在几兆字节上加上一点点陡峭。
如果你觉得偏执,你可以使用myBaseFont.charExists(someChar)
对照给定的BaseFont实例(我相信它也考虑了编码)来检查你的字符串。如果你有一个你有信心的字体,我不会打扰。
PS:还有一个很好的理由,即Identity-H需要嵌入子集。 Identity-H将内容流中的字节作为字形索引读取。字形的顺序可以从一种字体到下一种字体,甚至在相同字体的版本之间大不相同。依靠观众系统使EXACT字体不变是一个坏主意,因此它非法......特别是当Acrobat/Reader开始替换字体时,因为它无法找到您要求的确切字体,也没有嵌入字体。 。
它引起的默认iTextSharp的字体 - Helvetica字体 - 不支持除基本字符(或不支持所有其他字符
实际上有2种选择:
- 之一是改写这个方法对你来说可能看起来更快,但它需要对原始表进行任何修改,以便在代码中重复(打破DRY原则),在这种情况下,你可以轻松设置字体如你所愿
- 另一种是从HTML中提取PDF mlEngine。这可能听起来有点复杂和复杂(而且),但是,工作解决方案更加灵活和通用。我刚刚与特殊角色斗争了一阵子,并决定在其他类似的解决方案下发布一个稍微完整的解决方案,这里是在计算器上:https://stackoverflow.com/a/24587745/1138663
这对我不起作用。我试图在英文(罗马字体)文件中打印希腊字母,如mu和sigma。我相信内部字体不支持希腊字母,无论编码如何。 – 2013-06-27 17:52:23
也不适用于我。 – Jovica 2015-06-23 13:01:49