У меня есть тысячи документов, и некоторые из них отсканированы. Поэтому мне нужен скрипт для проверки всех файлов PDF, которые принадлежат каталогу. Есть ли простой способ сделать это?
- Большинство PDF-файлов являются отчетами. Таким образом, у них много текста.
Они очень разные, но отсканированные, как упомянуто ниже, могут найти некоторый текст из-за нестабильного процесса OCR, связанного со сканированием.
Предложение из-за Судодуса в комментариях ниже, кажется очень интересным. Посмотрите на разницу между отсканированным и не отсканированным PDF:
Отсканированные:
grep --color -a 'Image' AR-G1002.pdf
<</BitsPerComponent 8/ColorSpace/DeviceRGB/Filter[/DCTDecode]/Height 2197/Length 340615/Name/Obj13/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 40452/Name/Obj18/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 41680/Name/Obj23/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 41432/Name/Obj28/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 59084/Name/Obj33/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 8/ColorSpace/DeviceRGB/Filter[/DCTDecode]/Height 2197/Length 472681/Name/Obj38/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 8/ColorSpace/DeviceRGB/Filter[/DCTDecode]/Height 2197/Length 469340/Name/Obj43/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 8/ColorSpace/DeviceRGB/Filter[/DCTDecode]/Height 2197/Length 371863/Name/Obj48/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 8/ColorSpace/DeviceRGB/Filter[/DCTDecode]/Height 2197/Length 344092/Name/Obj53/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 59416/Name/Obj58/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 48308/Name/Obj63/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 51564/Name/Obj68/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 63184/Name/Obj73/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 40824/Name/Obj78/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 23320/Name/Obj83/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 31504/Name/Obj93/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 18996/Name/Obj98/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 8/ColorSpace/DeviceRGB/Filter[/DCTDecode]/Height 2197/Length 292932/Name/Obj103/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 27720/Name/Obj108/Subtype/Image/Type/XObject/Width 1698>>stream
<rdf:li xml:lang="x-default">Image</rdf:li>
<rdf:li xml:lang="x-default">Image</rdf:li>
Не отсканировано:
grep --color -a 'Image' AR-G1003.pdf
<</Lang(en-US)/MarkInfo<</Marked true>>/Metadata 167 0 R/Pages 2 0 R/StructTreeR<</Contents 4 0 R/Group<</CS/DeviceRGB/S/Transparency/Type/Group>>/MediaBox[0 0 612 792]/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 7 0 R/F3 9 0 R/F4 11 0 R/F5 13 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>/StructParents 0/Tabs/S/Type/<</Filter/FlateDecode/Length 5463>>stream
<</BaseFont/Times#20New#20Roman,Bold/Encoding/WinAnsiEncoding/FirstChar 32/FontD<</Ascent 891/AvgWidth 427/CapHeight 677/Descent -216/Flags 32/FontBBox[-558 -216 2000 677]/FontName/Times#20New#20Roman,Bold/FontWeight 700/ItalicAngle 0/Leadi<</BaseFont/Times#20New#20Roman/Encoding/WinAnsiEncoding/FirstChar 32/FontDescri<</Ascent 891/AvgWidth 401/CapHeight 693/Descent -216/Flags 32/FontBBox[-568 -216 2000 693]/FontName/Times#20New#20Roman/FontWeight 400/ItalicAngle 0/Leading 42<</BaseFont/Arial,Bold/Encoding/WinAnsiEncoding/FirstChar 32/FontDescriptor 10 0<</Ascent 905/AvgWidth 479/CapHeight 728/Descent -210/Flags 32/FontBBox[-628 -210 2000 728]/FontName/Arial,Bold/FontWeight 700/ItalicAngle 0/Leading 33/MaxWidth<</BaseFont/Times#20New#20Roman,Italic/Encoding/WinAnsiEncoding/FirstChar 32/FontDescriptor 12 0 R/LastChar 118/Name/F4/Subtype/TrueType/Type/Font/Widths 164 0 <</Ascent 891/AvgWidth 402/CapHeight 694/Descent -216/Flags 32/FontBBox[-498 -216 1333 694]/FontName/Times#20New#20Roman,Italic/FontWeight 400/ItalicAngle -16.4<</BaseFont/Arial/Encoding/WinAnsiEncoding/FirstChar 32/FontDescriptor 14 0 R/La<</Ascent 905/AvgWidth 441/CapHeight 728/Descent -210/Flags 32/FontBBox[-665 -210 2000 728]/FontName/Arial/FontWeight 400/ItalicAngle 0/Leading 33/MaxWidth 2665<</Contents 16 0 R/Group<</CS/DeviceRGB/S/Transparency/Type/Group>>/MediaBox[0 0 612 792]/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 7 0 R/F5 13 0 R>>/ProcSet[<</Filter/FlateDecode/Length 7534>>streamarents 1/Tabs/S/Type/Page>>
<</Contents 18 0 R/Group<</CS/DeviceRGB/S/Transparency/Type/Group>>/MediaBox[0 0 612 792]/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 7 0 R/F5 13 0 R>>/ProcSet[<</Filter/FlateDecode/Length 6137>>streamarents 2/Tabs/S/Type/Page>>
<</Contents 20 0 R/Group<</CS/DeviceRGB/S/Transparency/Type/Group>>/MediaBox[0 0 612 792]/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 7 0 R/F5 13 0 R/F6 21 0 R><</Filter/FlateDecode/Length 6533>>stream>>/StructParents 3/Tabs/S/Type/Page>>
<</BaseFont/Times#20New#20Roman/DescendantFonts 22 0 R/Encoding/Identity-H/Subty<</BaseFont/Times#20New#20Roman/CIDSystemInfo 24 0 R/CIDToGIDMap/Identity/DW 100<</Ascent 891/AvgWidth 401/CapHeight 693/Descent -216/Flags 32/FontBBox[-568 -216 2000 693]/FontFile2 160 0 R/FontName/Times#20New#20Roman/FontWeight 400/Italic<</Contents 27 0 R/Group<</CS/DeviceRGB/S/Transparency/Type/Group>>/MediaBox[0 0 612 792]/Parent 2 0 R/Resources<</ExtGState<</GS28 28 0 R/GS29 29 0 R>>/Font<</F1 5 0 R/F2 7 0 R/F3 9 0 R/F5 13 0 R/F6 21 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC<</Filter/FlateDecode/Length 5369>>streamge>>
Количество изображений на странице намного больше (около одного на страницу)!
command-line
pdf
DanielTheRocketMan
источник
источник
pdf
файл содержит изображение (вставленное в документ вместе с текстом или целыми страницами, «отсканированный pdf»), файл часто (возможно, всегда) содержит строку/Image/
, которую можно найти с помощью командной строкиgrep --color -a 'Image' filename.pdf
. Это позволит отделить файлы, содержащие только текст, от изображений, содержащих изображения (полностраничные изображения, а также текстовые страницы с небольшими логотипами и иллюстрирующими изображениями среднего размера).Ответы:
Shellscript
Если
pdf
файл содержит изображение (вставленное в документ рядом с текстом или целыми страницами, «отсканированный pdf»), файл часто (возможно, всегда) содержит строку/Image/
.Таким же образом вы можете искать строку,
/Text
чтобы узнать, содержит ли файл PDF текст (не отсканированный).Я сделал шеллскрипт
pdf-text-or-image
, и он может работать в большинстве случаев с вашими файлами. Shellscript ищет текстовые строки/Image/
и/Text
вpdf
файлах.Сделать исполняемый скрипт,
Перейдите в каталог, где у вас есть
pdf
файлы и запустите скрипт.Идентифицированные файлы перемещаются в следующие подкаталоги
scanned
text
s-and-t
(для документов с [отсканированными?] изображениями и текстовым содержимым)Неопознанные файловые объекты, «НЛО», остаются в текущем каталоге.
Тестовое задание
Я протестировал шеллскрипт с двумя вашими файлами,
AR-G1002.pdf
иAR-G1003.pdf
, и с некоторыми собственнымиpdf
файлами (которые я создал с помощью Libre Office Impress).Будем надеяться, что
источник
grep -q
grep -q
сразу выходит с нулевым статусом, если найдено какое-либо совпадение (вместо поиска по всем файлам).cd <path to dir>
Все отсканированные в формате PDF файлы останутся в папке, а другие файлы будут перемещены в другую папку.
источник
file pdf-filename.pdf
выдаст номер версии. Мне не удалось найти конкретный текст в BR-L1411-3.pdf BR-L1411-3.pdf: документ PDF, версия 1.3, но я смог найти текст в обоих других предоставленных вами файлах, которые являются версией 1.5 и 1.6 и получите один или несколько совпадений. Я использовал PDF XChange Viewer для поиска этих файлов, но у меня были похожие результаты с evince. документ версии 1.3 ничего не соответствовал.file
полезные результаты при завершении вашего проекта. Хотя, как мне кажется, другие до сих пор не знают, чего именно вы пытаетесь достичь.Я создал скрипт, чтобы определить, был ли PDF OCRd. Основная идея: в OCRd PDFs текст невидим.
Алгоритм проверки, был ли данный PDF (
f1
) OCRd:f1
отмеченную какf2
f2
f1
иf2
f1
был OCRd, если все изображенияf1
иf2
идентичны.https://github.com/jfilter/pdf-scripts/blob/master/is_ocrd_pdf.sh
источник
Любитель предлагает хорошее решение, если в отсканированных документах коллекции документов нет текста с оптическим распознаванием символов (OCR). Если это возможно, вы можете захотеть
pdfinfo -meta
создать сценарий, который считывает выходные данные и проверяет инструмент, использованный для создания файла, или использовать процедуру Python, которая использует одну из библиотек Python для их проверки. Поиск текста с помощью подобного инструментаstrings
будет ненадежным, поскольку содержимое PDF можно сжать. Кроме того, проверка инструмента создания также небезопасна, поскольку страницы PDF можно комбинировать; Я регулярно комбинирую текстовые документы в формате PDF с отсканированными изображениями, чтобы все было вместе.Мне жаль, что я не могу предложить конкретные предложения. Прошло много времени с тех пор, как я изучил внутреннюю структуру PDF, но в зависимости от того, насколько жесткими являются ваши требования, вы можете захотеть узнать, что это довольно сложно. Удачи!
источник
Если это больше касается фактического обнаружения, если PDF был создан путем сканирования, а не в pdf есть изображения вместо текста, то вам, возможно, придется копаться в метаданных файла, а не только в содержимом.
В целом, для файлов, которые я мог найти на своем компьютере, и для ваших тестовых файлов, верно следующее:
Сейчас я использую Windows, поэтому я использовал
node.js
следующий пример:Чтобы запустить его, вам нужно установить Node.js (это должна быть одна команда), а также вызвать:
Применение:
Этот пример не считается законченным решением, но с
debug
флагом вы получите некоторое представление о метаинформации файла:Наивная функция, которую я написал, имеет 100% успех на документах, которые я могу найти на своем компьютере (включая ваши образцы). Я назвал файлы в зависимости от их состояния до запуска программы, чтобы можно было увидеть, верны ли результаты.
Вы можете использовать режим отладки вместе с небольшим количеством программирования, чтобы значительно улучшить ваши результаты. Вы можете передать выходные данные программы другим программам, в каждой строке всегда будет один полный путь.
источник
2 способа, которыми я могу придумать:
Использование инструмента выбора текста: если вы используете отсканированный PDF, тексты не могут быть выделены, скорее появится окно. Вы можете использовать этот факт для создания сценария. Я знаю, что в C ++ QT есть способ, хотя я не уверен в Linux.
Поиск слова в файле: в не отсканированном PDF ваш поиск будет работать, но не в отсканированном файле. Вам просто нужно найти слова, общие для всех PDF-файлов, или я бы сказал, искать букву «е» во всех PDF-файлах. Он имеет наибольшее распределение частот, поэтому, скорее всего, вы найдете его во всех документах, в которых есть текст (если только он не гадсби )
например
Используйте любой из инструментов обработки текста
источник