首页 > 解决方案 > 有没有办法确定 PDF 是“真正的”PDF 还是 PNG 的包装器

问题描述

我正在尝试将 Invoice2Data 库与 Python 一起使用。这个库可以使用 pdftotext 或 google vision。第一个选项更快并且是免费的(大偏好)。它使用 PDF 中的标签来查找相应的数据。但是,如果 pdf 只是 PNG 或 JPEG 的 Base64(或其他编码方案)的包装,它将永远找不到相应的标签。

有没有办法知道 PDF 是带有标签的“真实”pdf 还是只是一个包装器?

这是使用标签的 PDF 数据示例:

BT 328.788 499.616 Td /F1 9.0 Tf  [(Quantity)] TJ ET
0.925 0.925 0.925 rg
397.869 495.279 76.581 15.000 re f
0.800 0.800 0.800 rg
0.800 0.800 0.800 RG
397.869 494.529 m 475.199 494.529 l 474.449 495.279 l 397.869 495.279 l  f
0.733 0.733 0.733 rg
0.733 0.733 0.733 RG
475.199 510.279 m 475.199 494.529 l 474.449 495.279 l 474.449 510.279 l  f
0.000 0.000 0.000 rg
BT 406.119 499.616 Td /F1 9.0 Tf  [(Unit price \(€\))] TJ ET
0.925 0.925 0.925 rg
475.199 495.279 76.581 15.000 re f
0.800 0.800 0.800 rg
0.800 0.800 0.800 RG
475.199 494.529 m 552.530 494.529 l 551.780 495.279 l 475.199 495.279 l  f
0.733 0.733 0.733 rg
0.733 0.733 0.733 RG
552.530 510.279 m 552.530 494.529 l 551.780 495.279 l 551.780 510.279 l  f
0.000 0.000 0.000 rg
BT 483.449 499.616 Td /F1 9.0 Tf  [(Total \(€\))] TJ ET

如果它是一个包装器,这就是它的样子:

2030 206f 626a 0a3c 3c0a 2f46 696c 7465
7220 2f46 6c61 7465 4465 636f 6465 0a2f
4c65 6e67 7468 2031 3031 0a3e 3e0a 7374
7265 616d 0a78 9c01 5a00 a5ff f5f5 f5e7
e7e7 e2e2 e2bb bbbb 0000 00cd cdcd fcfc
fcff ffff ebeb ebdd dddd f8f8 f846 4646
7777 7757 5757 2424 2467 6767 8888 8834
3434 d3d3 d309 0909 9898 9815 1515 c7c7
c7ee eeee d8d8 d8a5 a5a5 c1c1 c1b3 b3b3
e9e9 e9f2 f2f2 92d5 3a33 0a65 6e64 7374
7265 616d 0a65 6e64 6f62 6a0a 3320 3020
6f62 6a0a 3c3c 0a2f 5479 7065 202f 584f
626a 6563 740a 2f53 7562 7479 7065 202f
496d 6167 650a 2f57 6964 7468 2031 3635
340a 2f48 6569 6768 7420 3233 3339 0a2f
4269 7473 5065 7243 6f6d 706f 6e65 6e74
2038 0a2f 436f 6c6f 7253 7061 6365 205b
2f49 6e64 6578 6564 202f 4465 7669 6365
5247 4220 3239 2034 2030 2052 5d0a 2f46
696c 7465 7220 2f46 6c61 7465 4465 636f
6465 0a2f 4c65 6e67 7468 2036 2030 2052
0a3e 3e0a 7374 7265 616d 0a78 9cec 9d87
a2e2 2a10 862d 98a8 e992 a831 fafe afb9
0c1d 12db d9e3 69fe dfde bb6b 1a2d 30c3

[编辑] 这是我使用的解决方案:

    cmd = ['pdffonts', path]
    proc = subprocess.Popen(
        cmd, stdout=subprocess.PIPE)
    out, err = proc.communicate()

    scanned = True

    for idx, line in enumerate(out.splitlines()):
        if idx == 2:
            scanned = False

标签: pythonpdfimage-processingmetadata

解决方案


就像一个快速的解决方法:为什么不使用 grep (pdfgrep) 来检查是否存在 BT、rg、Td 或类似的东西?

无论如何,我盯着它看,因为我在使用 Tabula 时遇到了同样的问题


推荐阅读