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

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

11
06.08.2018, 06:45
5 ответов

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

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

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

ps2pdf mono.ps

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

convert -density 150 -threshold 50% input.pdf output.pdf
9
27.01.2020, 19:57
  • 1
    Спасибо! Одна проблема выполнения первой команды: исходный полутоновый PDF составляет приблизительно 25 МБ, и выполнение еще не закончилось после 15 минут, и выходной файл mono.ps уже - 150 МБ и все еще увеличение. Я волнуюсь об этом. Есть ли другие пути, например, печать в файл PDF B-W? –  StackExchange for All 28.07.2013, 16:01
  • 2
    @Tim Это весьма распространено. Файлы PostScript являются несжатыми, получающийся PDF будет меньшим. –  Marco 28.07.2013, 16:05
  • 3
    Спасибо. Потребовалось приблизительно 20 минут, PDF B-W не хорош. и исходный файл здесь –  StackExchange for All 28.07.2013, 17:02
  • 4
    @Tim, которому не удовлетворяют для OCR независимо от того, что Вы делаете. –  frostschutz 28.07.2013, 18:53

На самом деле, если это прибывает из сканирования, единственный разумный путь состоит в том, чтобы использовать 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
27.01.2020, 19:57

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

Я хотел BW PDFS с хорошим качеством изображения и небольшим размером файла. Мое решение использует GS GS для извлечения файлов BMP в оттенках серого из PDF, Convert , чтобы порог эти BMP на BW и сохранить их в виде файлов TIFF, а затем IMG2PDF для сжатия Изображения TIFF и сливаются их в один PDF.

Я пытался идти прямо в TIFF из PDF, но качество не то же самое, поэтому я сохраняю каждую страницу к 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, конвертировать и 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
3
27.01.2020, 19:57

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

  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

50 -60% процентов fuzzменее агрессивен и дает более читаемые результаты:

ls./p*.ppm | xargs -L1 -I {} convert {} +dither -colors 2 -type bilevel -density 300 -fill white -fuzz 40% +opaque "#000000" -density 300 {}.jpg
  1. Это делается для создания pdf-файла из каждого jpg-изображения без потери разрешения или качества:

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

  2. Это позволяет объединить страницы PDF в одну:

    pdftk *.pdf cat output combined.pdf

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

    pypdfocr combined.pdf

5
27.01.2020, 19:57

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

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

Вот мой вариант сценария. Я не хотел редактировать сценарий для каждого файла, поэтому при запуске я передаю количество страниц и имя файла. У меня установлено выходное имя 00input_nameи разрешение 200 dpi, что подходит для моего рабочего процесса, но вы можете изменить его или превратить их в $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
2
27.01.2020, 19:57

Теги

Похожие вопросы