Conversion D'un PDF en PNG
J'essaie de convertir un PDF en Image PNG (au moins la couverture d'un). J'extrait avec succès la première page du PDF avec pdftk. J'utilise imagemagick pour faire la conversion:
convert cover.pdf cover.png
Cela fonctionne, mais malheureusement la couverture.png est mal Rendu (une partie de l'objet alpha dans le PDF ne sont pas rendus correctement). Je sais Qu'ImageMagick utilise GhostScript pour faire la conversion et si je le fais directement avec gs, je peux obtenir les résultats souhaités, mais je préfère utiliser le convertir la bibliothèque car elle a d'autres outils que je voudrais exploiter.
Cette commande dans GhostScript accomplit l'image désirée:
gs -sDEVICE=pngalpha -sOutputFile=cover.png -r144 cover.pdf
Je me demande s'il existe un moyen de passer des arguments à travers convert to GhostScript ou suis-je bloqué avec L'appel de GhostScript directement?
9 réponses
Vous pouvez utiliser une ligne de commande avec deux commandes (gs
, convert
) connecté via un tuyau, si la première commande peut écrire sa sortie sur stdout, et si la seconde peut lire son entrée à partir de stdin.
- heureusement, gs peut écrire dans 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 transparent contexte,
- tuyau utilisé 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 voulez avoir un PNG séparé par page PDF, vous pouvez utiliser la syntaxe %d
:
gs -sDEVICE=pngalpha -o file-%03d.png -r144 cover.pdf
Cela va créer des fichiers PNG nommés page-000.png
, page-001.png
, ... (Notez que le %d
comptage est basé sur zéro -- file-000.png
correspond à la page 1 du PDF, 001
à la page 2...
Ou, si vous voulez garder 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é Inkscape pour produire les résultats les plus précis lors de la conversion de fichiers PDF en PNG. En particulier 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 des fichiers pdf en fichiers 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 à ajouter au nom de %03d gs -o a%03d.jpg a.pdf
Ce que chaque option signifie:
- sDEVICE = {jpeg, pngalpha, png16m...} - type de fichier
- -o - fichier de sortie (%stdout vers stdout)
- - dTextAlphaBits = 4-anticrénelage des polices.
- - r300 - 300 dpi
On peut aussi utiliser les utilitaires de ligne de commande inclus dans poppler-utils
package:
sudo apt-get install poppler-utils
pdftoppm --help
pdftocairo --help
Exemple:
pdftocairo -png mypage.pdf mypage.png
Voici une Discussion allemande 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 pour vous aussi.
Je vais ajouter ma solution, même pensé que 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, de sorte que 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 beaux graphismes sur fond transparent, coupé à ce qui est réellement sur page. Les paramètres -density
et -resize
donnent une meilleure granularité et augmentent la résolution globale.
Je suggère de vérifier si la densité peut être diminuée pour vous. Ça va réduire le temps de conversion.
N'a pas pu faire fonctionner la réponse acceptée. Ensuite, j'ai découvert que la solution est beaucoup plus simple de toute façon car Ghostscript ne supporte pas seulement nativement PNG 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 sauvera la page 2 du test.pdf à tester.png en utilisant le codage pnggray
et 500 DPI.
Pour un PDF que 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
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 cours sur mon file.pdf
:
me@home: my.folder$ convert -density 300 -quality 100 file.pdf file.png