Conversion d'un PDF en PNG
-
19-08-2019 - |
Question
J'essaie de convertir un fichier PDF en image PNG (au moins la couverture d'une image). J'extrais avec succès la première page du PDF avec pdftk. J'utilise imagemagick pour effectuer la conversion:
convert cover.pdf cover.png
Cela fonctionne, mais malheureusement, le fichier cover.png est mal rendu (certains objets alpha du PDF ne sont pas restitués correctement). Je sais que ImageMagick utilise GhostScript pour effectuer la conversion et si je le fais directement avec gs, je peux obtenir les résultats souhaités, mais je préférerais utiliser la bibliothèque de conversion car elle contient d’autres outils que je souhaiterais utiliser.
Cette commande dans GhostScript accomplit l'image souhaitée:
gs -sDEVICE=pngalpha -sOutputFile=cover.png -r144 cover.pdf
Je me demande s'il existe un moyen de passer des arguments par le biais de la conversion en GhostScript ou si je suis obligé d'appeler directement GhostScript?
La solution
Vous pouvez utiliser une ligne de commande avec deux commandes ( gs
, convert
) connectées via un canal, si la première commande peut écrire sa sortie sur stdout et si la seconde on peut lire son entrée dans stdin.
- Heureusement, gs peut écrire sur stdout (
... -o% stdout ...
). - Heureusement, convert peut lire à partir de stdin (
convert -background transparent - output.png
).
Problème résolu:
- GS utilisé pour le canal alpha traitant une image spéciale,
- convert utilisé pour créer un fond transparent,
- pipe utilisée pour éviter d'écrire un fichier temporaire sur le disque.
Solution complète:
gs -sDEVICE=pngalpha \
-o %stdout \
-r144 cover.pdf \
| \
convert \
-background transparent \
- \
cover.png
Mettre à jour
Si vous souhaitez avoir une page PNG distincte par PDF, vous pouvez utiliser la syntaxe % d
:
gs -sDEVICE=pngalpha -o file-%03d.png -r144 cover.pdf
Ceci créera des fichiers PNG nommés page-000.png
, page-001.png
, ... (notez que le % d
-counting est basé sur zéro - fichier-000.png
correspond à la page 1 du document PDF, 001
à la page 2 ...
Ou, si vous souhaitez conserver votre arrière-plan transparent, pour un PDF de 100 pages, effectuez
for i in {1..100}; do \
\
gs -sDEVICE=pngalpha \
-dFirstPage="${i}" \
-dLastPage="${i}" \
-o %stdout \
-r144 input.pdf \
| \
convert \
-background transparent \
- \
page-${i}.png ; \
\
done
Autres conseils
Parmi toutes les alternatives disponibles, j'ai trouvé qu'Inkscape produisait les résultats les plus précis possibles lors de la conversion de PDF en PNG. Surtout lorsque le fichier source avait des couches transparentes, Inkscape a réussi là où Imagemagick et d'autres outils ont échoué.
C’est la commande que j’utilise:
inkscape "$pdf" -z --export-dpi=600 --export-area-drawing --export-png="$pngfile"
Et ici, il est implémenté dans un script:
#!/bin/bash
while [ $# -gt 0 ]; do
pdf=$1
echo "Converting "$pdf" ..."
pngfile=`echo "$pdf" | sed 's/\.\w*$/.png/'`
inkscape "$pdf" -z --export-dpi=600 --export-area-drawing --export-png="$pngfile"
echo "Converted to "$pngfile""
shift
done
echo "All jobs done. Exiting."
Pour convertir un fichier PDF en fichier image, utilisez les commandes suivantes:
Pour PNG gs -sDEVICE = png16m -dTextAlphaBits = 4 -r300 -o a.png a.pdf
Pour JPG gs -sDEVICE = jpeg -dTextAlphaBits = 4 -r300 -o a.jpg a.pdf
Si vous avez plusieurs pages, ajoutez-les au nom % 03d gs -o a% 03d.jpg a.pdf
Que signifie chaque option:
- sDEVICE = {jpeg, pngalpha, png16m ...} - type de fichier
- -o - fichier de sortie (% stdout à stdout)
- -dTextAlphaBits = 4 - antialiasing de la police.
- -r300 - 300 dpi
On peut également utiliser les utilitaires de ligne de commande inclus dans le package poppler-utils
:
sudo apt-get install poppler-utils
pdftoppm --help
pdftocairo --help
Exemple:
pdftocairo -png mypage.pdf mypage.png
Impossible d'obtenir la réponse acceptée au travail. Nous avons ensuite découvert que la solution était de toute façon beaucoup plus simple, car Ghostscript ne prend pas uniquement en charge le format PNG de manière native, mais même plusieurs. différents " encodages & ; :
-
png256
-
png16
-
pnggray
-
pngmono
- ...
La commande shell qui fonctionne pour moi est la suivante:
gs -dNOPAUSE -q -sDEVICE=pnggray -r500 -dBATCH -dFirstPage=2 -dLastPage=2 -sOutputFile=test.png test.pdf
Cela sauvegardera la page 2 de test.pdf dans test.png en utilisant le codage pnggray
et 500 DPI.
Voici un
Je vais ajouter ma solution, même si son fil est vieux. Peut-être que cela aidera quand même quelqu'un. Tout d'abord, je dois générer le fichier PDF. J'utilise XeLaTeX pour cela: Maintenant, ImageMagick et GraphicMagic les paramètres d'analyse de gauche à droite, le paramètre le plus à gauche sera donc exécuté en premier. J'ai fini par utiliser cette séquence pour un traitement optimal: Cela donne de jolis graphismes sur un fond transparent, ajustés à ce qui est réellement sur la page. Les paramètres Je suggère de vérifier si la densité peut être diminuée pour vous. Cela réduira le temps de conversion. xelatex test.tex
gm convert -trim -transparent white -background transparent -density 1200x1200 -resize 25% test.pdf test.png
-density
et -resize
donnent une meilleure granularité et augmentent la résolution globale.
Pour un fichier PDF qu'ImageMagick donnait avec des couleurs inexactes, j'ai constaté que GraphicsMagick faisait mieux son travail:
$ gm convert -quality 100 -thumbnail x300 -flatten journal.pdf\[0\] cover.jpg
Ma solution est beaucoup plus simple et directe. Au moins, cela fonctionne de la sorte sur mon PC (avec les spécifications suivantes):
me@home: my.folder$ uname -a
Linux home 3.2.0-54-generic-pae #82-Ubuntu SMP Tue Sep 10 20:29:22 UTC 2013 i686 i686 i386 GNU/Linux
avec
me@home: my.folder$ convert --version
Version: ImageMagick 6.6.9-7 2012-08-17 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2011 ImageMagick Studio LLC
Features: OpenMP
Alors, voici ce que je lance sur mon fichier.pdf
:
me@home: my.folder$ convert -density 300 -quality 100 file.pdf file.png
Comme cette page répertorie également des outils alternatifs, je mentionnerai xpdf . a des outils de ligne de commande prêts à être compilés pour Linux / Windows / Mac. Prend en charge la transparence. Est gratuit pour un usage commercial - contrairement à Ghostscript qui propose des prix vraiment scandaleux .
Lors d'un test sur un fichier PDF volumineux, il était 7,5% plus rapide que Ghostscript.
(Il a aussi des convertisseurs PDF en texte et HTML)
Essayez d’extraire une seule page.
$ page = 4
gs -sDEVICE=pngalpha -dFirstPage="$page" -dLastPage="$page" -o thumb.png -r144 input.pdf
Vous pouvez utiliser ImageMagick sans séparer la première page du PDF avec d'autres outils. Il suffit de faire
convert -density 288 cover.pdf[0] -resize 25% cover.png
Ici, j'augmente la densité nominale de 400% (72 * 4 = 288) puis redimensionne de 1/4 (25%). Cela donne une bien meilleure qualité pour le png résultant.
Toutefois, si le fichier PDF est CMJN, PNG ne le prend pas en charge. Il devra être converti au format sRVB, en particulier s'il est transparent, car Ghostscript ne peut pas gérer les CMJN avec alpha.
convert -density 288 -colorspace sRGB -resize 25% cover.pdf[0] cover.png