iTextSharp的国际文本

问题描述:

我在asp.net页面的表格,并试图将其导出为PDF文件,我有没有在生成的PDF文件,有什么建议出几个国际字符,iTextSharp的国际文本

谢谢advance

您可以尝试设置您正在使用的字体的编码。在Java中是这样的:

BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.EMBEDDED); 

其中BaseFont.CP1252是编码。尝试搜索所需字符的确切编码。

+0

这对我不起作用。我试图在英文(罗马字体)文件中打印希腊字母,如mu和sigma。我相信内部字体不支持希腊字母,无论编码如何。 – 2013-06-27 17:52:23

+0

也不适用于我。 – Jovica 2015-06-23 13:01:49

正确显示替代字符集(俄语,中文,日语等)的关键是在创建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文件的屏幕截图:

sample pdf

重要的一点要记住的是,如果你选择的字体不支持你试图发送到PDF文件的字符,你在iTextSharp中做的任何事情都会改变这种情况。 Verdana很好地显示了我所知道的所有欧洲字体中的字符。 其他字体可能无法显示更多字符。

+0

BaseFont.CreateFont()的第二个参数是编码。而“身份-H”不是一个有效的编码体名,你确定吗? – 2012-08-31 16:02:17

+0

@ManitraAndriamitondra,这适用于iTextSharp v4.1.2。我有一段时间没有使用它,所以不知道这个版本是否仍然适用于当前版本。 – Stewbob 2012-09-03 13:49:18

+0

你必须指定字体文件的完整路径。您不能使用内部字体。例如,如果你想要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

有字符不会被渲染的可能原因:

  1. 编码。正如Stewbob所指出的那样,Identity-H是完全避免此问题的好方法,但它确实需要您嵌入字体的子集。这有两个后果。
    1. 它增加了非嵌入字体的文件大小。
    2. 字体必须获得嵌入子集的许可。大多数是,有些不是。
  2. 字体必须包含该字符。如果你用西里尔文(俄罗斯)字体索要一些阿拉伯语连字,那么它可能会出现在那里并不好。很少有包含各种语言的字体,而且它们往往很大。我遇到的最大/最全面的字体是“Arial Unicode MS”。超过23兆字节。

这是需要嵌入SUBSETS的另一个很好的理由。因为你想添加几个中国字形,所以在几兆字节上加上一点点陡峭。

如果你觉得偏执,你可以使用myBaseFont.charExists(someChar)对照给定的BaseFont实例(我相信它也考虑了编码)来检查你的字符串。如果你有一个你有信心的字体,我不会打扰。

PS:还有一个很好的理由,即Identity-H需要嵌入子集。 Identity-H将内容流中的字节作为字形索引读取。字形的顺序可以从一种字体到下一种字体,甚至在相同字体的版本之间大不相同。依靠观众系统使EXACT字体不变是一个坏主意,因此它非法......特别是当Acrobat/Reader开始替换字体时,因为它无法找到您要求的确切字体,也没有嵌入字体。 。

它引起的默认iTextSharp的字体 - Helvetica字体 - 不支持除基本字符(或不支持所有其他字符

实际上有2种选择:

  1. 之一是改写这个方法对你来说可能看起来更快,但它需要对原始表进行任何修改,以便在代码中重复(打破DRY原则),在这种情况下,你可以轻松设置字体如你所愿
  2. 另一种是从HTML中提取PDF mlEngine。这可能听起来有点复杂和复杂(而且),但是,工作解决方案更加灵活和通用。我刚刚与特殊角色斗争了一阵子,并决定在其他类似的解决方案下发布一个稍微完整的解决方案,这里是在计算器上:https://stackoverflow.com/a/24587745/1138663