2 回答

TA貢獻(xiàn)1900條經(jīng)驗(yàn) 獲得超5個(gè)贊
問(wèn)題:
首先,你似乎不是在談?wù)撐骼餇栕址顷P(guān)于使用拉丁字母的中歐和東歐語(yǔ)言。看看代碼頁(yè)1250和代碼頁(yè)1251之間的區(qū)別,以了解我的意思。[注意:我已經(jīng)更新了這個(gè)問(wèn)題,以便它談?wù)摻菘苏Z(yǔ)而不是西里爾語(yǔ)。]
第二次觀察。您正在編寫包含特殊字符的代碼:
"Testing of letters ?,?,?,?,?"
這是一種不好的做法。代碼文件以純文本格式存儲(chǔ),可以使用不同的編碼進(jìn)行保存。從編碼中意外切換(例如:通過(guò)將其上載到使用不同編碼的版本控制系統(tǒng))可能會(huì)嚴(yán)重?fù)p壞文件的內(nèi)容。
您應(yīng)該編寫不包含特殊字符但使用其他符號(hào)的代碼。例如:
"Testing of letters \u010c,\u0106,\u0160,\u017d,\u0110"
這還將確保在使用期望不同編碼的編譯器編譯代碼時(shí)不會(huì)更改內(nèi)容。
你的第三個(gè)錯(cuò)誤是你認(rèn)為Helvetica是一種知道如何繪制這些字形的字體。這是一個(gè)錯(cuò)誤的假設(shè)。您應(yīng)該使用字體文件,如Arial.ttf(或選擇任何其他知道如何繪制這些字形的字體)。
你的第四個(gè)錯(cuò)誤是你沒(méi)有嵌入字體。假設(shè)您使用本地計(jì)算機(jī)上的字體并且能夠繪制特殊字形,那么您將能夠讀取本地計(jì)算機(jī)上的文本。但是,收到您的文件但沒(méi)有您在本地計(jì)算機(jī)上使用的字體的人可能無(wú)法正確讀取文檔。
你的第五個(gè)錯(cuò)誤是你在使用字體時(shí)沒(méi)有定義編碼(這與你的第二個(gè)錯(cuò)誤相關(guān),但它有所不同)。
解決方案:
我寫了一個(gè)名為CzechExample的小例子,它產(chǎn)生了以下PDF:czech.pdf
我已經(jīng)兩次添加相同的文本,但使用不同的編碼:
public static final String FONT = "resources/fonts/FreeSans.ttf";public void createPdf(String dest) throws IOException, DocumentException { Document document = new Document(); PdfWriter.getInstance(document, new FileOutputStream(DEST)); document.open(); Font f1 = FontFactory.getFont(FONT, "Cp1250", true); Paragraph p1 = new Paragraph("Testing of letters \u010c,\u0106,\u0160,\u017d,\u0110", f1); document.add(p1); Font f2 = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, true); Paragraph p2 = new Paragraph("Testing of letters \u010c,\u0106,\u0160,\u017d,\u0110", f2); document.add(p2); document.close();}
為了避免你的第三個(gè)錯(cuò)誤,我使用了字體FreeSans.ttf而不是Helvetica。您可以選擇任何其他字體,只要它支持您要使用的字符即可。為了避免你的第四個(gè)錯(cuò)誤,我已將embedded
參數(shù)設(shè)置為true
。
至于你的第五個(gè)錯(cuò)誤,我介紹了兩種不同的方法。
在第一種情況下,我告訴iText使用代碼頁(yè)1250。
Font f1 = FontFactory.getFont(FONT, "Cp1250", true);
這會(huì)將字體作為簡(jiǎn)單字體嵌入到PDF中,這意味著您的每個(gè)字符String
都將使用單個(gè)字節(jié)表示。這種方法的優(yōu)點(diǎn)是簡(jiǎn)單; 缺點(diǎn)是你不應(yīng)該開始混合代碼頁(yè)。例如:這對(duì)西里爾字形無(wú)效。
在第二種情況下,我告訴iText使用Unicode進(jìn)行水平書寫:
Font f2 = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, true);
這會(huì)將字體作為復(fù)合字體嵌入到PDF中,這意味著您的每個(gè)字符String
將使用多個(gè)字節(jié)來(lái)表示。這種方法的優(yōu)點(diǎn)是它是新PDF標(biāo)準(zhǔn)中的推薦方法(例如PDF / A,PDF / UA),并且您可以將西里爾語(yǔ)與拉丁語(yǔ),中文與日語(yǔ)等混合使用......缺點(diǎn)是你創(chuàng)建更多字節(jié),但這種影響受到內(nèi)容流無(wú)論如何被壓縮的限制。
當(dāng)我解壓縮PDF示例中的文本的內(nèi)容流時(shí),我看到以下PDF語(yǔ)法:
正如我所解釋的,單個(gè)字節(jié)用于存儲(chǔ)第一行的文本。雙字節(jié)用于存儲(chǔ)第二行的文本。
您可能會(huì)驚訝于這些角色在外部看起來(lái)很好(當(dāng)在Adobe Reader中查看文本時(shí)),但與您在內(nèi)部看到的內(nèi)容(在查看第二個(gè)屏幕截圖時(shí))不一致,但這是它的工作原理。
結(jié)論:
許多人認(rèn)為創(chuàng)建PDF是微不足道的,創(chuàng)建PDF的工具應(yīng)該是一種商品。實(shí)際上,它并不總是那么簡(jiǎn)單
- 2 回答
- 0 關(guān)注
- 654 瀏覽
添加回答
舉報(bào)