Як я можу перетворити PDF-файл із сірої в чорно-білу?


11

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


Оновлення:

Після відповіді Марко, PDF- файл BW не годиться, і оригінальний файл тут .


спробуйтеscantailor
frostschutz

scantailorЄ багато інших корисних функцій, коли мова йде про підготовку сканування для OCR, і це єдина причина, чому я запропонував це (як коментар, а не відповідь)
frostschutz

Ви можете відкривати та експортувати (принаймні деякі) .pdf у libreoffice (і, отже, я б здогадався більшість сучасних текстових процесорів). Не знаю, чи це зробить бажані зміни можливими або легкими через.
goldilocks

1
Є також pdfimages(poppler) для вилучення відсканованих зображень зі свого PDF-контейнера. Може бути ефективніше в першу чергу поводитися з ними ImageMagick.
frostschutz

Відповіді:


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за замовчуванням використовується роздільна здатність 75DPI, яка може не відповідати фактичній роздільній здатності, ви можете навести densityаргумент. І експериментуйте з thresholdналаштуванням. Оптимальні значення сильно залежать від вхідного файлу.

convert -density 150 -threshold 50% input.pdf output.pdf

Дякую! Одна проблема запуску першої команди: оригінальний pdf-сірий шрифт становить близько 25 МБ, а запущений ще не закінчився через 15 хв., А вихідний файл mono.ps вже становить 150 Мб і продовжує збільшуватися. Я хвилююся з цього приводу. Чи є інші способи, наприклад, друк у BW pdf-файл?
Тім

@Tim Це не рідкість. Файли PostScript не стискаються, отриманий PDF буде меншим.
Марко

Дякую. На це пішло близько 20 хвилин. BW pdf - це не так добре. і оригінальний файл тут
Тім

@Tim жахлива якість, не підходить для OCR незалежно від того, що ви робите.
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, який не змінює якість сканування в pdfs, щоб їх можна було шукати:

pypdfocr combined.pdf 

3

У мене також були відскановані кольорові pdfs та pdfs у кольорах сірого, які я хотів перетворити на bw. Я спробував з допомогою gsз кодом , перерахованих тут , і якість зображення гарне з текстом в форматі PDF по- , як і раніше там. Однак, цей код gs перетворюється лише в масштаб сірого (про що йдеться в запитанні) і все ще має великий розмір файлу. convertпри безпосередньому використанні дає дуже погані результати.

Я хотів, щоб у форматі bw pdfs була хороша якість зображення та невеликий розмір файлу. Моє рішення використовує gsдля витягування файлів bmp у градаціях сірого з pdf, convertдля встановлення порогу цих файлів 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.

Я думаю, є більш елегантне рішення. Однак мій метод дає результати з дуже хорошою якістю зображення та значно меншим розміром файлу. Щоб повернути текст у pw 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 точок на дюйм, який працює для моєї роботи, але ви можете змінити його, або перетворити їх в і й передати їх.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

Ви повинні цитувати ваші змінні оболонки; особливо ті, які виходять з аргументів або інших даних користувачів: наприклад, "./$input_pdf_name"і навіть seq 1 "$num_pages". Крім того , ви можете змінити , `…`щоб $(…)- побачити це , це і це .
G-Man каже "Відновити Моніку"

Це сценарій OccamsRazor, за винятком змін, які я зазначив. Я не програміст оболонок, тому не хотів возитися з чимось, що спрацювало. Але якщо хтось хоче це почистити, ви маєте мої вдячності.
низький стін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.