PDF中的Unicode
我的程序可应要求生成相对简单的PDF文档,但是我遇到了诸如汉字或者奇数数学符号之类的Unicode字符的麻烦。要在PDF中编写普通字符串,请将其放在方括号中:
(something)
还可以选择使用八进制代码对字符进行转义:
(7)
但这最多为512个字符。我们如何编码或者转义更高的字符?我看过对字节流和十六进制编码字符串的引用,但是我看过的所有引用似乎都不愿意告诉我如何实际执行。
编辑:或者,将我指向一个很好的Java PDF库,它将为我完成这项工作。我当前正在使用的是gnujpdf的一个版本(由于原始作者似乎已经弃用了AWOL,我已经修复了其中的几个错误),该版本可让我们针对AWT图形界面进行编程,理想情况下,任何替换都可以相同。
替代方案似乎是HTML-> PDF,或者是基于段落和框的编程模型,感觉很像HTML。 iText是后者的一个示例。这将意味着重写我现有的代码,并且我不相信它们会给我同样的灵活性。
编辑2:我以前没有意识到,但是iText库具有Graphics2D API,并且似乎可以完美地处理unicode,所以这就是我要使用的。尽管这不是所问问题的答案,但它为我解决了问题。
编辑3:iText对我来说很好。我想这堂课是,当遇到似乎毫无意义的困难时,请寻找比你更了解这件事的人。
解决方案
我不是PDF专家,而且(正如Ferruccio所说),Adobe的PDF规范应该可以告诉我们所有信息,但是我脑海中浮现出一个想法:
我们确定使用支持所有所需字符的字体吗?
在我们的应用程序中,我们从HTML页面(带有第三方库)创建PDF,而西里尔字符存在此问题...
简单的答案是没有简单的答案。如果我们看一下PDF规范,将会看到一整章,其中一长篇专门讨论文本显示的机制。我为公司实施了所有PDF支持,而处理文本是迄今为止练习中最复杂的部分。我们发现的解决方案使用第三方库为我们完成工作,这确实是最佳选择,除非我们对PDF文件有非常特定的特殊用途要求。
请参阅PDF规范的附录D(第995页)。 PDF使用者应用程序中预定义的字体和字符集数量有限。要显示其他字符,我们需要嵌入包含它们的字体。为了减小文件大小,最好只嵌入字体的子集,仅包括必需的字符。我还致力于显示PDF中的Unicode字符,这是一个很大的麻烦。
检出PDFBox或者iText。
http://www.adobe.com/devnet/pdf/pdf_reference.html
在第3章的PDF参考中,这是他们对Unicode的描述:
Text strings are encoded in either PDFDocEncoding or Unicode character encoding. PDFDocEncoding is a superset of the ISO Latin 1 encoding and is documented in Appendix D. Unicode is described in the Unicode Standard by the Unicode Consortium (see the Bibliography). For text strings encoded in Unicode, the first two bytes must be 254 followed by 255. These two bytes represent the Unicode byte order marker, U+FEFF, indicating that the string is encoded in the UTF-16BE (big-endian) encoding scheme specified in the Unicode standard. (This mechanism precludes beginning a string using PDFDocEncoding with the two characters thorn ydieresis, which is unlikely to be a meaningful beginning of a word or phrase).