我的程序根据要求生成相对简单的PDF文档,但是我遇到了unicode字符的麻烦,比如汉字或奇数数学符号.要在PDF中编写普通字符串,请将其放在括号中:
(something)
还可以选择使用八进制代码转义字符:
(\527)
但这最多只能达到512个字符.你如何编码或逃避更高的字符?我已经看到了对字节流和十六进制编码字符串的引用,但我读过的所有引用似乎都不愿意告诉我如何实际执行它.
编辑:或者,指向一个好的Java PDF库,它将为我完成这项工作.我正在使用的是gnujpdf的一个版本(我修复了几个错误,因为原作者似乎已经破解了),这允许你针对AWT图形界面进行编程,理想情况下,任何替换应该做相同.
替代方案似乎是HTML - > PDF,或基于段落和方框的编程模型,感觉非常像HTML.iText是后者的一个例子.这意味着重写我现有的代码,我不相信他们会给我相同的灵活性.
编辑2:我之前没有意识到,但iText库有一个Graphics2D API,似乎完美地处理unicode,所以这就是我将要使用的.虽然它不是问题的答案,但它解决了我的问题.
编辑3: iText对我很有用.我想这一教训是,当面对一些看起来毫无意义的困难时,找一个比你更了解它的人.
在第3章的PDF参考中,这是他们对Unicode的看法:
文本字符串以PDFDocEncoding或Unicode字符编码进行编码.PDFDocEncoding是ISO Latin 1编码的超集,并在附录D中有说明.Unicode在Unicode标准中由Unicode Consortium描述(参见参考书目).对于以Unicode编码的文本字符串,前两个字节必须为254,后跟255.这两个字节表示Unicode字节顺序标记U + FEFF,表示字符串是以UTF-16BE(big-endian)编码方案编码的在Unicode标准中指定.(这种机制排除了使用PDFDocEncoding开始一个字符串,其中两个字符刺ydieresis,这不太可能是单词或短语的有意义的开头).
简单的答案是没有简单的答案.如果你看一下PDF规范,你会看到整个章节 - 而且很长一段时间 - 致力于文本显示的机制.我为我的公司实施了所有PDF支持,处理文本是迄今为止最复杂的练习部分.您发现的解决方案 - 使用第三方库为您完成工作 - 确实是最佳选择,除非您对PDF文件有非常具体的特殊用途要求.
阿尔戈曼的答案很多都是错误的.你可以制作一个带有unicode的PDF文档,虽然它需要一些工作,但它不是火箭科学.是的,他是对的,要在一种字体中使用超过255个字符,你必须创建一个复合字体(CIDFont)pdf对象.然后,您只需提及要用作CIDFont的DescendatFont条目的实际TrueType字体.诀窍是,之后你必须使用字体的字形索引而不是字符代码.要获得此索引映射,您必须解析cmap
字体的部分 - 获取具有GetFontData
函数的字体内容并接受TTF规范.就是这样!我刚刚做了,现在我有一个unicode pdf!
解析cmap
部分的示例代码位于:https://support.microsoft.com/en-us/kb/241020
是的,不要忘记/ ToUnicode条目@ user2373071指出或用户将无法搜索您的PDF或从中复制文本.
正如dredkin所指出的,您必须在页面内容流中使用字形索引而不是Unicode字符值。这足以在PDF中显示Unicode文本,但是Unicode文本将不可搜索。要使文本可搜索或具有复制/粘贴功能,还需要包含/ ToUnicode流。此流应将文档中的每个字形转换为实际的Unicode字符。