Как превратить фотографии бумажных документов в отсканированный документ? связано, но не то же самое, что я говорю о файлах pdf. Обработка изображений кажется сложной в ответах под связанным вопросом, особенно потому, что она включает обработку каждого изображения отдельно: учитывая, что мой pdf имеет сотни страниц, решение, которое я ожидаю, заключается не в обработке/редактировании изображений, а просто в сканировании цифровых фотографий и документов, как настоящих. Я имею в виду что-то вроде "виртуального сканера", для которого входным файлом будет pdf или коллекция фотографий на основе фотографий, а выходным - "обычный" отсканированный документ. (Также рекомендуется Scantailor - также здесь - кажется, сейчас нет версии для Linux.)
Это не про OCR и не про преобразование изображения в текст.
Чтобы пояснить, что я имею в виду, приведу несколько примеров.
Существуют pdf-файлы, основанные на тексте, а не на изображении, и это текстовые файлы (допустим, docx или odt), экспортированные в pdf. Они выглядят готовыми к печати:
Вышеизложенное не является тем, что я здесь обсуждаю.
Меня интересуют pdf-файлы на изображениях ниже, а именно разница между отсканированными текстовыми страницами, которые слишком похожи на изображения, и отсканированными текстовыми страницами, которые выглядят как оцифрованный текст.
Первые сформированы из изображений, которые выглядят как фотографии, сделанные со страниц книг:
или
Такие копии вряд ли можно перепечатать на бумагу, так как фон тоже будет напечатан.
Вторые - то, что можно ожидать от отсканированного текста, и их можно распечатать:
или
Картинкоподобный pdf может быть уже обработан OCR, а его текст доступен для поиска, и все равно выглядеть как коллекция (постраничных) фотографий: OCR здесь не проблема.
Что мне нужно, так это четкий черно-белый вид "отсканированного" pdf и удаление всех "реальных" деталей (особенно теней), которые нормальны на фотографии, но должны отсутствовать на печатной странице.
Как заметил @vanadium в комментарии, я ищу программное решение, которое автоматически очищает фотографии документа, подобно Google Scan на смартфоне.
Как сказал @user535733 в комментарии, проблема здесь, по крайней мере в некоторой степени, заключается в преобразовании полутонового (отсканированного/изображенного) текста в черно-белый.
scantailor
больше не поддерживается, но вы все равно можете собрать его из исходного кода и использовать.
Однако исходный репозиторий требует qt4
, который нелегко установить в последних версиях Ubuntu. Вы можете использовать, например, это форк , адаптированный к qt5
.
Предварительные требования:
sudo apt install libjpeg-dev zlib1g-dev libpng-dev libtiff-dev libboost-dev libxrender-dev libboost-all-dev
Установка:
git clone https://github.com/victl/scantailor
cd scantailor
cmake .
make
sudo make install
Заявление об ограничении ответственности: я не знаю разработчика этого форка и ничего не могу сказать о безопасности его версии.
Другой вариант - использовать Scantailor advanced . Вы можете установить его через snap
...
sudo snap install scantailor-advanced
... или flatpak .
... или через ppa .
sudo add-apt-repository ppa:alex-p/scantailor
sudo apt update
sudo apt install scantailor # or scantailor-advanced
Быстрая проверка:
Использование ocrmypdf
для восстановления OCR (как указано в конце дополнительной части этого ответа) Я заметил, что ocrmypdf -h
показывает параметр, который звучит в точности как запрашиваемый:
- remove-background Попытка удалить фон с серых или цветных страниц, установив его на белый
в исходном PDF-файле уже есть OCR, что дает ошибку, если не используется один из следующих параметров:
-f, --force-ocr Растеризовать любой текст или векторные объекты на каждой странице, применить OCR и сохранить растрированный вывод (это перезаписывает PDF-файл)
или
-s, --skip-text Пропускать распознавание текста на любых страницах, которые уже содержат текст, но включать страницу в окончательный вывод; полезно для PDF-файлов, которые содержат сочетание изображений, текстовых страниц и / или страниц с ранее распознанным распознаванием текста
. Применение каждого из них по отдельности к одному из моих больших файлов с сотнями страниц, на которых уже было выполнено распознавание текста, привело к сбою процесса.
Лучшим решением мне кажется сначала распечатать в pdf исходный файл (который удаляет OCR), а затем выполнить
ocrmypdf input.pdf output.pdf -l <LANG> --remove-background -v
Для английского языка -l
вариант не нужен. -v
- для подробной информации в терминале.
Полученный PDF-файл больше входного (из-за параметра - remove-background
): уменьшите размер, как указано ниже.
Даже его значок иллюстрирует тот факт, что он предназначен именно для того, о чем здесь спрашивают:
Вот как использовать Scan Tailor с PDF-файлами:
pdftoppm MY_PDF.pdf NAME -tiff
- как сказано здесь . - Вместо tiff
(что дает tif
файлов) можно использовать другие переменные, например png
или jpeg
. См. Здесь набор действий сервисного меню Dolphin для различных опций извлечения: [Desktop Entry]
Type=Service
ServiceTypes=KonqPopupMenu/Plugin
MimeType=application/pdf;
Actions=pdf;tif;jpeg;
X-KDE-Submenu=PDF action: EXTRACT ALL pages
Icon=application-pdf
[Desktop Action pdf]
Name=Extract pages as pdf
Icon=application-pdf
Exec=bash -c 'pdf=$(pdftk "%u" burst); kdialog --title "Extract pages" --msgbox "Extracted! $pdf";';
[Desktop Action tif]
Name=Extract pages as tif
Icon=application-pdf
Exec=bash -c 'f="%u"; pdf=$(pdftoppm "$f" "${f%%.*}" -tiff); kdialog --title "Extract pages" --msgbox "Extracted! $pdf";';
[Desktop Action jpeg]
Name=Extract pages as jpeg
Icon=application-pdf
Exec=bash -c 'f="%u"; pdf=$(pdftoppm "$f" "${f%%.*}" -jpeg); kdialog --title "Extract pages" --msgbox "Extracted! $pdf";';
tif
соответствуют вашим требованиям.) Есть много способов создать новый PDF-файл. Опять же, инструменты с графическим интерфейсом, которые я пробовал, очень скоро дали сбой или дали странные результаты, поэтому я предпочитаю помещать полученные файлы tif
в отдельную папку и запускать там команду img2pdf * .tif -o out.pdf
- как сказано здесь . (Для этого может потребоваться правильное именование / нумерация файлов. Подробнее здесь .) Полученный "адаптированный" PDF-файл будет меньше исходного, но процент уменьшения размера зависит от на факторы, которые я игнорирую (но я полагаю, что страницы, содержащиеся в исходном PDF-файле, должны быть извлечены - на шаге 1 - в том формате, который у них уже есть; я думаю, что jpeg
и tif
должны использоваться вместо png
; используйте pdfimages -list your.pdf
в терминале, чтобы просмотреть подробные сведения о формате, точках на дюйм и другие сведения перед обработкой с помощью команд выше и ниже).
Окончательный PDF-файл можно уменьшить с помощью команды типа:
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook \
-dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf
Подробнее об этом здесь .
Вот набор действий сервисного меню Dolphin, основанный на приведенной выше ссылке:
[Desktop Entry]
Type=Service
ServiceTypes=KonqPopupMenu/Plugin
MimeType=application/pdf;
Actions=shrink;shrink0;shrink1;shrink2;
X-KDE-Submenu=PDF action: SHRINK
Icon=application-pdf
[Desktop Action shrink]
Name=Shrink pdf to "printer" size, 300dpi
Icon=application-pdf
Exec=bash -c 'f="%u"; pdf=$(gs -dQUIET -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -dPDFSETTINGS=/printer -sOutputFile="${f%.pdf}_printer.pdf" "$f"); kdialog --title "Shrink" --msgbox "Done! $pdf";';
[Desktop Action shrink0]
Name=Shrink pdf to "prepress" size, 300dpi
Icon=application-pdf
Exec=bash -c 'f="%u"; pdf=$(gs -dQUIET -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile="${f%.pdf}_prepress.pdf" "$f"); kdialog --title "Shrink" --msgbox "Done! $pdf";';
[Desktop Action shrink1]
Name=Shrink pdf to "ebook size, 150dpi
Icon=application-pdf
Exec=bash -c 'f="%u"; pdf=$(gs -dQUIET -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -dPDFSETTINGS=/ebook -sOutputFile="${f%.pdf}_small.pdf" "$f"); kdialog --title "Shrink" --msgbox "Done! $pdf";';
[Desktop Action shrink2]
Name=Shrink pdf to "screen" size, 72dpi
Icon=application-pdf
Exec=bash -c 'f="%u"; pdf=$(gs -dQUIET -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -dPDFSETTINGS=/screen -sOutputFile="${f%.pdf}_smaller.pdf" "$f"); kdialog --title "Shrink" --msgbox "Done! $pdf";';
Я получил некоторую помощь от этого ответа.
OCR (возможность текстового поиска и копирования) теряется во время описанной выше процедуры, если он присутствует в исходном PDF-файле. Чтобы получить OCR, используйте
ocrmypdf input.pdf output.pdf
для английского языка , как сказано здесь . Для других языков найдите их с помощью apt-cache search tesseract-ocr
и установите их.Добавьте -l
в конце команды для определенных языков; подробнее здесь ; см. их имена также здесь .
Вот действие сервисного меню Dolphin для румынского OCR с двумя вариантами (один с прогрессом в терминале и фиксированным именем вывода, другой с фоновым процессом, но с именем вывода, основанным на вводе; я хотел бы, чтобы оба процесса были в терминале и имя вывода основано на вводе, но не знаю как;если кто-то может это сделать, напишите здесь!). Для английского языка замените «Romanian» и удалите переменную -l ron
:
[Desktop Entry]
Type=Service
ServiceTypes=KonqPopupMenu/Plugin
MimeType=application/pdf;
Actions=ocr1;ocr2;
X-KDE-Submenu=PDF action: apply OCR
Icon=application-pdf
[Desktop Action ocr1]
Name=Apply OCR Romanian (see progress in terminal; output name: ocr_ro.pdf!)
Icon=application-pdf
Exec=konsole --noclose -e ocrmypdf "%u" ocr_ro.pdf -l ron
[Desktop Action ocr2]
Name=Apply OCR Romanian (backgroud process: NO terminal! input>output name)
Icon=application-pdf
Exec=bash -c 'f="%u"; ocrmypdf "$f" "${f%.pdf}_ocr.pdf" -l ron;'
(Извлечение и обработка изображений, а также «печать в формате pdf» удаляют OCR, но уменьшают размер с помощью ghostscript, как указано выше не , поэтому "сжатие" может применяться до или после OCR.)
Я получил неплохой результат, используя imageMagick и следующий скрипт http://www.fmwconcepts.com/imagemagick/shadowhighlight/index.php
Вот результат с использованием следующих параметров:
./shadowhighlight -ma 100 -sa 100 -ha 00 -hw 0 -bc 20 inputFile.png OutputFile.png
Просто установите GIMP (желательно использовать appimage). Ниже приведены варианты:
Второй вариант 2) Выберите Изображение> Режим> Индексированные> Использовать черно-белую 1-битную палитру
Любое количество страниц вашего PDF-файла может быть конвертировать все в 1 битное черно-белое изображение.