LINUX.ORG.RU
ФорумAdmin

Создание скрипта в bash для массового переименования отсканированных документов(.pdf)

 , , ,


0

1

Доброго времени, форумчани!

В общем, подкинули задачку мне: автоматически переименовать отсканированные документы( сканы сохраняются в .pdf ) в соответствии с данными из самого скана. Потратив уйму времени на поиск решений аналогичных задач в интернете, понял, что не обойтись без написания скрипта. На вашем ресурсе наткнулся на пост товарища @isaecf с очень похожей задачкой, но применить на практике его решение задачи, с заменой его условий на свои, не получилось. Совсем нет опыта работы с кодированием и написанием скриптов(

Уповаю на местных удальцов и умельцев помочь справиться с этой задачкой.

Итак, что имеем:

  • папку со сканами *.pdf ( в папке лежат овер900 pdf-файлов. В каждом pdf есть по несколько страниц, на каждой странице - свой скан );
  • cygwin( необходимо решить задачку на windows 7 );

Задача:

  • переименовать все *.pdf в соответствии с данными, находящиеся на первой странице этого .pdf-а ( шаблон : номер документа@дата документа@тип документа( полное название )@номер штрих-кода( на сканированном документе имеется наклейка со штрих-кодом )@440( остаётся без изменений ).pdf ).

Буду очень благодарен за помощь!

переименовать отсканированные документы в соответствии с данными из самого скана.

Так там нет данных кроме картинки! А говорили, что дурных нема.

anonymous ()
Первая созданная тема: 09.11.20 19:41:35
anonymous ()

необходимо решить задачку на windows 7

повершелл вам поможет

З.Ы на винфак еще не посылали ?

anonymous ()
Ответ на: комментарий от TalkingMudcrab

Натрави тесеракт

Всё сломается, не успев запуститься. «В умелых руках, так сказать…»

anonymous ()

man rename посмотри

anonymous ()

В общем, подкинули задачку мне

Уповаю на местных удальцов и умельцев помочь справиться с этой задачкой.

Классика. Вам вот сюда: https://www.linux.org.ru/forum/job/

anonymous ()

Буду очень благодарен за помощь!

В каком размере предполагается благодарность?

mord0d ★★★★★ ()

Отсканированные документы не имеют текста в обычном понимании, это картинка. И эта картинка обычно ещё и спазиционорована рандомно, под любым углом. Чтобы перевести картинку в текст никакой bash не поможет, это что-то вроде файнридера нужно. Возможно ещё и развернуть картинку ровно перед этим придётся.

В общем, все части этой задачи сейчас решаются с помощью нейросетей, а не наколеночных скриптов в баше.

system-root ★★★★★ ()

Если данные в виде картинки, то без программы распознавания текста, как уже говорили, не обойтись. Но и она может неправильно распознать, поэтому полностью автоматизировать даже с нею не получится. Если же эти данные в текстовом виде, то см. команды sed и mv. Нативный это Linux или Cygwin — в данном случае неважно. Но в cygwin может работать значительно медленнее.

Общая схема скрипта может быть примерно такой (не для копипасты, а для дальнейших размышлений):

for i in *.pdf
  do
    mv $i $(sed 's/регулярное выражение для входных данных/выходное регулярное выражение/' "$i").pdf
  done
aureliano15 ★★ ()
Ответ на: комментарий от anonymous

повершелл вам поможет

Он только в 10 появился, а у ТС’а 7.

З.Ы на винфак еще не посылали ?

Куча анонимусов туда зачем-то послала, хотя cygwin c bash как раз про Linux.

aureliano15 ★★ ()
Ответ на: комментарий от anonymous

Так там нет данных кроме картинки!

Не факт. Может там уже всё распознано.

ТС, ты бы для примера один документ свой сюда скинул, а то без основы никто нормальный тебе ничего толком не посоветует.

Даже если там растр, то можно через tesseract попробовать распознать.

anonymous ()
Ответ на: комментарий от aureliano15

Он только в 10 появился, а у ТС’а 7.

да ладно, он и в 2003 виндах был. Виндусятники - на винфак

anonymous ()
Ответ на: комментарий от anonymous

Даже если там растр, то можно через tesseract попробовать распознать.

Помолимся, братья. Аминь!

anonymous ()
Ответ на: комментарий от anonymous

Даже если там растр, то можно через tesseract попробовать распознать.

Так может там и метаданные наличествуют? Так нахера переименовывать тогда?

anonymous ()
Ответ на: комментарий от anonymous

Он только в 10 появился, а у ТС’а 7.

да ладно, он и в 2003 виндах был.

Да, перепутал с Linux on Windows.

aureliano15 ★★ ()
Ответ на: комментарий от anonymous

Так нахера

Так вот и я не пойму, нахера оно надо. Кому вообще эти pdf-сканы упёрлись? И без них никто бы не умер. Да даже если бы и умер. В нынешних реалиях никто бы и не заметил. ТС’у или его командиру, видать, скучно стало, либо совестно за напрасно получаемую зарплату, вот и сочиняют себе занятия.

anonymous ()
Ответ на: комментарий от anonymous

Вот и я думаю, на кой ляд руководству это понадобилось. Да ко всему прочему взвалили на оперов задачку. Выжимают соки из нас, деньги экономят…

lebo031 ()
Ответ на: комментарий от lebo031

но если

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

anonymous ()

Для того чтобы сделать то, что ты хочешь, придётся нехило обмазаться OpenCV, машинным обучением/другими алгоритмами, заточенными под твой формат штрихкода и деньгами. Потому что ни эбби файнридер, ни тессеракты тебе не помогут с распознаванием твоего штрихкода никак. Проблема формирования названия на фоне этой основной проблемы соизмерима с набором этого сообщения в браузере, когда проблема распознавания соизмерима с написанием своего браузера с нуля, в котором можно будет запостить это сообщение.

peregrine ★★★★★ ()
Ответ на: комментарий от peregrine

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

Не умничай, понторез.

anonymous ()

номер штрих-кода( на сканированном документе имеется наклейка со штрих-кодом )

Миссия провалена

anonymous ()

Короче придётся всё делать ручками, это будет быстрее чем программно решать.

anonymous ()
Ответ на: комментарий от aureliano15

Он только в 10 появился, а у ТС’а 7.

Еще под ХП им пользовался, что-то там ставил. А в 7-ке из коробки, правда нужно обновить до 5-ой версии. Ну и PowerShell Core доступен.

anonymous ()
Ответ на: комментарий от lebo031

то вот

Кстати, твои PDF-ки состряпаны по методу FG+BG+Mask. Так что скрипты под это дело подлаживать будет совсем неудачной идеей. Чем PDF-ки стряпали? И почему сразу (ну коли такая продвинутая обработка) HOCR не вшили?

anonymous ()
Ответ на: комментарий от lebo031

В принципе, ребята тут верные замечания делают. Но если действительно есть прям крайняя необходимость попердолиться, то вот:

$ ls
pdf_rename.sh  пример.pdf

$ ./pdf_rename.sh пример.pdf

$ ls
'1_1002@29.12.08@АКТ № 1_1002 приемки законченного строительством объекта приемочной комиссией@0000000368@440.pdf'   pdf_rename.sh   пример.pdf

pdf_rename.sh:

#!/usr/bin/bash

# extract images from a PDF (poppler)
pdfimages -l 1 -png "$1" tmp_img

# image of interest
IMG=tmp_img-002.png

# segment the image (imagemagick)
echo '\
2491x750+0+0      barcode
600x350+570+1250  date
2491x1000+0+650   name' \
    | while read geom type; do 
        convert $IMG -crop $geom +repage -negate -blur 0x1 cropped_$type.png
    done

# recognize the segments (tesseract)
barcode=$(tesseract cropped_barcode.png stdout -l rus | egrep -o '[0-9]{10}')
docdate=$(tesseract cropped_date.png stdout -l rus | egrep -o '([0-9]{2}\.?){3}')
docname=$(tesseract cropped_name.png stdout -l rus | sed 's/^$//;T;q' | tr '\n' ' ' | sed 's#/#_#; s/  //')
docnumb=$(echo $docname | sed -r 's#.*([0-9]+_[0-9]+).*#\1#')

# rename
template="${docnumb}@${docdate}@${docname}@${barcode}@440"
#~ mv "$1" "$template".pdf
cp "$1" "$template".pdf

# clean up
rm  tmp_img*.png cropped_*.png

С вероятностью близкой к 100% этот скрипт не будет работать на других документах. Хоть сегментация тут и с большим запасом, но, как верно замечают, надёжнее будет использовать OpenCV. Что касается IMG=tmp_img-002.png, то и сама картинка может иметь другой индекс, разрешение, либо может вообще быть несколько картинок. Тут надо смотреть в целом на весь объём. Так сразу тебе никто не сделает.

Единственное интересное решение в моём скрипте — применить небольшой блёр к картинкам, без которого ни дата ни штрихкод не распознавались. А ещё tesseract плохо распознаёт инвертированные изображения.

Дальше уже сам, наверное.

С вас $15 :)

