Wie kann ich eine PDF-Datei von Graustufen in Schwarzweiß konvertieren?


11

Mein Betriebssystem ist Ubuntu 12.04. Wie kann ich eine PDF-Datei von Graustufen in Schwarzweiß konvertieren? Die Graustufen-PDF-Datei stammt aus dem Scannen mit Graustufenoption, und die Schwarz-Weiß-PDF-Datei wird von OCR benötigt.


Aktualisieren:

Nach Marcos Antwort ist das BW-PDF nicht gut und die Originaldatei ist hier .


versuchenscantailor
Frostschutz

scantailorhat Tonnen von anderen nützlichen Funktionen, wenn es darum geht, Scans für OCR vorzubereiten, und das ist der einzige Grund, warum ich es vorgeschlagen habe (als Kommentar, nicht als Antwort)
Frostschutz

Sie können (zumindest einige) PDF-Dateien in libreoffice öffnen und exportieren (und daher würde ich die meisten modernen Textverarbeitungsprogramme erraten). Ich weiß nicht, ob dies Ihre gewünschte Änderung möglich oder einfach macht.
Goldlöckchen

1
Es gibt auch pdfimages(Poppler), um gescannte Bilder aus seinem PDF-Container zu extrahieren. Möglicherweise ist es effizienter, sie überhaupt mit ImageMagick zu handhaben.
Frostschutz

Antworten:


9

1) Verwenden Sie Ghostscript , um die PDF-Datei mit dem psmono- Gerät in eine monochrome PostScript-Datei zu konvertieren :

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

2) Konvertieren Sie dann das monochrome PostScript zurück in PDF:

ps2pdf mono.ps

BEARBEITEN: Das psmonoGerät erstellt ein 1-Bit-Halbtonbild, das anscheinend nicht Ihren Wünschen entspricht. Ich konnte keine Möglichkeit finden, mithilfe von Ghostscript einen Schwellenwert anzugeben, daher habe ich auf imagemagick zurückgegriffen. convertVerwendet intern Ghostscript, um das PDF zu konvertieren. Anschließend wird die Schwellenwertfilterung angewendet, um ein 1-Bit-Bild zu erstellen, und es wird erneut Ghostscript verwendet, um eine PDF-Datei zu erstellen. Da convertstandardmäßig eine Auflösung von 75 DPI verwendet wird, die möglicherweise nicht mit Ihrer tatsächlichen Auflösung übereinstimmt, können Sie das densityArgument angeben . Und experimentieren Sie mit der thresholdEinstellung. Die optimalen Werte hängen stark von der Eingabedatei ab.

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

Vielen Dank! Ein Problem beim Ausführen des ersten Befehls: Das ursprüngliche Graustufen-PDF ist ungefähr 25 MB groß, und die Ausführung ist nach 15 Minuten noch nicht abgeschlossen, und die Ausgabedatei mono.ps ist bereits 150 MB groß und nimmt immer noch zu. Ich mache mir darüber Sorgen. Gibt es andere Möglichkeiten, zum Beispiel in eine BW-PDF-Datei zu drucken?
Tim

@ Tim Das ist nicht ungewöhnlich. PostScript-Dateien werden nicht komprimiert, das resultierende PDF wird kleiner.
Marco

Vielen Dank. Es dauerte ungefähr 20 Minuten. Das BW pdf ist nicht gut. und die Originaldatei ist hier
Tim

@ Tim schreckliche Qualität, nicht für OCR geeignet, egal was Sie tun.
Frostschutz

4

Der beste Weg, den ich dort herausgefunden habe, ohne Qualitätsverlust, entfernt Schatten, Rauschen, Text von der nächsten Seite, die durchblutet usw.:

1) Konvertieren Sie zuerst PDF in einzelne Bilder

pdfimages combined_ocr.pdf page

2) Zweitens entfernen Sie Schatten, Rauschen und Text von der nächsten Seite, die durchblutet (Credits für diesen Blog ).

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

Dies kann entweder als zusätzlicher Schritt oder anstelle des obigen Befehls hinzugefügt werden, um tatsächlich nur zwei Farben zu erhalten:

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

3) Dies, um aus jedem JPG-Bild eine PDF-Datei zu machen, ohne die Auflösung oder Qualität zu beeinträchtigen:

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

4) Dies, um die PDF-Seiten zu einer zu verketten:

pdftk *.pdf cat output combined.pdf

5) Und zuletzt füge ich eine OCRed-Textebene hinzu, die die Qualität des Scans in den PDFs nicht ändert, damit sie durchsucht werden können:

