回答
您可以嘗試設置您正在使用的字體的編碼。在Java中是這樣的:
BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.EMBEDDED);
其中BaseFont.CP1252是編碼。嘗試搜索所需字符的確切編碼。
正確顯示替代字符集(俄語,中文,日語等)的關鍵是在創建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文件的屏幕截圖:
重要的一點要記住的是,如果你選擇的字體不支持你試圖發送到PDF文件的字符,你在iTextSharp中做的任何事情都會改變這種情況。 Verdana很好地顯示了我所知道的所有歐洲字體中的字符。 其他字體可能無法顯示更多字符。
BaseFont.CreateFont()的第二個參數是編碼。而「身份-H」不是一個有效的編碼體名,你確定嗎? – 2012-08-31 16:02:17
@ManitraAndriamitondra,這適用於iTextSharp v4.1.2。我有一段時間沒有使用它,所以不知道這個版本是否仍然適用於當前版本。 – Stewbob 2012-09-03 13:49:18
你必須指定字體文件的完整路徑。您不能使用內部字體。例如,如果你想要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
有字符不會被渲染的可能原因:
- 編碼。正如Stewbob所指出的那樣,Identity-H是完全避免此問題的好方法,但它確實需要您嵌入字體的子集。這有兩個後果。
- 它增加了非嵌入字體的文件大小。
- 字體必須獲得嵌入子集的許可。大多數是,有些不是。
- 字體必須包含該字符。如果你用西里爾文(俄羅斯)字體索要一些阿拉伯語連字,那麼它可能會出現在那裏並不好。很少有包含各種語言的字體,而且它們往往很大。我遇到的最大/最全面的字體是「Arial Unicode MS」。超過23兆字節。
這是需要嵌入SUBSETS的另一個很好的理由。因爲你想添加幾個中國字形,所以在幾兆字節上加上一點點陡峭。
如果你覺得偏執,你可以使用myBaseFont.charExists(someChar)
對照給定的BaseFont實例(我相信它也考慮了編碼)來檢查你的字符串。如果你有一個你有信心的字體,我不會打擾。
PS:還有一個很好的理由,即Identity-H需要嵌入子集。 Identity-H將內容流中的字節作爲字形索引讀取。字形的順序可以從一種字體到下一種字體,甚至在相同字體的版本之間大不相同。依靠觀衆系統使EXACT字體不變是一個壞主意,因此它非法......特別是當Acrobat/Reader開始替換字體時,因爲它無法找到您要求的確切字體,也沒有嵌入字體。 。
它引起的默認iTextSharp的字體 - Helvetica字體 - 不支持除基本字符(或不支持所有其他字符
實際上有2種選擇:
- 之一是改寫這個方法對你來說可能看起來更快,但它需要對原始表進行任何修改,以便在代碼中重複(打破DRY原則),在這種情況下,你可以輕鬆設置字體如你所願
- 另一種是從HTML中提取PDF mlEngine。這可能聽起來有點複雜和複雜(而且),但是,工作解決方案更加靈活和通用。我剛剛與特殊角色鬥爭了一陣子,並決定在其他類似的解決方案下發佈一個稍微完整的解決方案,這裏是在計算器上:https://stackoverflow.com/a/24587745/1138663
- 1. 顯示國際文本
- 2. ITextSharp:用西里爾文/國際詞語解析html
- 3. 國際文本的Scrapy問題
- 4. JavaME國際化(國際化)
- 5. 國際化的HTML文件
- 6. GWT HTML文件的國際
- 7. 國際化Bash腳本
- 8. 國際ICU版本過時。
- 9. Rails 3 ActiveForm國際化(國際化)
- 10. 檢測國際化的.NET版本
- 11. Rails中的國際化和本地化。
- 12. Drupal的國際化 -
- 13. Django的國際化
- 14. 的反應,國際
- 15. DateTime的國際化
- 16. ItextSharp文本操作
- 17. PHP國際化
- 18. jqGrid國際化
- 19. 場國際
- 20. YAML國際化
- 21. 國際在Django
- 22. Struts2 +國際化
- 23. GWT國際
- 24. 國際化sitemesh
- 25. 國際化與
- 26. GWT國際化
- 27. Libgdx國際
- 28. PHP國際嗎?
- 29. Mono國際化
- 30. 國際化
這對我不起作用。我試圖在英文(羅馬字體)文件中打印希臘字母,如mu和sigma。我相信內部字體不支持希臘字母,無論編碼如何。 – 2013-06-27 17:52:23
也不適用於我。 – Jovica 2015-06-23 13:01:49