Как я могу преобразовать PDF-файл из серого в черно-белый?

11

Моя ОС - Ubuntu 12.04. Как я могу преобразовать PDF-файл из серого в черно-белый? PDF-файл в градациях серого получается при сканировании с серой шкалой, а OCR требует черно-белой шкалы pdf.


Обновить:

После ответа Марко, PDF-файл BW не очень хорош, и оригинальный файл здесь .

Тим
источник
попробуйscantailor
frostschutz
scantailorимеет множество других полезных функций, когда дело доходит до подготовки сканов для OCR, и это единственная причина, по которой я предложил это (как комментарий, а не ответ)
frostschutz
Вы можете открывать и экспортировать (по крайней мере, некоторые) .pdf в libreoffice (и, следовательно, я бы предположил большинство современных текстовых процессоров). Не знаю, сделает ли это желаемое изменение возможным или легким.
Златовласка
1
Там также pdfimages(poppler), чтобы извлечь отсканированные изображения из его контейнера PDF. Может быть более эффективно справиться с ними с помощью ImageMagick.
frostschutz
askubuntu.com/questions/9868/…
Сиро Сантилли 冠状 病毒 审查 六四 事件 法轮功

Ответы:

9

1) Используйте ghostscript для преобразования PDF в монохромный файл PostScript с помощью устройства psmono :

gs -q -sDEVICE=psmono -o mono.ps input.pdf

2) Затем преобразуйте монохромный PostScript обратно в PDF:

ps2pdf mono.ps

EDIT:psmono устройство создает 1-разрядное полутоновое изображение , которое , по- видимому , не то , что вы хотите. Я не смог найти способ указать пороговое значение с помощью ghostscript, поэтому я прибегнул к imagemagick. convertвнутренне использует ghostscript для преобразования PDF. Затем он применяет фильтрацию пороговых значений для получения 1-битного изображения и снова использует ghostscript для создания PDF. Поскольку convertпо умолчанию используется разрешение 75 точек на дюйм, которое может не совпадать с фактическим разрешением, вы можете указать densityаргумент. И поэкспериментируйте с thresholdнастройками. Оптимальные значения сильно зависят от входного файла.

convert -density 150 -threshold 50% input.pdf output.pdf
Marco
источник
Спасибо! Одна из проблем при запуске первой команды: исходный серый файл pdf составляет около 25 МБ, а выполнение еще не завершено через 15 минут, а выходной файл mono.ps уже составляет 150 МБ и продолжает увеличиваться. Я беспокоюсь об этом. Есть ли другие способы, например, распечатать в BW PDF-файл?
Тим
@ Тим Это не редкость. Файлы PostScript распакованы, полученный PDF-файл будет меньше.
Марко
Спасибо. Это заняло около 20 минут. BW PDF не хорошо. и оригинальный файл здесь
Тим
@Tim ужасного качества, не подходит для распознавания текста, независимо от того, что вы делаете.
frostschutz
4

Лучший способ, который я обнаружил там, без потери качества, удаляет тени, шумы, текст со следующей страницы, просвечивающей и т.д .:

1) Сначала конвертировать PDF в отдельные изображения

pdfimages combined_ocr.pdf page

2) Во-вторых, удалите тени, шум, текст со следующей страницы, через которую пролистываете (ссылки на этот блог )

ls ./p*.ppm | xargs -L1 -I {} convert {}  -quality 100 -density 300 -fill white -fuzz 80% +opaque "#000000" {}.jpg

это может быть добавлено как дополнительный шаг или вместо команды выше, чтобы фактически получить только два цвета:

ls ./p*.ppm | xargs -L1 -I {} convert {} +dither -colors 2 -type bilevel -density 300 -fill white -fuzz 40% +opaque "#000000" -density 300 {}.jpg

3) Это сделать PDF-файл из каждого изображения JPG без потери разрешения или качества:

