我正在使用pdfbox以标准的文档方式读取/替换PDF文本,即通过COSString(Tj和TJ运算符)。在对以下PDF文件进行测试之前,它似乎工作正常:
http://www.ocs.fas.harvard.edu/students/materials/resumes_and_cover_letters.pdf
直到第7页它才能正常工作但稍后读取数据的形式很奇怪。以下是几行输出:
S˛˚ R˚˘˚RESUMES AND COVER LETTERSPeter J. Lee : L Q W K U R S 0 D L O & H Q W H U ± & D P E U L G J H 0 D V V D F K X V H W W V ± S M O H H # I D V K D U Y D U G H G X
可能是什么原因?
谢谢, 乌斯曼
答案 0 :(得分:1)
使用标准文档方式读取/替换PDF文本,即通过COSString(Tj和TJ运算符)
遗憾的是,这种“记录方式”非常具有误导性,原因有两个:
它假设 Tj 和 TJ 的字符串参数以某种标准编码进行编码。实际上,编码由字体控制,可能是完全定制的。根据字体类型,编码甚至可以是多字节编码。
当你阅读它们时,它假定字母和整个单词的顺序相同,不间断。这也不是必须的。
PDF不是专为编辑内容而设计的格式。但是,它可以非常容易地完成,但在一般情况下,它很难实现,但实际上很难。
PS:示例文档中的奇怪输出是由于使用 Identity-H 编码使用复合字体而嵌入了TimesNewRoman的子集。
该字体确实包含 ToUnicode 映射;因此,可以将您阅读的内容翻译成字符数据。
替换该文本可能是个问题,因为只嵌入了一个子集;例如大写字母'I'和'J'是不嵌入,除非您使用不同的字体或甚至可能添加到部分字体,否则不能用于替换。这些操作都不像原始代码那么简单。
这不是最容易想象的场景,有时没有关于如何将字符串中的原始数据解释为文本的信息,PDF只知道如何绘制字形。