Comment puis-je convertir un fichier pdf de l'échelle de gris en noir-blanc?


11

Mon système d'exploitation est Ubuntu 12.04. Comment puis-je convertir un fichier pdf de l'échelle de gris en noir-blanc? Le fichier pdf d'échelle de gris provient de la numérisation avec l'option d'échelle de gris, et le pdf d'échelle noir et blanc est requis par l'OCR.


Mettre à jour:

Suite à la réponse de Marco, le pdf BW n'est pas bon et le fichier d'origine est ici .


tryscantailor
frostschutz

scantailora des tonnes d'autres fonctionnalités utiles quand il s'agit de préparer des numérisations pour l'OCR, et c'est la seule raison pour laquelle je l'ai suggéré (comme un commentaire, pas une réponse)
frostschutz

Vous pouvez ouvrir et exporter (au moins certains) .pdf dans libreoffice (et donc je suppose que la plupart des traitements de texte modernes). Je ne sais pas si cela rendra le changement souhaité possible ou facile.
goldilocks

1
Il y a aussi pdfimages(poppler) pour extraire les images numérisées de son conteneur PDF. Peut être plus efficace pour les gérer avec ImageMagick en premier lieu.
frostschutz

Réponses:


9

1) Utilisez ghostscript pour convertir le PDF en un fichier PostScript monochrome à l'aide du périphérique psmono :

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

2) Puis reconvertissez le PostScript monochrome en PDF:

ps2pdf mono.ps

EDIT: l' psmonoappareil crée une image en demi-teinte 1 bit qui n'est apparemment pas ce que vous voulez. Je ne pouvais pas trouver un moyen de spécifier un seuil en utilisant ghostscript, alors j'ai eu recours à imagemagick. convertutilise en interne ghostscript pour convertir le PDF. Il applique ensuite le filtrage de seuil pour produire une image 1 bit et utilise à nouveau ghostscript pour créer un PDF. Comme convertutilise une résolution de 75 DPI par défaut, qui peut ne pas correspondre à votre résolution réelle, vous pouvez fournir l' densityargument. Et expérimentez le thresholdréglage. Les valeurs optimales dépendent fortement du fichier d'entrée.

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

Merci! Un problème lié à l'exécution de la première commande: le fichier PDF en niveaux de gris d'origine est d'environ 25 Mo, et l'exécution n'est pas encore terminée après 15 minutes, et le fichier de sortie mono.ps est déjà de 150 Mo et continue d'augmenter. Je m'en inquiète. Existe-t-il d'autres moyens, par exemple, d'imprimer dans un fichier pdf BW?
Tim

@Tim Ce n'est pas rare. Les fichiers PostScript ne sont pas compressés, le PDF résultant sera plus petit.
Marco

Merci. Cela nous a pris environ 20 minutes. Le pdf BW n'est pas bon. et le fichier d'origine est ici
Tim

@Tim horrible qualité, ne convient pas à l'OCR, peu importe ce que vous faites.
frostschutz

4

Le meilleur moyen que j'ai trouvé là-bas, sans perte de qualité, supprime les ombres, le bruit, le texte de la page suivante, etc.:

1) Convertissez d'abord le pdf en images individuelles

pdfimages combined_ocr.pdf page

2) Supprimez ensuite les ombres, le bruit, le texte de la page suivante qui saigne (crédits à ce blog )

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

cela pourrait être ajouté en tant qu'étape supplémentaire ou à la place de la commande ci-dessus pour obtenir en fait seulement deux couleurs:

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

3) Ceci pour créer un fichier pdf à partir de chaque image jpg sans perte de résolution ou de qualité:

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

4) Ceci pour concaténer les pages pdf en une seule:

pdftk *.pdf cat output combined.pdf

5) Et enfin, j'ajoute un calque de texte OCRed qui ne change pas la qualité de la numérisation dans les fichiers PDF afin qu'ils puissent être recherchés:

