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

时间:2014-02-06 15:38:36

标签: unicode itextsharp itext pdfstamper

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

使用Acrobat输入自定义元数据可以正常工作并在文本编辑器中查看PDF我可以看到字符的编码类似于上面提到的字符#C3#A4。那么有没有办法使用iText PdfStamper ???

以编程方式实现此目的

问候 的Mattias

PS。在信息字典值中有unicode字符没有问题,但键是不同的故事。

2 个答案:

答案 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进行解释。