Инструменты пользователя

Инструменты сайта


tasks:scan-pdf-ocr

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
tasks:scan-pdf-ocr [04.03.2021 11:51] – [Автоматически] viacheslavtasks:scan-pdf-ocr [30.07.2024 19:21] (текущий) – внешнее изменение 127.0.0.1
Строка 1: Строка 1:
 +===== Автоматически =====
 +Нужен GhostScript и [[https://github.com/UB-Mannheim/tesseract/wiki|Tesseract]].
  
 +Powershell 7, с использованием parallel foreach. Распознаются ''tiff?|jpe?g|pdf|png''.
 +<code powershell>
 +#Requires -Version 7.0
 +
 +# https://stackoverflow.com/questions/4695695/convert-pdf-to-jpg-or-png-using-c-sharp-or-command-line
 +# & "$tesseract" --help-extra
 +
 +<#
 +# Show resolution and DPI of an image
 +# & C:\scripts\ImageMagick\identify.exe -format "%w x %h %x x %y" "D:\temp\ocr\pict.png"
 +# https://askubuntu.com/questions/760993/how-to-programmatically-determine-dpi-of-images-in-pdf-file
 +[int]$dpi = & C:\scripts\ImageMagick\identify.exe -format "%x" "C:\Pictures\pic.jpg"
 +if ($dpi -lt 72) {$dpi = 72}
 +#>
 +
 +$ghostScript = "C:\scripts\Ghostscript\bin\gswin64c.exe"
 +$tesseract = "C:\scripts\Tesseract\tesseract.exe"
 +$path = "C:\temp\ocr"
 +# quit if no appropriate files in the folder
 +$sources = dir "$path" |? Extension -match "tiff?$|jpe?g$|png$|pdf$"
 +if (!$sources) {exit}
 +$temp = "C:\temp\ocr$((get-date).ToString("yyyyMMddHHmmss"))"
 +# CPU threads
 +$threads = (gcim win32_processor).NumberOfLogicalProcessors
 +
 +# temp folder, moving files
 +mkdir "$temp" > $null
 +mv $sources "$temp"
 +cd "$temp"
 +
 +# processing
 +$pdfs,$images = (dir "$temp").where({$_.extension -eq '.pdf'}, 'Split')
 +# PDFs
 +$pdfs |ForEach-Object -Parallel {
 +& "$using:ghostScript" -dBATCH -dNOPAUSE -sDEVICE=pnggray -r300 "-sOutputFile=$($_.basename)-%04d.png" "$($_.fullname)"
 +} -ThrottleLimit $threads
 +
 +foreach ($pdf in $pdfs) {
 +    (dir *.png) -match "$($pdf.basename)-\d{4}" |ForEach-Object -Parallel {
 +    & "$using:tesseract" ".\$($_.name)" "$($_.basename)" -l rus+eng
 +    } -ThrottleLimit $threads
 +gc ((dir *.txt) -match "$($pdf.basename)-\d{4}") -Encoding UTF8 |Out-File "$path\$($pdf.basename).txt" -Encoding 1251
 +}
 +
 +# Images
 +$images |ForEach-Object -Parallel {
 +& "$using:tesseract" ".\$($_.name)" "$($_.basename)" -l rus+eng
 +gc ".\$($_.basename).txt" -Encoding UTF8 |Out-File "$using:path\$($_.basename).txt" -Encoding 1251
 +} -ThrottleLimit $threads
 +
 +# remove temp folder
 +cd "$path"
 +rmdir "$temp" -Recurse -Force -Confirm:$false
 +</code>
 +
 +Powershell 5.1
 +<code powershell>
 +$ghostScript = "C:\scripts\Ghostscript\bin\gswin64c.exe"
 +$tesseract = "C:\scripts\Tesseract\tesseract.exe"
 +$path = "C:\temp\ocr"
 +# quit if no appropriate files in the folder
 +$sources = dir "$path" |? Extension -match "tiff?$|jpe?g$|png$|pdf$"
 +if (!$sources) {exit}
 +$temp = "C:\temp\ocr$((get-date).ToString("yyyyMMddHHmmss"))"
 +
 +# temp folder, moving files
 +mkdir "$temp" > $null
 +$sources |mv -Destination "$temp"
 +cd "$temp"
 +
 +# processing
 +$pdfs,$images = (dir "$temp").where({$_.extension -eq '.pdf'}, 'Split')
 +# PDFs
 +foreach ($pdf in $pdfs) {
 +& "$ghostScript" -dBATCH -dNOPAUSE -sDEVICE=pnggray -r300 "-sOutputFile=$($pdf.basename)-%04d.png" "$($pdf.fullname)"
 +    (dir *.png) -match "$($pdf.basename)" |% {
 +    & "$tesseract" ".\$($_.name)" "$($_.basename)" -l rus+eng
 +    }
 +    
 +    gc ((dir *.txt) -match "$($pdf.basename)") -Encoding UTF8 |Out-File "$path\$($pdf.basename).txt" -Encoding default
 +}
 +# Images
 +$images |% {
 +& "$tesseract" ".\$($_.name)" "$($_.basename)" -l rus+eng
 +gc ".\$($_.basename).txt" -Encoding UTF8 |Out-File "$path\$($_.basename).txt" -Encoding default
 +}
 + 
 +# Removing temp folder
 +cd "$path"
 +rmdir "$temp" -Recurse -Force -Confirm:$false
 +</code>
 +
 +==== Извлечь текст из PDF ====
 +В случае, если PDF содержит не картинки, а текстовый слой.
 +<code powershell>
 +& "C:\scripts\Ghostscript\bin\gswin64c.exe" -dBATCH -dNOPAUSE -sDEVICE=txtwrite -o "D:\Downloads\output.txt" "D:\Downloads\input.pdf"
 +</code>
 +https://stackoverflow.com/questions/3650957/how-to-extract-text-from-a-pdf\\
 +https://stackoverflow.com/questions/6187250/pdf-text-extraction-from-given-coordinates
 +
 +
 +===== Руками =====
 +Вся обработка выполняется с помощью бесплатных инструментов.
 +
 +==== Файл PDF без распознанного текста ====
 +  - Книга сканируется постранично (разворот), один файл на страницу, TIFF, 600 dpi, в цвете.
 +  - Все полученные изображения обрабатываются в программе [[http://scantailor.org/downloads/|ScanTailor]], где текст делается чёрно-белым, выравнивается, выделяются картинки и т. п. Результат сохраняется в разрешении 300 dpi.
 +  - Полученные картинки сортируются по размеру, и те, где остался цвет (фото, буквицы, элементы оформления, обложки) пережимаются в формат JPEG в программе [[http://www.xnview.com/en/|XnView]] с качеством 50 и с опциями «оптимизация по алгоритму Хаффмана» и «прогрессивный». Остальные галки нужно снять. В принципе, можно использовать любую другую программу для эффективного сжатия больших файлов TIFF, главное — сэкономить максимум места при минимуме потерь качества изображения. Чёрно-белые страницы, например, где есть только текст, уже имеют малый размер после обработки в ScanTailor, поэтому в дальнейшей обработке не нуждаются.
 +  - Обработанные цветные и чёрно-белые страницы загружаются в программу [[https://www.pdfill.com/pdf_tools_free.html|PDFill Free PDF tools]], режим «Convert images to PDF», где ставится галка «Use image size to decide page size with DPI» и выбирается значение 300, т. е. то разрешение, которое было на выходе из ScanTailor. Все поля должны иметь нулевое значение. После окончания процесса обработки получается финальный файл PDF, имеющий небольшой размер при хорошем качестве изображения.
 +
 +==== Распознавание ====
 +Хороший результат даёт [[https://github.com/manisandro/gImageReader/releases|gImageReader]] - это графический интерфейс к программе Tesseract.
 +
 +Чтобы распознавать русский текст, нужно скачать поддержку русского языка и словарь для удобства вычитки. Всё это делается прямо из интерфейса программы.
 +
 +Дополнительно имеется хороший текстовый редактор (там отображаются результаты). Можно убрать переносы в конце строк и т. д.

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki