2009-11-13 81 views
12

我在asp.net頁面的表格,並試圖將其導出爲PDF文件,我有沒有在生成的PDF文件,有什麼建議出幾個國際字符,iTextSharp的國際文本

謝謝advance

回答

0

您可以嘗試設置您正在使用的字體的編碼。在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

16

正確顯示替代字符集(俄語,中文,日語等)的關鍵是在創建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

5

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

  1. 編碼。正如Stewbob所指出的那樣,Identity-H是完全避免此問題的好方法,但它確實需要您嵌入字體的子集。這有兩個後果。
    1. 它增加了非嵌入字體的文件大小。
    2. 字體必須獲得嵌入子集的許可。大多數是,有些不是。
  2. 字體必須包含該字符。如果你用西里爾文(俄羅斯)字體索要一些阿拉伯語連字,那麼它可能會出現在那裏並不好。很少有包含各種語言的字體,而且它們往往很大。我遇到的最大/最全面的字體是「Arial Unicode MS」。超過23兆字節。

這是需要嵌入SUBSETS的另一個很好的理由。因爲你想添加幾個中國字形,所以在幾兆字節上加上一點點陡峭。

如果你覺得偏執,你可以使用myBaseFont.charExists(someChar)對照給定的BaseFont實例(我相信它也考慮了編碼)來檢查你的字符串。如果你有一個你有信心的字體,我不會打擾。

PS:還有一個很好的理由,即Identity-H需要嵌入子集。 Identity-H將內容流中的字節作爲字形索引讀取。字形的順序可以從一種字體到下一種字體,甚至在相同字體的版本之間大不相同。依靠觀衆系統使EXACT字體不變是一個壞主意,因此它非法......特別是當Acrobat/Reader開始替換字體時,因爲它無法找到您要求的確切字體,也沒有嵌入字體。 。

0

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

實際上有2種選擇:

  1. 之一是改寫這個方法對你來說可能看起來更快,但它需要對原始表進行任何修改,以便在代碼中重複(打破DRY原則),在這種情況下,你可以輕鬆設置字體如你所願
  2. 另一種是從HTML中提取PDF mlEngine。這可能聽起來有點複雜和複雜(而且),但是,工作解決方案更加靈活和通用。我剛剛與特殊角色鬥爭了一陣子,並決定在其他類似的解決方案下發佈一個稍微完整的解決方案,這裏是在計算器上:https://stackoverflow.com/a/24587745/1138663