文档信息字典键中的Unicode字符

文档信息字典键中的Unicode字符,unicode,itextsharp,itext,pdfstamper,Unicode,Itextsharp,Itext,Pdfstamper,如何创建包含unicode字符(通常为瑞典语字符,例如C3A4 U+00E4ä)的文档信息字典键。我想使用PdfStamper在文档信息字典中输入我自己的元数据,但我无法让它接受瑞典语字符 使用Acrobat输入自定义元数据效果很好,在文本编辑器中查看PDF时,我可以看到字符的编码方式与上面提到的字符类似#C3#A4。那么,有没有一种方法可以使用iText PdfStamper以编程方式实现这一点 问候 马蒂亚斯 注:在信息字典值中使用unicode字符没有问题,但键是另一回事。请看一看示例,并

如何创建包含unicode字符(通常为瑞典语字符,例如C3A4 U+00E4ä)的文档信息字典键。我想使用PdfStamper在文档信息字典中输入我自己的元数据,但我无法让它接受瑞典语字符

使用Acrobat输入自定义元数据效果很好,在文本编辑器中查看PDF时,我可以看到字符的编码方式与上面提到的字符类似#C3#A4。那么,有没有一种方法可以使用iText PdfStamper以编程方式实现这一点

问候 马蒂亚斯

注:在信息字典值中使用unicode字符没有问题,但键是另一回事。

请看一看示例,并尝试一下。您将看到iText自动转义名称中的特殊字符

iText遵循ISO-32000-1规范,该规范包含以下数据(7.3.5,命名对象):

从PDF 1.2开始,名称对象是唯一的原子符号 由除null以外的任何字符(8位值)序列定义 (字符代码0)。唯一定义意味着任意两个名称对象 由相同的字符序列组成,表示相同的对象。 原子意味着名称没有内部结构;虽然是 由一系列字符定义,这些字符不是 考虑了名称的元素

不是名称的一部分,而是一个前缀,表示后面是 表示PDF文件中名称的字符序列,并应 遵循以下规则:

a) 名称中的数字符号(23h)(#)应使用其 2位十六进制代码(23),前面有数字符号

b) 名称中的任何常规字符(除 数字符号)应书写为自身或使用其2位数字 十六进制代码,前面有数字符号

c) 任何非正规字符均应书写 使用其2位十六进制代码,前面仅带数字符号

注1:PDF文件中没有唯一的名称编码 因为正则字符可以用两种方式之一进行编码

用作名称一部分的空白应始终使用 两位十六进制表示法,两位之间不得有空格 索利多金币和编码名称

超出感叹号范围的常规字符(21h) (!)到TILDE(7Eh)(~)应使用十六进制写入 符号

索里达币(斜杠后跟非常规字符) 引入由的空序列定义的唯一有效名称 人物

注2:表4所示示例和包含#的示例无效 PDF 1.0或1.1中的文字名称

我没有复制/粘贴表4,但我没有看到任何使用由两个字节组成的字符的示例。您是否可以共享一个PDF文件,其中包含一个具有两个字节字符的名称,该字符的行为符合您的要求?PDF规范明确指出名称上下文中的字符是8位值。您似乎在谈论16位值

附加说明:在当前的iText实现中,我们只看8位:

c = (char)(chars[k] & 0xff);
当传递超过8位的字符时,我们故意丢弃所有高位

事实上,我想我已经回答了你的问题。起初,我以为您要求添加此角色:

事实证明,你只需要。我制作了一个小代码示例,演示如何向包含以下字符的DID添加自定义条目:

这意味着iText已正确转义了特殊字符

然而:正如你在评论中指出的,这个角色并没有出现在AdobeReader中。基于我使用Acrobat创建的PDF,我使用以下代码找到了一个解决方法:

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

现在角色显示正确。换句话说:这是一个编码的问题…

只是想分享一个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进行解释。

我已更新了答案。在额外的代码片段中,您将找到一个解决方法。
StringBuffer buf = new StringBuffer();
buf.append((char) 0xc3);
buf.append((char) 0xa4);
info.put(buf.toString(), "\u00e4");
        string inputString = "My key with åäö";
        byte[] inputBytes = Encoding.UTF8.GetBytes(inputString);
        string convertedString = Encoding.UTF7.GetString(inputBytes);
        info.Add(convertedString, "My value with åäö");