2014-02-06 28 views
1

如何創建包含Unicode字符(通常爲瑞典語字符,例如C3A4 U + 00E4ä)的文檔信息字典鍵。我想使用PdfStamper在文檔信息字典中輸入我自己的元數據,但我無法讓它接受瑞典字符。文檔信息字典鍵中的Unicode字符

使用Acrobat輸入自定義元數據可以正常工作,並在文本編輯器中查看PDF我可以看到字符的編碼像上面提到的字符#C3#A4。那麼有沒有一種方法來實現這個使用iText PdfStamper編程?

問候 馬蒂亞斯

PS。在info字典值中使用unicode字符沒有問題,但鍵是不同的故事。

回答

0

請看看NameObject的例子,並試試看。您會看到iText會自動轉義名稱中的特殊字符。

iText的遵循ISO-32000-1規範,統計(7.3.5,名稱對象):

與PDF 1.2的名稱對象開始時的原子符號唯一地 通過任何字符的序列所定義(8位值),除了空 (字符代碼0)。唯一定義意味着由相同字符序列組成的任何兩個名稱對象 表示相同的對象。原子是指名稱沒有內部結構;雖然它是由一系列字符定義的 ,但這些字符不是 所考慮的名稱的元素。

不是名稱的一部分,但表示接下來是在PDF文件中表示名稱字符 序列,並應 遵循這些規則的前綴:

一)數字符號(23H)( #)的名稱應使用其 2位十六進制代碼(23)編寫,前面加上數字符號。 b)作爲常規字符的名稱中的任何字符(除 NUMBER SIGN以外)應寫爲自身或使用其2位 十六進制代碼,前面帶有數字符號。

c)任何非常規字符的字符都應該使用其2位十六進制代碼寫入 ,前面加上NUMBER SIGN。

注1:PDF文件 中沒有唯一的名稱編碼,因爲常規字符可能以兩種方式編碼。

用作名稱的一部分空白應當始終使用 2位十六進制表示法被編碼和沒有空白可 固相線和所述編碼的名稱之間介入。

是範圍感嘆號(21H) (!),以波浪號(把7Eh)(〜)之外的普通字符應該使用十六進制 符號來書寫。

令牌SOLIDUS(斜線後跟無正則字符) 引入由空字符 字符定義的唯一有效名稱。

注2表4中顯示的示例和包含#的示例在PDF 1.0或1.1中無效 字面名稱。

我不復制/粘貼表4,但我沒有看到任何使用由兩個字節組成的字符的示例。你可以分享一個PDF文件,其中包含一個雙字節字符的行爲符合你的意願的名字嗎? PDF規範明確指出,名稱上下文中的字符是8位值。你似乎是在談論16位值...

附加說明:在當前實現的iText的,我們只看8位:

c = (char)(chars[k] & 0xff); 

我們故意扔掉所有的更高當超過8位的字符被傳遞時,這些位將被傳送。

其實,我想我已經回答了你的問題。起初,我以爲你是要求添加這個字符:http://www.fileformat.info/info/unicode/char/c3a4/index.htm

事實證明,你只需要"\u00e4" (ä)。我製作了一個小代碼示例,演示如何將自定義條目添加到包含此字符的DID中:ChangeInfoDictionary

public void manipulatePdf(String src, String dest) throws IOException, DocumentException { 
    PdfReader reader = new PdfReader(src); 
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); 
    Map<String, String> info = reader.getInfo(); 
    info.put("Special Character: \u00e4", "\u00e4"); 
    stamper.setMoreInfo(info); 
    stamper.close(); 
    reader.close(); 
} 

當然,當你打開一個PDF瀏覽器的PDF,你不一定看到「特殊字符:a」作爲核心價值,但這是PDF閱讀器中的一個問題。當您打開一個文本編輯器的PDF,你清楚地看到:

/Special#20Character:#20#e4(ä) 

這意味着,iText的是否正確轉義特殊字符。

但是,正如您在評論中指出的那樣,字符不會顯示在Adobe Reader中。根據我使用Acrobat創建的PDF,我發現了一個變通方法,通過使用下面的代碼:

StringBuffer buf = new StringBuffer(); 
buf.append((char) 0xc3); 
buf.append((char) 0xa4); 
info.put(buf.toString(), "\u00e4"); 

現在的字符顯示正確。換句話說:這是一個編碼的問題......

+0

我已經更新了我的答案。在額外的片段中,您會找到解決方法。 –

0

只是想分享一個在C#中的實驗,說明一種將特殊字符放入文檔信息字典鍵中的方法。

 string inputString = "My key with åäö"; 
     byte[] inputBytes = Encoding.UTF8.GetBytes(inputString); 
     string convertedString = Encoding.UTF7.GetString(inputBytes); 
     info.Add(convertedString, "My value with åäö"); 

(info是用於添加元數據的字典)然後,只需使用PdfStamper將信息導入PDF。元數據正確存儲在PDF中,可以通過Adobe Reader進行解釋。