如何创建包含unicode字符的文档信息字典键(通常是瑞典字符,例如C3A4 U +00E4ä)。我想使用PdfStamper在文档信息字典中输入我自己的元数据,但我无法接受瑞典语字符。
使用Acrobat输入自定义元数据可以正常工作并在文本编辑器中查看PDF我可以看到字符的编码类似于上面提到的字符#C3#A4。那么有没有办法使用iText PdfStamper ???
以编程方式实现此目的问候 的Mattias
PS。在信息字典值中有unicode字符没有问题,但键是不同的故事。
答案 0 :(得分:0)
请查看NameObject示例,并尝试一下。您会看到iText会自动转义名称中的特殊字符。
iText遵循ISO-32000-1规范的统计数据(7.3.5,名称对象):
从PDF 1.2开始,名称对象是唯一的原子符号 由除null之外的任何字符序列(8位值)定义 (字符代码0)。唯一定义意味着任何两个名称对象 由相同的字符序列组成,表示相同的对象。 原子意味着名称没有内部结构;虽然是 由一系列字符定义,这些字符不是 被认为是名称的要素。
不是名称的一部分,而是一个前缀,表示后面的内容是a 代表PDF文件中名称的字符序列和 遵循以下规则:
a)名称中的数字标志(23h)(#)应使用其编写 2位十六进制代码(23),前面是NUMBER SIGN。
b)名称中的任何字符都是常规字符(除了 NUMBER SIGN)应自行编写或使用其2位数字 十六进制代码,前面有NUMBER SIGN。
c)任何不是常规字符的字符都应写入 使用其2位十六进制代码,前面只有NUMBER SIGN。
注1:PDF文件中没有唯一的名称编码 因为常规字符可以用两种方式编码。
用作名称一部分的空格应始终使用 2位十六进制表示法,没有空格可以介入 SOLIDUS和编码名称。
EXCLAMATION MARK(21h)范围之外的常规字符 (!)到TILDE(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时,您不一定会将“特殊字符:ä”视为键值,但这是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");
现在角色显示正确。换句话说:这是编码的问题......
答案 1 :(得分: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进行解释。