Есть ли способ определить, является ли PDF "настоящим" PDF или оболочкой для PNG? - PullRequest
2 голосов
/ 03 июля 2019

Я пытаюсь использовать библиотеку Invoice2Data с Python. Эта библиотека может использовать pdftotext или google vision. Первый вариант намного быстрее и бесплатен (большое предпочтение). Он использует теги из PDF, чтобы найти соответствующие данные. Однако, если pdf является только оболочкой для Base64 (или другой схемы кодирования) PNG или JPEG, он никогда не найдет соответствующие теги.

Есть ли способ узнать, является ли 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] Вот решение Я использовал с:

    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

Ответы [ 2 ]

1 голос
/ 04 июля 2019

Раньше я никогда не слышал о «маскировке» изображений JPG или PNG в PDF-файлы (за все годы разработки PDF и изображений).Если вы говорите, что какой-то творческий человек добавил к файлу JPG, например, заголовок файла PDF, например, чтобы «заставить» читателей PDF думать, что файл является PDF, то это просто недопустимый PDF.

ЭтоЧестно говоря, это странное понятие, поскольку для этих распространенных графических форматов существует так много средств просмотра изображений, что им нужно притворяться PDF.(Существует прецедент для «свернутых» данных XFA в формате dyanamic, но это настоящий PDF-файл, который действителен, так как, по большей части, отправляет данные XFA в свою область.)

(Есливам нужно носить с собой файлы изображений в формате PDF, в этом случае вы можете прикрепить их как встроенные файлы.)

Часто самый простой способ проверить, действителен ли PDF-файл (например, не просто после заголовка PDF-файла)чтобы открыть его с помощью библиотеки PDF.Невозможность открыть сообщит вам, если это не настоящий PDF.Это будет минимальная проверка работоспособности, например, что-то может содержать бессмысленное содержание страницы.

Моя компания предлагает бесплатный инструмент для проверки файлов PDF, PDF Checker , который можно использовать для проверки PDFфайлы.

0 голосов
/ 03 июля 2019

Так же, как быстрый обходной путь: почему бы не использовать grep (pdfgrep) для проверки наличия BT, rg, Td или чего-то подобного?

В любом случае я смотрел его, так как у меня была та же проблема при использовании Tabula

...