12

我在 asp.net 页面中有一个表格,并尝试将其导出为 PDF 文件,我有几个国际字符未在生成的 PDF 文件中显示,任何建议,

提前致谢

4

4 回答 4

17

正确显示替代字符集(俄语、中文、日语等)的关键是在创建 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 年 5 月 28 日

这也适用于 iTextSharp v5.0.2。

编辑 - 2015 年 6 月 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

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

于 2009-11-13T13:44:53.497 回答
5

字符未呈现有两个潜在原因:

  1. 编码。正如 Stewbob 指出的那样,Identity-H 是完全避免该问题的好方法,尽管它确实需要您嵌入字体的子集。这有两个后果。
    1. 与未嵌入的字体相比,它会稍微增加文件大小。
    2. 该字体必须获得嵌入式子集的许可。大多数是,有些不是。
  2. 字体必须包含该字符。如果您要求使用西里尔文(俄文)字体使用一些阿拉伯语连字,那么它出现的可能性不大。涵盖多种语言的字体很少,而且它们往往是巨大的。我遇到的最大/最全面的字体是“Arial Unicode MS”。超过 23 兆字节。

这是需要嵌入子集的另一个很好的理由。因为你想添加几个中国字形而增加几兆字节有点陡峭。

如果您感到偏执,可以使用myBaseFont.charExists(someChar). 如果你有一个你有信心的字体,我不会打扰。

PS:Identity-H 需要嵌入子集还有另一个很好的理由。Identity-H 从内容流中读取字节作为字形索引。字形的顺序可以从一种字体到另一种字体变化很大,甚至在同一字体的不同版本之间变化很大。依靠查看器系统来拥有完全相同的字体是一个坏主意,因此它是非法的……尤其是当 Acrobat/Reader 开始替换字体时,因为它找不到您要求的确切字体并且您没有嵌入它。

于 2010-12-31T00:56:21.133 回答
0

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

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

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

于 2009-11-13T07:54:38.973 回答
0

它是由默认的 iTextSharp 字体 - Helvetica - 导致的,它不支持基本字符(或不支持所有其他字符。

实际上有2个选项:

  1. 一种是手动将表格内容改写成代码。这种方法对您来说可能看起来更快,但它也需要在代码中重复对原始表的任何修改(违反 DRY 原则)。在这种情况下,您可以根据需要轻松设置字体。
  2. 另一种是从HtmlEngine提取的HTML中提取PDF。这可能听起来有点复杂和复杂(确实如此),但是,工作解决方案更加灵活和通用。不久前,我自己遇到了特殊字符的斗争,并决定在 stackoverflow 上的其他类似解决方案下发布一个稍微完整的解决方案:https ://stackoverflow.com/a/24587745/1138663
于 2014-07-05T15:25:01.193 回答