PDF остаётся форматом, в котором приходят счета, сканы и договоры. В Linux нет Adobe Acrobat, но почти все типовые задачи решаются набором небольших утилит: qpdf, Ghostscript, poppler и OCRmyPDF. Они работают из терминала, предсказуемы в пакетной обработке и не требуют подписки. Ниже — практический маршрут от проверки файла до поиска по скану.
Инструменты и установка
Каждый инструмент отвечает за своё. qpdf меняет структуру файла и страницы, Ghostscript пересобирает PDF и сжимает изображения, утилиты poppler дают информацию и извлекают текст, OCRmyPDF добавляет текстовый слой через Tesseract. Для визуальной перестановки страниц удобен pdfarranger.
sudo apt install qpdf ghostscript ocrmypdf tesseract-ocr tesseract-ocr-rus poppler-utils
qpdf --version
ocrmypdf --version
tesseract --list-langs
Пакет tesseract-ocr-rus обязателен для русских сканов, английский обычно уже включён. Если нужны другие языки, ставьте соответствующие пакеты и перечисляйте их через плюс: -l rus+eng. Проверка tesseract --list-langs должна показать нужные модели перед запуском пакетной обработки.
Утилита pdfarranger ставится отдельным пакетом и служит для ручной работы: переставить страницы, удалить пустые, повернуть страницу. Для автоматизации она не нужна, но при разборе чужих сканов экономит много времени.
Сначала диагностика
Не спешите сжимать и распознавать: сначала выясните, что внутри. Текстовый слой, набор шрифтов и список изображений подскажут, нужен ли OCR и какой способ уменьшения размера даст эффект.
pdfinfo document.pdf
pdffonts document.pdf
pdfimages -list document.pdf
qpdf --check document.pdf
Если pdffonts показывает шрифты, а pdftotext возвращает читаемый текст, файл уже текстовый и OCR не нужен. Пустой список шрифтов вместе с большим числом изображений означает скан. Проверка qpdf --check выявляет повреждённую структуру, а pdfsig показывает цифровые подписи: любые изменения сделают их недействительными.
Команда qpdf --show-npages быстро выдаёт число страниц, а pdfimages -list показывает разрешение и тип сжатия каждой картинки. По этим данным видно, даст ли пересборка заметный выигрыш.
Объединение и разделение
qpdf собирает новый документ из указанных страниц и умеет брать диапазоны. Синтаксис --pages позволяет выбрать файл, номера страниц и поворот, а пустой вход --empty создаёт документ с нуля.
qpdf --empty --pages a.pdf b.pdf 3-5 -- merged.pdf
qpdf --split-pages=10 big.pdf part-%02d.pdf
pdfunite cover.pdf body.pdf result.pdf
pdfarranger merged.pdf
В примере сначала идут все страницы a.pdf, затем страницы с третьей по пятую из b.pdf. pdfunite проще, но не сохраняет закладки и не даёт управлять диапазонами. После объединения проверьте порядок, ориентацию и закладки: визуальный просмотр в pdfarranger занимает меньше времени, чем поиск ошибки в готовом документе.
Сжатие
Ghostscript пересобирает PDF и перекодирует изображения. Профиль /ebook уменьшает картинки до 150 dpi, /screen — до 72 dpi, /printer оставляет 300 dpi. Текст остаётся векторным, поэтому читаемость обычно не страдает, а размер падает за счёт иллюстраций.
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.7 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=out.pdf in.pdf
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.7 -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -sOutputFile=small.pdf in.pdf
qpdf --optimize-images --recompress-flate --compression-level=9 in.pdf opt.pdf
ls -lh in.pdf out.pdf small.pdf opt.pdf
Для архива используйте qpdf: он переупаковывает структуру без потери качества изображений. Ghostscript может изменить формы, аннотации и метаданные, поэтому исходник сохраняйте отдельно. Не сжимайте один и тот же скан многократно: артефакты накапливаются, а выигрыш с каждым разом меньше.
Если автоматических профилей мало, разрешение задают вручную параметрами -dDownsampleColorImages=true и -dColorImageResolution=120. Это точнее, чем выбирать между /ebook и /screen.
OCR сканов
OCRmyPDF не заменяет изображение страницы, а добавляет невидимый текстовый слой. Файл по-прежнему выглядит как скан, но по нему работает поиск и копирование. Для чистого результата полезны выравнивание, поворот и очистка фона.
ocrmypdf -l rus+eng --deskew --clean --rotate-pages --output-type pdfa scan.pdf searchable.pdf
ocrmypdf --skip-text already.pdf out.pdf
ocrmypdf --redo-ocr bad-layer.pdf fixed.pdf
ocrmypdf --sidecar text.txt scan.pdf searchable.pdf
Ключ --skip-text оставляет страницы с готовым текстом и распознаёт только изображения, --redo-ocr заменяет неудачный слой, а --force-ocr растеризует всё целиком и подходит редко. Для сканов достаточно 300 dpi: большее разрешение замедляет работу почти без прироста точности. Для больших пакетов добавьте --jobs 2 и --optimize 1: первая опция ограничивает параллельность, вторая включает быструю оптимизацию результата.
Пакетная обработка
Десятки файлов удобнее обрабатывать циклом, сохраняя результаты в отдельный каталог. Ошибки не должны останавливать очередь, поэтому сбой отмечают в выводе и разбирают отдельно.
mkdir -p out
for f in scans/*.pdf; do
ocrmypdf -l rus+eng --deskew --clean "$f" "out/$(basename "$f")" || echo "fail: $f"
done
find out -name '*.pdf' -size +20M -print
Запускайте не больше двух задач одновременно на обычном сервере: OCRmyPDF распараллеливает страницы внутри задания, и лишние процессы начинают конкурировать за память. Перед запуском убедитесь, что на диске хватает места: промежуточные файлы могут занимать больше исходника.
Типичные ошибки
- Сообщение о существующем тексте — используйте
--skip-textили--redo-ocr. - Нет русского языка — установите
tesseract-ocr-rusи проверьте список моделей. - Файл защищён паролем — нужен пароль владельца, обходить ограничения чужих документов нельзя.
- Результат больше исходника — уменьшите разрешение изображений или примените qpdf.
- Пропал текст после сжатия — проверьте
pdftotextи версию исходника.
pdftotext -layout searchable.pdf - | head -40
qpdf --password='your-password' --decrypt protected.pdf decrypted.pdf
ocrmypdf -O3 -l rus+eng --deskew scan.pdf compressed.pdf
pdfinfo searchable.pdf | grep -E 'Pages|File size|PDF version'
Проверка текста через pdftotext быстрее, чем открывать каждую страницу. Если слой есть, но слова разорваны, попробуйте другой режим сегментации Tesseract или увеличьте разрешение скана. Для подписанных документов сохраняйте оригинал: любая пересборка аннулирует подпись.
Итог
PDF на Linux обрабатывается свободными инструментами: qpdf отвечает за страницы и структуру, Ghostscript за сжатие, OCRmyPDF и Tesseract за поиск по сканам. Сначала диагностика, затем операция и обязательная проверка результата. Откройте итог в двух просмотрщиках. Такой порядок экономит время и не портит исходные документы.