pypdfocr combined.pdf 

3

J'avais également des fichiers PDF couleur numérisés et des fichiers PDF en niveaux de gris que je voulais convertir en bw. J'ai essayé d'utiliser gsavec le code répertorié ici , et la qualité d'image est bonne avec du texte pdf toujours là. Cependant, ce code gs se convertit uniquement en niveaux de gris (comme demandé dans la question) et a toujours une grande taille de fichier. convertdonne de très mauvais résultats lorsqu'il est utilisé directement.

Je voulais des pdfs bw avec une bonne qualité d'image et une petite taille de fichier. Ma solution utilise gspour extraire les fichiers bmp en niveaux de gris du pdf, convertpour seuiller ces bmps pour bw et les enregistrer en tant que fichiers tiff, puis img2pdf pour compresser les images tiff et les fusionner toutes dans un pdf.

J'ai essayé d'aller directement au tiff depuis le pdf mais la qualité n'est pas la même donc j'enregistre chaque page en bmp. Pour un fichier pdf d'une page, convertfait un excellent travail de bmp en pdf. Exemple:

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

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

Pour plusieurs pages, gspeut fusionner plusieurs fichiers pdf en un seul, mais img2pdfdonne une taille de fichier plus petite que gs. Les fichiers tiff doivent être décompressés en entrée dans img2pdf. Gardez à l'esprit que pour un grand nombre de pages, les fichiers bmp et tiff intermédiaires ont tendance à être de grande taille. pdftkou joinpdfserait mieux s'ils peuvent fusionner des fichiers pdf compressés à partir de convert.

J'imagine qu'il existe une solution plus élégante. Cependant, ma méthode produit des résultats avec une très bonne qualité d'image et une taille de fichier beaucoup plus petite. Pour récupérer le texte dans le pdf bw, réexécutez l'OCR.

Mon script shell utilise gs, convert et img2pdf. Modifiez les paramètres (nombre de pages, numérisation dpi, seuil%, etc.) répertoriés au début si nécessaire, puis exécutez chmod +x ./pdf2bw.sh. Voici le script complet (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

En fait, si cela provient d'une numérisation, la seule façon raisonnable est d'utiliser pdfimages et de convertir les graphiques sous-jacents. J'ai utilisé ce script pour le convertir:

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

Merci à OccamsRazor pour son script, qui fait un excellent travail de conversion des PDF en couleur et en niveaux de gris en une version monochrome compacte et lisible. C'est vraiment un commentaire sur le post d'OccamsRazor, mais je n'ai pas assez de points pour commenter.

Le script échouera img2pdf -o ./$output_pdf_name --dpi $dpi_res $input_files car il --dpin'est plus un argument accepté pour img2pdf. Au lieu de cela, il obtient la résolution du fichier d'entrée, vous pouvez donc simplement le laisser de côté.

Voici ma version du script. Je ne voulais pas modifier le script pour chaque fichier, donc je passe le nombre de pages et saisis le nom du fichier lorsque je l'exécute. Je l'ensemble du nom de sortie et jeu de résolution à 200 ppp, ce qui fonctionne pour mon flux de travail, mais vous voudrez peut - être changer, ou de les transformer en et et les passer.00input_name$3$4

Pour exécuter, l' utilisation , par exemple, ../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

Vous devez citer vos variables shell; en particulier ceux qui proviennent d'arguments ou d'autres entrées utilisateur: par exemple, "./$input_pdf_name"et même seq 1 "$num_pages". En outre, vous voudrez peut-être changer `…`pour $(…)- voir ceci , ceci et ceci .
G-Man dit `` Réintègre Monica '' le

Ceci est le script d'OccamsRazor à l'exception des changements que j'ai notés. Je ne suis pas un programmeur shell, donc je ne voulais pas jouer avec quelque chose qui fonctionnait. Mais si quelqu'un veut nettoyer ça, vous avez mes remerciements.
lowwall
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.