我在ubuntu上。
我有一个 pdf 文件,页面分为网格。网格的每个块都包含候选人的姓名/年龄/出生日期/照片。有些记录有水印“不合格”
我需要刮掉他的 pdf,将不合格的候选人列在一个单独的列表中。使用 pyPdf 我能够获得个人记录,但它也包括带水印的候选者。
如何检测水印?如果我可以得到水印的坐标,我如何将它与候选人匹配?
我对 python pyPdf 以外的解决方案持开放态度
(实际上这不是一个答案,而只是一个分析以供评论。)
我自己不知道 pyPdf(或任何 python PDF 类),但这是为示例条目创建水印的方式;基于此,任何足够了解 pyPDF 的人都可以更轻松地提出建议。
综述
根据 pyPDF(或其他 python PDF 类)如何允许访问页面内容,有两种主要的基本方法:
如果该类按其在页面内容流中的顺序返回有关内容(文本和图像)的信息:水印图像 xobject 在条目数据之前被引用。因此,在绘制 xobject 图像之前的任何条目都会被标记。
如果否则信息没有按照页面内容流指示的顺序给出,则必须使用坐标比较,这本身是非常直接的。在这种情况下,可能会感兴趣的是图像插入时使用 [0.1 0 0 0.1 0 0] 变换矩阵,而文本是使用单位变换矩阵绘制的。
细节
这是条目#200;另一个带水印的条目的构造类似:
水印是通过图像 xobject 完成的。两个水印条目使用的页面只定义了一个图像 xobject:
4 0 obj
<</Type/Page/MediaBox [0 0 595 841]
/Rotate 0/Parent 3 0 R
/Resources<</ProcSet[/PDF /ImageC /ImageI /Text]
/ColorSpace 18 0 R
/ExtGState 19 0 R
/XObject 20 0 R
/Font 21 0 R
>>
/Contents 5 0 R
>>
endobj
20 0 obj
<</R17
17 0 R>>
endobj
17 0 obj
<</Subtype/Image
/ColorSpace 16 0 R
/Width 128
/Height 88
/BitsPerComponent 8
/Filter/FlateDecode/Length 463>>stream
[...]
endstream
endobj
在内容流中,这个 xobject /R17在条目本身的数据被绘制之前插入:
q 0.1 0 0 0.1 0 0 cm
[...]
q 1045 0 0 495 462.5 6510.5 cm
/R17 Do
Q
q
10 0 0 10 0 0 cm BT
0.000487366 Tc
/R10 8 Tf
1 0 0 1 86 650.75 Tm
(Sex : Male)Tj
0.000304794 Tc
-64 0 Td
(Age : 43)Tj
-0.000140686 Tc
-1 11.05 Td
(House No :)Tj
-0.00002085 Tc
1 31.95 Td
(Name :)Tj
0.00008575 Tc
/R12 7.15 Tf
25.5 17.8 Td
( 200 )Tj
ET
Q
1547.5 6475 485 535.5 re
S
q
10 0 0 10 0 0 cm BT
-0.000403137 Tc
/R14 8 Tf
1 0 0 1 145.1 708.5 Tm
(XVX0001081)Tj
0.000421651 Tc
/R14 7.05 Tf
-90.35 -14.95 Td
(Ramesh Kumar)Tj
0.000373332 Tc
/R10 7.05 Tf
-33 -12.75 Td
(Father's )Tj
0.000193787 Tc
7.3 TL
(Name)'
0.00037774 Tc
/R14 7.05 Tf
40.25 1.8 Td
(Ram Singh)Tj
0 Tc
2.5 -11.85 Td
(37)Tj
0.00137196 Tc
/R12 7.15 Tf
-5.25 13.35 Td
(:)Tj