ls -1 ./*jpg | xargs -L1 -I {} img2pdf {} -o {}.pdf

4) Это для объединения pdf-страниц в одну:

pdftk *.pdf cat output combined.pdf

5) И наконец, я добавляю текстовый слой OCRed, который не меняет качество сканирования в PDF-файлах, чтобы их можно было искать:

pypdfocr combined.pdf 
Эдуард Флоринеску
источник
3

У меня также были некоторые отсканированные цветные PDF-файлы и PDF-файлы в градациях серого, которые я хотел преобразовать в BW. Я попытался использовать gsс кодом, перечисленным здесь , и качество изображения хорошее с текстом PDF все еще там. Однако этот код GS конвертируется только в оттенки серого (как задано в вопросе) и по-прежнему имеет большой размер файла. convertдает очень плохие результаты при непосредственном использовании.

Я хотел получить PDF-файлы с хорошим качеством изображения и небольшим размером файла. Мое решение использует gsдля извлечения bmp-файлов в градациях серого из pdf, convertпороговых значений bmp для bw и сохранения их в виде tiff-файлов, а затем img2pdf для сжатия tiff-изображений и объединения их всех в один pdf.

Я попытался перейти непосредственно к PDF из TIFF, но качество не то же самое, поэтому я сохраняю каждую страницу в BMP. Для одностраничного PDF-файла convertотлично справляется с bmp в pdf. Пример:

gs -sDEVICE=bmpgray -dNOPAUSE -dBATCH -r300x300 \
   -sOutputFile=./pdf_image.bmp ./input.pdf

convert ./pdf_image.bmp -threshold 40% -compress zip ./bw_out.pdf

Для нескольких страниц, gsможно объединить несколько файлов PDF в один, но img2pdfдает меньший размер файла, чем GS. Файлы TIFF должны быть распакованы как входные данные для img2pdf. Имейте в виду, что для большого количества страниц промежуточные файлы bmp и tiff обычно имеют большой размер. pdftkили joinpdfбыло бы лучше, если бы они могли объединять сжатые файлы PDF из convert.

Я думаю, что есть более элегантное решение. Однако мой метод дает результаты с очень хорошим качеством изображения и гораздо меньшим размером файла. Чтобы вернуть текст обратно в bw pdf, снова запустите OCR.

Мой сценарий оболочки использует gs, convert и img2pdf. При необходимости измените параметры (количество страниц, dpi сканирования, пороговое значение% и т. Д.), Указанные в начале, и запустите chmod +x ./pdf2bw.sh. Вот полный скрипт (pdf2bw.sh):

#!/bin/bash

num_pages=12
dpi_res=300
input_pdf_name=color_or_grayscale.pdf
bw_threshold=40%
output_pdf_name=out_bw.pdf
#-------------------------------------------------------------------------
gs -sDEVICE=bmpgray -dNOPAUSE -dBATCH -q -r$dpi_res \
   -sOutputFile=./%d.bmp ./$input_pdf_name
#-------------------------------------------------------------------------
for file_num in `seq 1 $num_pages`
do
  convert ./$file_num.bmp -threshold $bw_threshold \
          ./$file_num.tif
done
#-------------------------------------------------------------------------
input_files=""

for file_num in `seq 1 $num_pages`
do
  input_files+="./$file_num.tif "
done

img2pdf -o ./$output_pdf_name --dpi $dpi_res $input_files
#-------------------------------------------------------------------------
# clean up bmp and tif files used in conversion

for file_num in `seq 1 $num_pages`
do
  rm ./$file_num.bmp
  rm ./$file_num.tif
done
Бритва Оккама
источник
2

На самом деле, если это происходит от сканирования, единственный разумный способ - это использовать pdfimages и конвертировать основную графику. Я использовал этот скрипт, чтобы преобразовать его:

#!/bin/sh
if [ -z "$1" -o -z "$2" ]; then
    echo "Syntax: $0 <input.pdf> <output.pdf>"
    exit 1
fi

pdfimages "$1" scan
for a in scan*.ppm; do 
   convert -white-threshold 85% -monochrome $a `basename $a .ppm`.tiff
done
tiffcp scan*.tiff output.tiff
tiff2pdf output.tiff -o "$2" -p A4 -F
rm scan*.ppm scan*.tiff output.tiff
Ондра
источник
2

Спасибо OccamsRazor за его сценарий, который отлично справляется с преобразованием цветных и полутоновых PDF-файлов в компактную и разборчивую монохромную версию. Это действительно комментарий к посту OccamsRazor, но у меня недостаточно очков, чтобы комментировать.

Сценарий не будет работать, так img2pdf -o ./$output_pdf_name --dpi $dpi_res $input_files как --dpiон больше не является допустимым аргументом для img2pdf. Вместо этого он получает разрешение из входного файла, так что вы можете просто пропустить его.

Вот моя версия сценария. Я не хотел редактировать скрипт для каждого файла, поэтому я передаю количество страниц и имя входного файла при запуске. У меня установлено выходное имя и разрешение 200 dpi, что подходит для моего рабочего процесса, но вы можете изменить его или превратить в и и передать их.00input_name$3$4

Для запуска, использование , например, ../pdf2bw.sh <number_of_pages> <input_name>./pdf2bw.sh 55 input.pdf

#!/bin/bash

num_pages=$1
input_pdf_name=$2
output_pdf_name="00$2"
bw_threshold=40%
dpi_res=200
#-------------------------------------------------------------------------
gs -sDEVICE=bmpgray -dNOPAUSE -dBATCH -q -r$dpi_res \
   -sOutputFile=./%d.bmp ./$input_pdf_name
#-------------------------------------------------------------------------
for file_num in `seq 1 $num_pages`
do
  convert ./$file_num.bmp -threshold $bw_threshold \
          ./$file_num.tif
done
#-------------------------------------------------------------------------
input_files=""

for file_num in `seq 1 $num_pages`
do
  input_files+="./$file_num.tif "
done

img2pdf -o ./$output_pdf_name $input_files
#-------------------------------------------------------------------------
# clean up bmp and tif files used in conversion

for file_num in `seq 1 $num_pages`
do
  rm ./$file_num.bmp
  rm ./$file_num.tif
done
lowwall
источник
Вы должны заключить в кавычки свои переменные оболочки; особенно те, которые приходят из аргументов или другого пользовательского ввода: например, "./$input_pdf_name"и даже seq 1 "$num_pages". Кроме того , вы можете изменить , `…`чтобы $(…)- увидеть это , это и это .
G-Man говорит «Восстановить Монику»
Это скрипт OccamsRazor, за исключением изменений, которые я отметил. Я не программист, поэтому я не хотел связываться с чем-то, что сработало. Но если кто-то захочет навести порядок, спасибо.
lowwall