Come posso convertire un file pdf da scala di grigi a bianco e nero?


11

Il mio sistema operativo è Ubuntu 12.04. Come posso convertire un file pdf da scala di grigi a bianco e nero? Il file pdf in scala di grigi proviene dalla scansione con l'opzione in scala di grigi e il pdf in scala di bianco e nero è richiesto dall'OCR.


Aggiornare:

A seguito della risposta di Marco, il pdf BW non è buono e il file originale è qui .


tryscantailor
frostschutz,

scantailorha tonnellate di altre utili funzioni quando si tratta di preparare scansioni per OCR, ed è l'unico motivo per cui l'ho suggerito (come commento, non come risposta)
frostschutz,

Puoi aprire ed esportare (almeno alcuni) .pdf in libreoffice (e quindi indovino i più moderni elaboratori di testi). Non so se ciò renderà possibile o facile il cambiamento desiderato.
Goldilocks,

1
C'è anche pdfimages(poppler) per estrarre immagini scansionate dal suo contenitore PDF. Potrebbe essere più efficiente gestirli con ImageMagick in primo luogo.
frostschutz,

Risposte:


9

1) Usa ghostscript per convertire il PDF in un file PostScript monocromatico usando il dispositivo psmono :

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

2) Quindi convertire il PostScript monocromatico in PDF:

ps2pdf mono.ps

EDIT: il psmonodispositivo crea un'immagine di mezzo tono a 1 bit che apparentemente non è quella che desideri. Non sono riuscito a trovare un modo per specificare una soglia usando ghostscript, quindi ho fatto ricorso a imagemagick. convertutilizza internamente ghostscript per convertire il PDF. Quindi applica il filtro di soglia per produrre un'immagine a 1 bit e utilizza nuovamente ghostscript per creare un PDF. Poiché convertutilizza una risoluzione di 75 DPI per impostazione predefinita, che potrebbe non corrispondere alla risoluzione effettiva, è possibile fornire l' densityargomento. E sperimenta l' thresholdimpostazione. I valori ottimali dipendono fortemente dal file di input.

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

Grazie! Un problema nell'esecuzione del primo comando: il pdf originale in scala di grigi è di circa 25 MB e l'esecuzione non è ancora terminata dopo 15 minuti e il file di output mono.ps è già di 150 MB e continua ad aumentare. Mi preoccupo per questo. Esistono altri modi, ad esempio, di stampare su file pdf BW?
Tim

@ Tim Non è raro. I file PostScript non sono compressi, il PDF risultante sarà più piccolo.
Marco,

Grazie. Ci sono voluti circa 20 minuti. Il pdf BW non è buono. e il file originale è qui
Tim

@Tim qualità orribile, non adatto per OCR, qualunque cosa tu faccia.
frostschutz,

4

Il modo migliore che ho scoperto là fuori, senza perdita di qualità, rimuove ombre, rumori, testo dalla pagina successiva che sanguina, ecc:

1) Prima converti il ​​pdf in singole immagini

pdfimages combined_ocr.pdf page

2) In secondo luogo rimuovere le ombre, il rumore, il testo dalla pagina successiva che scorre (crediti per questo blog )

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

questo potrebbe essere aggiunto come extra-step o invece del comando sopra per ottenere effettivamente solo due colori:

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

3) Questo per creare un file pdf da ogni immagine jpg senza perdita di risoluzione o qualità:

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

4) Questo per concatenare le pagine pdf in una:

pdftk *.pdf cat output combined.pdf

5) E infine aggiungo un livello di testo OCR che non modifica la qualità della scansione nei pdf in modo che possano essere ricercati:

pypdfocr combined.pdf 

3

Avevo anche alcuni PDF a colori digitalizzati e PDF in scala di grigi che volevo convertire in bw. Ho provato a utilizzare gscon il codice elencato qui e la qualità dell'immagine è buona con il testo pdf ancora lì. Tuttavia, quel codice gs viene convertito solo in scala di grigi (come richiesto nella domanda) e ha ancora file di grandi dimensioni. convertproduce risultati molto scarsi se usato direttamente.

Volevo pdf in bw con una buona qualità dell'immagine e dimensioni ridotte del file. La mia soluzione utilizza gsper estrarre i file bmp in scala di grigi dal pdf, convertper sottrarre quei bmps a bw e salvarli come file tiff, quindi img2pdf per comprimere le immagini tiff e unirle tutte in un unico pdf.

Ho provato ad andare direttamente a tiff dal pdf ma la qualità non è la stessa, quindi salvo ogni pagina su bmp. Per un file pdf di una pagina, convertfa un ottimo lavoro da bmp a pdf. Esempio:

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

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

Per più pagine, gspuoi unire più file pdf in uno, ma img2pdfproduce file di dimensioni inferiori rispetto a gs. I file tiff devono essere decompressi come input per img2pdf. Tieni presente che per un gran numero di pagine, i file intermedi bmp e tiff tendono ad essere di grandi dimensioni. pdftko joinpdfsarebbe meglio se possono unire file PDF compressi da convert.

Immagino che ci sia una soluzione più elegante. Tuttavia, il mio metodo produce risultati con una qualità dell'immagine molto buona e dimensioni del file molto inferiori. Per recuperare il testo nel pdf bw, eseguire nuovamente OCR.

Il mio script shell utilizza gs, convert e img2pdf. Modificare i parametri (n. Di pagine, dpi di scansione, soglia%, ecc.) Elencati all'inizio come necessario ed eseguire chmod +x ./pdf2bw.sh. Ecco lo script completo (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

In realtà, se proviene da una scansione, l'unico modo ragionevole è usare pdfimages e convertire la grafica sottostante. Ho usato questo script per convertirlo:

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

Grazie a OccamsRazor per la sua sceneggiatura, che fa un ottimo lavoro nel convertire sia PDF a colori che in scala di grigi in una versione monocromatica compatta e leggibile. Questo è davvero un commento sul post di OccamsRazor, ma non ho abbastanza punti per commentare.

Lo script non funzionerà img2pdf -o ./$output_pdf_name --dpi $dpi_res $input_files poiché --dpinon è più un argomento accettato per img2pdf. Invece, ottiene la risoluzione dal file di input, quindi puoi semplicemente lasciarlo fuori.

Ecco la mia versione dello script. Non volevo modificare lo script per ogni file, quindi passo il numero di pagine e immetto il nome del file quando lo eseguo. Ho il nome di output impostato su e impostare la risoluzione su 200 dpi, che lavora per il mio flusso di lavoro, ma si potrebbe desiderare di cambiarla, o li trasformano in e e passarli in.00input_name$3$4

Per eseguire, utilizzare ad es ../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

Dovresti citare le variabili della tua shell; specialmente quelli che derivano da argomenti o altri input dell'utente: ad es. "./$input_pdf_name"e persino seq 1 "$num_pages". Inoltre, potresti voler cambiare `…`in $(…)- vedi questo , questo e questo .
G-Man dice "Reinstate Monica" il

Questa è la sceneggiatura di OccamsRazor ad eccezione delle modifiche che ho notato. Non sono un programmatore di shell, quindi non volevo sbagliare con qualcosa che funzionasse. Ma se qualcuno vuole ripulirlo, hai i miei ringraziamenti.
lowwall il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.