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

文字がレンダリングされない理由として、次の 2 つが考えられます。

  1. エンコーディング。Stewbob が指摘したように、Identity-H は問題を完全に回避する優れた方法ですが、フォントのサブセットを埋め込む必要があります。これには 2 つの結果があります。
    1. 埋め込まれていないフォントよりもファイル サイズが少し大きくなります。
    2. フォントは、埋め込みサブセット用にライセンスされている必要があります。ほとんどはそうですが、そうでないものもあります。
  2. フォントにはその文字が含まれている必要があります。キリル文字 (ロシア語) のフォントからアラビア語の合字を求めた場合、それが存在する可能性は高くありません。さまざまな言語をカバーするフォントはほとんどなく、巨大になる傾向があります。私が遭遇した最大/最も包括的なフォントは「Arial Unicode MS」でした。23 メガバイト以上。

これは、SUBSETS の埋め込みを要求するもう 1 つの正当な理由です。いくつかの中国語のグリフを追加するために数メガバイトを追加するのは少し急です。

偏執狂的だと感じている場合は、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. 1 つはテーブルの内容を手作業でコードに書き直すことです。このアプローチの方が高速に見えるかもしれませんが、元のテーブルに変更を加えてコードでも繰り返す必要があります (DRY の原則を破っています)。この場合、必要に応じて簡単にフォントを設定できます。
  2. もう一つは、HtmlEngine から抽出した HTML から PDF を抽出することです。これは少し複雑で複雑に聞こえるかもしれませんが (実際にそうです)、実用的なソリューションははるかに柔軟で普遍的です。私は少し前に特殊文字との闘いに苦しみ、stackoverflowの他の同様のソリューションの下にある程度完全なソリューションを投稿することにしました: https://stackoverflow.com/a/24587745/1138663
于 2014-07-05T15:25:01.193 に答える