2013-12-01 6 views
0

Я использую itextsharp для генерации PDF из данных моей базы данных. Данные моей базы данных содержат текст, координату x и y и номер страницы. Вот как я это делаю.Китайские символы не отображаются с помощью iTextSharp

string oldFile = Server.MapPath(string.Format("~/App_Data/Documents/Templates/{0}", documentModel.Filename)); 

     // open the reader 
     PdfReader reader = new PdfReader(oldFile); 
     Rectangle size = reader.GetPageSizeWithRotation(1); 
     iTextSharp.text.Document document = new iTextSharp.text.Document(size); 

     PdfWriter writer = PdfWriter.GetInstance(document, _memoryStream); 
     writer.CloseStream = false; 
     document.Open(); 

     PdfContentByte cb; 
     PdfImportedPage page; 
     BaseFont bf; 


foreach (var pageNumber in pages) 
     { 
      document.NewPage(); 

      cb = writer.DirectContent; 
      // create the new page and add it to the pdf 
      page = writer.GetImportedPage(reader, pageNumber); 
      cb.AddTemplate(page, 0, 0); 
      bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); 
      cb.SetColorFill(BaseColor.DARK_GRAY); 
      cb.SetFontAndSize(bf, 9); 

      var items = documentModel.FieldContents.Where(a => a.Page == pageNumber).ToList(); 

      foreach (var item in items) 
      { 
       cb.BeginText(); 
       cb.ShowTextAligned(item.Alignment, item.Text ?? string.Empty, item.X, item.Y, item.Rotation); 
       cb.EndText(); 
      } 

     } 

     //////////////////////////////////////////////////////////////////// 

     document.Close(); 
     writer.Close(); 
     reader.Close(); 

     byte[] byteInfo = _memoryStream.ToArray(); 
     _memoryStream.Write(byteInfo, 0, byteInfo.Length); 
     _memoryStream.Position = 0; 

     RedirectToAction("Index"); 
     return new FileStreamResult(_memoryStream, "application/pdf"); 

Я использовал это какое-то время. Но я хочу поддержать и китайских персонажей. Я попытался ввести китайские символы, но он не отображается. Я изменил его на английский, и он работает. Есть идеи? Благодаря!

+5

Вы используете «HELVETICA», один из стандартных 14 шрифтов, и вы используете кодировку «CP1252». Также первые не содержат китайских иероглифов, и китайские символы не могут быть найдены на кодовой странице 1252. Таким образом, используйте шрифт, который содержит требуемые китайские символы, и используйте кодировку, разрешающую эти символы. – mkl

+0

Благодарим вас за отличное предложение. Если вы установили это как ответ, я мог бы принять его. Отличный совет. Благодаря! – ljpv14

+0

Просто примите ответ Бруно, который освещает эти аспекты еще немного. – mkl

ответ

2

В коде есть разные ошибки.

Как уже объяснил mkl, шрифт Type 1 Helvetica, который вы используете, не встроен и ничего не знает о китайских глифах. Вам нужно использовать шрифт, который знает, как рисовать китайские символы. Кроме того, CP1252 is the encoding for the Latin alphabet, так что вы не должны ожидать, что он ничего не знает о китайском.

Вы также создать код, который является незаконным (и что приводит к недопустимому синтаксису PDF):

cb.BeginText(); 
cb.ShowTextAligned(...); 
cb.EndText(); 

Это текстовый объект, для которого нет шрифта и размера не определен. Вы используете метод setFontAndSize() в графическом состоянии (где он не принадлежит), а не в текстовое состояние (там, где это необходимо). Тот факт, что этот код работает, говорит мне, что вы используете старую версию iTextSharp. You should upgrade.

Решение проблемы заключается в том, чтобы найти примеры добавления Chinese text with iText. Затем создайте'Phrase 'и расположите его, используя ColumnText.showTextAligned();. Используя ColumnText, вы избегаете проблемы, с которой вы сейчас сталкиваетесь с низкоуровневым подходом: вы используете beginText() и endText() без чтения спецификации PDF. ColumnText выполнит всю эту трудную работу под капотом.

В случае, если примеры Java смущают вас, посетите this page, где вы найдете ссылки на порт C# соответствующих примеров.

+1

Я исправил свою проблему, включив файл .ttf с unicode и ссылкой на него. Код работает без кода синтаксической ошибки. – ljpv14

1

Вы можете загрузить вам местный китайский шрифт, как этого

BaseFont baseFont = BaseFont.CreateFont(
       "C:\\Windows\\Fonts\\simhei.ttf", 
       BaseFont.IDENTITY_H, 
       BaseFont.EMBEDDED); 
Font font = new Font(baseFont); 

И затем использовать «шрифт» для дальнейших текстовых сообщений.

И вы можете ссылаться на общие используемые китайские местные шрифтах, как показано ниже

  {"yahei", "C:\\WINDOWS\\FONTS\\msyh.ttf"}, 
      {"fangsong", "C:\\WINDOWS\\FONTS\\simfang.ttf"}, 
      {"heiti" ,"C:\\Windows\\Fonts\\simhei.ttf"}, 
      {"kaiti" ,"C:\\Windows\\Fonts\\simkai.ttf"}, 
      {"lishu" ,"C:\\Windows\\Fonts\\SIMLI.TTF"}, 
      {"youyuan" ,"C:\\Windows\\Fonts\\SIMYOU.TTF"}, 
      {"songti" ,"C:\\Windows\\Fonts\\simsun.ttc,0"}, 
      {"xinsongti" ,"C:\\Windows\\Fonts\\simsun.ttc,1"} 

Надеется, что это помогает!

Смежные вопросы