J'essaie de convertir un PDF en une image PNG (au moins la couverture de l'un). Je réussis à extraire 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 cover.png apparaît de manière incorrecte (certains des objets alpha dans le PDF ne sont pas rendus correctement). Je sais que ImageMagick utilise GhostScript pour faire la conversion et si je faites-le directement avec gs Je peux obtenir les résultats souhaités, mais je préfère utiliser la bibliothèque de conversion car elle a d'autres outils que j'aimerais 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 via convert en GhostScript ou suis-je coincé avec l'appel de GhostScript directement?
Vous pouvez utiliser une ligne de commande avec deux commandes (gs
, convert
) connectées via un tube, si la première commande peut écrire sa sortie dans stdout, et si la seconde peut lire son entrée depuis stdin .
... -o %stdout ...
).convert -background transparent - output.png
).Problème résolu:
Solution complète:
gs -sDEVICE=pngalpha \
-o %stdout \
-r144 cover.pdf \
| \
convert \
-background transparent \
- \
cover.png
Si vous voulez avoir un PNG séparé par PDF, vous pouvez utiliser la %d
syntaxe:
gs -sDEVICE=pngalpha -o file-%03d.png -r144 cover.pdf
Cela créera des fichiers PNG nommés page-000.png
, page-001.png
, ... (Notez que le %d
- le comptage est basé sur zéro - file-000.png
correspond à la page 1 du PDF, 001
à la page 2 ...
Ou, si vous voulez conserver votre fond transparent, pour un PDF de 100 pages, faites
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
Parmi toutes les alternatives disponibles, j'ai trouvé qu'Inkscape produisait les résultats les plus précis 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é.
Voici 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 des fichiers PDF en fichiers image, utilisez les commandes suivantes:
Pour PNGgs -sDEVICE=png16m -dTextAlphaBits=4 -r300 -o a.png a.pdf
Pour JPGgs -sDEVICE=jpeg -dTextAlphaBits=4 -r300 -o a.jpg a.pdf
Si vous avez plusieurs pages à ajouter au nom % 03dgs -o a%03d.jpg a.pdf
Signification de chaque option:
On peut également utiliser les utilitaires de ligne de commande inclus dans poppler-utils
paquet:
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. J'ai ensuite découvert qu'en fait la solution est de toute façon beaucoup plus simple car Ghostscript supporte non seulement PNG nativement mais même plusieurs "encodages" différents :
png256
png16
pnggray
pngmono
La commande Shell qui fonctionne pour moi est:
gs -dNOPAUSE -q -sDEVICE=pnggray -r500 -dBATCH -dFirstPage=2 -dLastPage=2 -sOutputFile=test.png test.pdf
Il enregistrera la page 2 de test.pdf dans test.png en utilisant l'encodage pnggray
et 500 DPI.
J'ajouterai ma solution, même si son fil est vieux. Peut-être que cela aidera quelqu'un de toute façon.
Tout d'abord, je dois générer le PDF. J'utilise XeLaTeX pour cela:
xelatex test.tex
Maintenant, ImageMagick et GraphicMagic les deux paramètres d'analyse de gauche à droite, donc le paramètre le plus à gauche, sera exécuté en premier. J'ai fini par utiliser cette séquence pour un traitement optimal:
gm convert -trim -transparent white -background transparent -density 1200x1200 -resize 25% test.pdf test.png
Il donne de jolis graphismes sur fond transparent, ajustés à ce qui est réellement sur la page. Le -density
et -resize
paramètres, donne une meilleure granularité et augmente la résolution globale.
Je suggère de vérifier si la densité peut être diminuée pour vous. Cela réduira le temps de conversion.
Voici un discussion en allemand sur un problème comme celui-ci pour les fichiers SVG où il est résolu en utilisant
convert -background transparent
Peut-être que cela fonctionne aussi pour vous.
Pour un PDF qu'ImageMagick donnait des couleurs inexactes, j'ai trouvé que GraphicsMagick faisait un meilleur travail:
$ gm convert -quality 100 -thumbnail x300 -flatten journal.pdf\[0\] cover.jpg
Comme cette page répertorie également des outils alternatifs, je mentionnerai xpdf qui a des outils de ligne de commande prêts à être compilés pour Linux/Windows/Mac . Prend en charge la transparence. Est gratuit pour une utilisation commerciale - contrairement à Ghostscript qui a vraiment scandaleux prix.
Dans un test sur un énorme fichier PDF, il était 7,5% plus rapide que Ghostscript.
(Il a également PDF en convertisseurs de texte et HTML)
Ma solution est beaucoup plus simple et plus directe. Au moins, cela fonctionne de cette façon 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 file.pdf
:
me@home: my.folder$ convert -density 300 -quality 100 file.pdf file.png
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. Faites simplement
convert -density 288 cover.pdf[0] -resize 25% cover.png
Ici, j'augmente la densité nominale de 400% (72 * 4 = 288), puis je redimensionne de 1/4 (25%). Cela donne une bien meilleure qualité pour le png résultant.
Cependant, si le PDF est CMJN, PNG ne le prend pas en charge. Il devrait être converti en sRGB, surtout s'il a de la transparence, car Ghostscript ne peut pas gérer CMJN avec alpha.
convert -density 288 -colorspace sRGB -resize 25% cover.pdf[0] cover.png