anonymous ()
Ответ на: комментарий от anonymous

А, я вот ещё что хотел сказать. На большинстве ФС есть ограничение на длину имени файла. Обычно это 255 байт или символов. Возможно, что некоторые из твоих документов не впишутся в этот лимит.

Вообще, конечно, сама идея писать мету в имя файла откровенно дикая. Сделали бы лучше БД под это, там и поиск удобный будет и поля какие хотите и сколько хотите, без ограничений, да хоть полный текст документа вместе с картинками туда пихайте.

Начальнику привет, кста.

anonymous ()
Ответ на: комментарий от anonymous

Пока шляпа что выше работать будет только с одним документом, я не уверен что все они одинаковые у ТС-а, как и нет оценки точности распознавания текста. Анон гонит и не краснеет.

peregrine ★★★★★ ()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от peregrine

Анон гонит и не краснеет.

Кто бы говорил. Понтарезишь и понтарезишь. Знаешь такое: «Молоко козла»? Походу про тебя.

anonymous ()
Ответ на: комментарий от peregrine

Бесконечно можно смотреть на три вещи: огонь, воду и как подгорает у пустомели-пятизвёздочника.

anonymous ()
Ответ на: комментарий от anonymous

Еще под ХП им пользовался, что-то там ставил. А в 7-ке из коробки, правда нужно обновить до 5-ой версии. Ну и PowerShell Core доступен.

Да. Я перепутал с wsl (linux on windows), как уже написал.

aureliano15 ★★ ()
Ответ на: комментарий от lebo031

как с вами связаться?

Товарищ ТС, ты лучший в этом топе! Такое только ты мог отмочить! «Как связаться с аноном???»

anonymous ()

Имаджмаджиком вырезаешь из картинок те куски на которых написано то что тебе нужно положить в название. Полученные картинки скармливаешь OCR. Полученный текст вписываешь в название файла. Емнип тот же тессеракт умеет определять что текст перевернут.

Если подобного описания не достаточно то наверное тебе лучше в раздел job.

ya-betmen ★★★★★ ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.