iTextSharp международный текст - PullRequest
12 голосов
/ 13 ноября 2009

У меня есть таблица на странице asp.net, и я пытаюсь экспортировать ее как файл PDF, у меня есть пара международных символов, которые не отображаются в сгенерированном файле PDF, любые предложения,

Заранее спасибо

Ответы [ 4 ]

16 голосов
/ 13 ноября 2009

Ключом для правильного отображения альтернативных наборов символов (русский, китайский, японский и т. Д.) Является использование кодировки IDENTITY_H при создании BaseFont.

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 обеспечивает поддержку юникода для выбранного шрифта, поэтому вы должны иметь возможность отображать практически любой символ. Я использовал его для русского, греческого и всех европейских букв.

РЕДАКТИРОВАТЬ - 2013-May-28

Это также работает для v5.0.2 iTextSharp.

РЕДАКТИРОВАТЬ - 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, не изменит этого. Вердана прекрасно отображает символы всех европейских шрифтов, о которых я знаю. Другие шрифты могут не отображать столько символов.

5 голосов
/ 31 декабря 2010

Существуют две возможные причины, по которым символы не отображаются:

  1. Кодировка. Как указал Stewbob, Identity-H - отличный способ полностью избежать этой проблемы, хотя он требует от вас внедрения подмножества шрифта. Это имеет два последствия.
    1. Увеличивает размер файла немного по сравнению со встроенными шрифтами.
    2. Шрифт должен быть лицензирован для встроенных подмножеств. Большинство есть, некоторые нет.
  2. Шрифт должен содержать этот символ. Если вы попросите несколько арабских лигатур из кириллицы (русский), скорее всего, это не очень хорошо. Существует очень мало шрифтов, которые охватывают множество языков, и они, как правило, ОГРОМНЫ. Самый большой / самый полный шрифт, с которым я столкнулся, был "Arial Unicode MS". Более 23 мегабайт.

Это еще одна веская причина требовать встраивания подсабов. Занимать несколько мегабайт, потому что вы хотели добавить пару китайских глифов, немного круто.

Если вы чувствуете себя параноиком, вы можете сравнить свои строки с данным экземпляром BaseFont (который, я считаю, учитывает и кодировку) с помощью myBaseFont.charExists(someChar). Если у вас есть шрифт, в котором вы уверены, я бы не стал беспокоиться.

PS: Есть еще одна веская причина, по которой Identity-H требует встроенного подмножества. Identity-H считывает байты из потока контента как индексы глифов. Порядок глифов может сильно отличаться от одного шрифта к другому, или даже между версиями одного и того же шрифта. Полагаться на то, что система просмотра имеет тот же шрифт EXACT, является плохой идеей, поэтому это незаконно ... особенно, когда Acrobat / Reader начинает заменять шрифты, потому что он не может найти тот шрифт, который вы запрашивали, и вы его не встраивали.

0 голосов
/ 05 июля 2014

Это вызвано по умолчанию шрифтом iTextSharp - Helvetica - который не поддерживает кроме базовых символов (или не поддерживает все другие символы.

На самом деле есть 2 варианта:

  1. Один из них - переписать содержимое таблицы вручную в код. Этот подход может показаться вам более быстрым, но он требует, чтобы любая модификация исходной таблицы также повторялась в коде (нарушая принцип DRY). В этом случае вы можете легко настроить шрифт по своему желанию.
  2. Другой способ - извлечь PDF из HTML, извлеченного из HtmlEngine. Это может звучать немного сложнее и сложнее (и это так), однако, рабочее решение гораздо более гибкое и универсальное. Я сам недавно перенес борьбу со специальными символами и решил опубликовать несколько более полное решение в рамках другого подобного решения здесь на stackoverflow: https://stackoverflow.com/a/24587745/1138663
0 голосов
/ 13 ноября 2009

Вы можете попробовать установить кодировку для шрифта, который вы используете. В Java было бы что-то вроде этого:

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

где BaseFont.CP1252 - кодировка. Попробуйте найти точную кодировку, необходимую для отображения символов.

...