我正在尝试将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
[EDIT]这是我使用的solution:
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
答案 0 :(得分:1)
我以前从未听说过JPG或PNG图像伪装成PDF文件的情况(在我从事PDF和图像开发的所有岁月中)。如果您说某位富有创造力的人在JPG文件之前添加了PDF文件标题,例如“欺骗” PDF阅读器,以为该文件是PDF,那么那根本不是有效的PDF。
说实话,这是一个奇怪的概念,因为对于如此常见的图像格式,有如此多的图像查看器需要伪装成PDF。 (动态XFA数据被“包装”在PDF中是有先例的,但这是一个真正的PDF,在很大程度上可以将XFA数据委派到其自己的区域内。)
(如果您需要随身携带PDF格式的图像文件,则可以将其作为嵌入式文件附加。)
通常最简单的验证PDF是否有效的方法(例如,不仅仅是在PDF文件头后面的鼻子)是使用PDF库打开它。打开失败会告诉您它是否不是真正的PDF。那将是一个最小的健全性检查,例如某些内容仍可能包含无用的Page内容。
我公司提供了一个免费的工具来验证PDF文件PDF Checker,该工具可用于验证PDF文件。
答案 1 :(得分:0)
只是一个快速的解决方法: 为什么不使用grep(pdfgrep)检查BT,rg,Td是否存在 或类似的东西?
无论如何我都盯着它,因为我遇到了同样的问题 使用Tabula时