为了跟进我的评论,这是相当典型的原始 PDF 文本输出的样子——PDF 参考指南 16-v4 第 1213 页的缩水部分:
36451 0 obj % Contents
% used filter: FlateDecode
/GS2 gs
BT
/F1 1 Tf
8 0 0 8 297.417 105.667 Tm
0 0 0 1 k
0 Tc
0 Tw
(1213) Tj
/F5 1 Tf
24 0 0 24 253.784 617 Tm
[ (C) 19.1 (olophon) ] TJ
/F3 1 Tf
10.505 0 0 10.505 136.5 566 Tm
-0.0014 Tc
0.2018 Tw
[ (This do) -10.1 (c) -7.2 (u) -0.3 (men) 17.6 (t) -1.4 ( was p) 10 (r) 11.9 (o) -10.1 (d) 10.8 (uce) -7.2 (d) -1.3 ( usin) 6.6 (g ) 36.5 (A) 24.6 (d) 0.9 (o) 3.8 (b) -10.1 (e) ] TJ
8.4 0 0 8.4 326.25 570.2 Tm
0 Tc
..这样的几百行省略了。一些兴趣点:Tf
设置文本字体(在别处定义,并且可能具有自定义编码——并不总是 ASCII)。Tj
“显示”文本;Tm
以“当前单位”设置变换矩阵。在不知道两者的实际大小的情况下,不可能立即看到文本“Colophon”是否紧跟在“1213”之后。Tc
and设置默认字符和单词间距,Tw
并且经常被滥用来插入“空格”。不过,不在这里;该TJ
数组指定具有散布字距调整值的文本片段(我猜,基于它们的位置)。
无法确定此单个文本行是单独的一行,还是较长段落的一部分。甚至无法确定它是否是合理的字符串——您需要将其左右边缘与其他行进行比较才能确定。
(此输出是使用我自己从头开始编写的 PDF 阅读器创建的,使用上述参考,仅此而已。)
如您所见,仅查找文本是一项挑战,尽管有些库在这方面或多或少是成功的。他们都没有——如果我是正确的——吹嘘能够编辑“任何 PDF”。