PDF Box - 在COSString中遇到奇怪的文本

3
我正在使用pdfbox通过COSString(Tj和TJ操作符)的标准文档方式读取/替换PDF文本。它似乎一直很好,直到被用于以下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  

这可能是什么原因呢?

谢谢, Usman

1个回答

1
使用标准文档方式(即通过COSString(Tj和TJ运算符))读取/替换PDF文本。这种“文档方式”有两个误导之处:
1. 它假定Tj和TJ的字符串参数以某种标准编码进行编码。实际上,编码受字体控制,可能是完全自定义的编码。根据字体类型,编码甚至可能是多字节编码。
2. 它假定字母和整个单词按您阅读它们的顺序不间断地出现。这也可能不是这种情况。
PDF并不是为编辑内容而设计的格式。尽管在简单设计的文件中可以很容易地完成,但通常情况下确实很困难。
PS:您样例文件的奇怪输出是由于使用了复合字体,使用Identity-H编码嵌入了TimesNewRoman的子集。该字体包含ToUnicode映射;因此,将所读内容转换为字符数据是可能的。
替换这段文字可能会成为一个问题,因为仅嵌入了子集; 例如,大写字母'I'和'J'未被嵌入,除非您使用不同的字体或可能甚至添加到部分字体,否则无法在替换中使用。 这两个操作都不像您的原始代码那样简单。
而且,这并不是最糟糕的情况,有时没有关于如何将字符串中的原始数据解释为文本的信息,PDF只知道如何绘制字形。

感谢您的详细解释。由于我不是PDF专家,这个答案为我澄清了很多事情。我明白PDF不适合编辑,但我仍然必须尽可能地编辑,因为这是我的任务的一部分。我还有一个问题要问您。对于涉及搜索/替换文本(使用Java平台)的任务,pdfbox是正确的选择,还是有更好的API可用?谢谢和问候, - Usman Naeem
Java有多个PDF API可用,但我不太了解非开源的API。在开源API中,PDFBox基本上还可以。特别是在编辑方面,一些非开源的API可能具有优势。如果字体在本地可用,一些API甚至会尝试添加额外所需的字形到部分嵌入字体中。无论使用哪个库,有些PDF文件只能通过付出合理的努力才能进行编程式编辑。 - mkl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接