pypdfocr combined.pdf 

3

Ich hatte auch einige gescannte Farb-PDFs und Graustufen-PDFs, die ich in bw konvertieren wollte. Ich habe versucht, gsmit dem hier aufgeführten Code zu arbeiten , und die Bildqualität ist gut, wenn der PDF-Text noch vorhanden ist. Dieser gs-Code konvertiert jedoch nur in Graustufen (wie in der Frage gestellt) und hat immer noch eine große Dateigröße. convertliefert bei direkter Verwendung sehr schlechte Ergebnisse.

Ich wollte bw pdfs mit guter Bildqualität und kleiner Dateigröße. Meine Lösung verwendet gs, um Graustufen-BMP-Dateien aus dem PDF zu extrahieren, convertdiese BMPs auf BW zu beschränken und sie als TIFF-Dateien zu speichern, und dann img2pdf , um die TIFF-Bilder zu komprimieren und sie alle zu einem PDF zusammenzuführen.

Ich habe versucht, direkt aus dem PDF zu tiff, aber die Qualität ist nicht die gleiche, also speichere ich jede Seite in bmp. Für eine einseitige PDF-Datei convertmacht es einen großartigen Job von bmp bis pdf. Beispiel:

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

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

gsKann für mehrere Seiten mehrere PDF-Dateien zu einer zusammenführen, img2pdfergibt jedoch eine kleinere Dateigröße als gs. Die TIFF-Dateien müssen als Eingabe für img2pdf dekomprimiert werden. Beachten Sie bei einer großen Anzahl von Seiten, dass die Zwischen-BMP- und TIFF-Dateien in der Regel groß sind. pdftkoder joinpdfwäre besser, wenn sie komprimierte pdf-Dateien aus zusammenführen können convert.

Ich stelle mir vor, es gibt eine elegantere Lösung. Meine Methode liefert jedoch Ergebnisse mit sehr guter Bildqualität und viel kleinerer Dateigröße. Führen Sie OCR erneut aus, um Text wieder in das bw-PDF aufzunehmen.

Mein Shell-Skript verwendet gs, convert und img2pdf. Ändern Sie die am Anfang aufgeführten Parameter (Anzahl der Seiten, Scan-DPI, Schwellenwert% usw.) nach Bedarf und führen Sie sie aus chmod +x ./pdf2bw.sh. Hier ist das vollständige Skript (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

Wenn es sich um einen Scan handelt, besteht der einzig sinnvolle Weg darin, PDF-Bilder zu verwenden und die zugrunde liegenden Grafiken zu konvertieren. Ich habe dieses Skript verwendet, um es zu konvertieren:

#!/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

1

Vielen Dank an OccamsRazor für sein Skript, das sowohl Farb- als auch Graustufen-PDFs hervorragend in eine kompakte und lesbare monochrome Version konvertiert. Dies ist wirklich ein Kommentar zu OccamsRazors Beitrag, aber ich habe nicht genug Punkte, um ihn zu kommentieren.

Das Skript schlägt fehl, img2pdf -o ./$output_pdf_name --dpi $dpi_res $input_files da --dpies für img2pdf kein akzeptiertes Argument mehr ist. Stattdessen wird die Auflösung aus der Eingabedatei abgerufen, sodass Sie sie einfach weglassen können.

Hier ist meine Version des Skripts. Ich wollte das Skript nicht für jede Datei bearbeiten, daher gebe ich die Anzahl der Seiten und den Namen der Eingabedatei ein, wenn ich es ausführe. Ich habe den Ausgabenamen Satz und die Auflösung auf 200 dpi, die für meinen Workflow funktioniert, aber Sie können es ändern möchten, oder machen sie zu und und geben sie in.00input_name$3$4

Verwenden Sie zum Ausführen z ../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

Sie sollten Ihre Shell-Variablen angeben. insbesondere diejenigen, die aus Argumenten oder anderen Benutzereingaben stammen: z . B. "./$input_pdf_name"und sogar seq 1 "$num_pages". Vielleicht möchten Sie auch ändern `…`zu $(…)- sehen Sie dies , dies und das .
G-Man sagt 'Reinstate Monica'

Dies ist das Skript von OccamsRazor, mit Ausnahme der Änderungen, die ich notiert habe. Ich bin kein Shell-Programmierer, also wollte ich mich nicht mit etwas anlegen, das funktioniert. Aber wenn jemand das aufräumen will, haben Sie meinen Dank.
Lowwall
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.