請看看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");
現在的字符顯示正確。換句話說:這是一個編碼的問題......
我已經更新了我的答案。在額外的片段中,您會找到解決方法。 –