当前位置:  开发笔记 > 前端 > 正文

PDF格式的Unicode

如何解决《PDF格式的Unicode》经验,为你挑选了4个好方法。

我的程序根据要求生成相对简单的PDF文档,但是我遇到了unicode字符的麻烦,比如汉字或奇数数学符号.要在PDF中编写普通字符串,请将其放在括号中:

(something)

还可以选择使用八进制代码转义字符:

(\527)

但这最多只能达到512个字符.你如何编码或逃避更高的字符?我已经看到了对字节流和十六进制编码字符串的引用,但我读过的所有引用似乎都不愿意告诉我如何实际执行它.


编辑:或者,指向一个好的Java PDF库,它将为我完成这项工作.我正在使用的是gnujpdf的一个版本(我修复了几个错误,因为原作者似乎已经破解了),这允许你针对AWT图形界面进行编程,理想情况下,任何替换应该做相同.

替代方案似乎是HTML - > PDF,或基于段落和方框的编程模型,感觉非常像HTML.iText是后者的一个例子.这意味着重写我现有的代码,我不相信他们会给我相同的灵活性.


编辑2:我之前没有意识到,但iText库有一个Graphics2D API,似乎完美地处理unicode,所以这就是我将要使用的.虽然它不是问题的答案,但它解决了我的问题.


编辑3: iText对我很有用.我想这一教训是,当面对一些看起来毫无意义的困难时,找一个比你更了解它的人.



1> plinth..:

在第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,这不太可能是单词或短语的有意义的开头).


我知道这听起来好得令人难以置信."文本字符串"用于文档元数据(注释,书签名称),**不用于渲染文本!
@jdmichal这不会自动运行.如果字体支持,则字符串的编码只能是UTF-16BE(实际上,它必须是具有ToUnicode值和其他几个元素的CID字体).

2> 小智..:

简单的答案是没有简单的答案.如果你看一下PDF规范,你会看到整个章节 - 而且很长一段时间 - 致力于文本显示的机制.我为我的公司实施了所有PDF支持,处理文本是迄今为止最复杂的练习部分.您发现的解决方案 - 使用第三方库为您完成工作 - 确实是最佳选择,除非您对PDF文件有非常具体的特殊用途要求.



3> dredkin..:

阿尔戈曼的答案很多都是错误的.你可以制作一个带有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或从中复制文本.



4> 小智..:

正如dredkin所指出的,您必须在页面内容流中使用字形索引而不是Unicode字符值。这足以在PDF中显示Unicode文本,但是Unicode文本将不可搜索。要使文本可搜索或具有复制/粘贴功能,还需要包含/ ToUnicode流。此流应将文档中的每个字形转换为实际的Unicode字符。

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有