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

时间:2014-02-21 02:46:55

标签: java pdfbox

我正在使用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  

可能是什么原因?

谢谢, 乌斯曼

1 个答案:

答案 0 :(得分:1)

  

使用标准文档方式读取/替换PDF文本,即通过COSString(Tj和TJ运算符)

遗憾的是,这种“记录方式”非常具有误导性,原因有两个:

  1. 它假设 Tj TJ 的字符串参数以某种标准编码进行编码。实际上,编码由字体控制,可能是完全定制的。根据字体类型,编码甚至可以是多字节编码。

  2. 当你阅读它们时,它假定字母和整个单词的顺序相同,不间断。这也不是必须的。

  3. PDF不是专为编辑内容而设计的格式。但是,它可以非常容易地完成,但在一般情况下,它很难实现,但实际上很难。

    PS:示例文档中的奇怪输出是由于使用 Identity-H 编码使用复合字体而嵌入了TimesNewRoman的子集

    该字体确实包含 ToUnicode 映射;因此,可以将您阅读的内容翻译成字符数据。

    替换该文本可能是个问题,因为只嵌入了一个子集;例如大写字母'I'和'J'是嵌入,除非您使用不同的字体或甚至可能添加到部分字体,否则不能用于替换。这些操作都不像原始代码那么简单。

    这不是最容易想象的场景,有时没有关于如何将字符串中的原始数据解释为文本的信息,PDF只知道如何绘制字形。