第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

生成PDF時(shí)無(wú)法獲取捷克語(yǔ)字符

生成PDF時(shí)無(wú)法獲取捷克語(yǔ)字符

白板的微信 2019-07-23 14:52:00
生成PDF時(shí)無(wú)法獲取捷克語(yǔ)字符在生成PDF時(shí)添加“?”或“?”等字符時(shí)出現(xiàn)問(wèn)題。我主要使用段落在我的PDF報(bào)告中插入一些靜態(tài)文本。這是我使用的一些示例代碼:var document = new Document();document.Open();Paragraph p1 = new Paragraph("Testing of letters ?,?,?,?,?", new Font(Font.FontFamily.HELVETICA, 10));document.Add(p1);生成PDF文件時(shí)得到的輸出如下所示:“測(cè)試字母,?,?,?”出于某種原因,iTextSharp似乎不會(huì)識(shí)別這些字母,例如“?”和“?”。
查看完整描述

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)單


查看完整回答
反對(duì) 回復(fù) 2019-07-23
  • 2 回答
  • 0 關(guān)注
  • 654 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)