web-dev-qa-db-fra.com

Conversion d'un PDF en PNG

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?

73
Adam

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 .

  1. Heureusement, gs peut écrire sur stdout (... -o %stdout ...).
  2. Heureusement, convert peut lire depuis stdin (convert -background transparent - output.png).

Problème résolu:

  • GS utilisé pour le canal alpha manipulant une image spéciale,
  • convertir utilisé pour créer un fond transparent,
  • tube 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

Mise à jour

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
63
Kurt Pfeifle

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."
26
Glutanimate

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:

  • sDEVICE = {jpeg, pngalpha, png16m ...} - type de fichier
  • -o - fichier de sortie (% stdout à stdout)
  • -dTextAlphaBits = 4 - anticrénelage des polices.
  • -r300 - 300 dpi
13
yanpas

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
9
turdus-merula

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.

3
Raffael

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.

2
polemon

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.

2
schnaader

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
2
aorth

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)

1
TheStoryCoder

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
1
polarise

Essayez d'extraire une seule page.

$ page = 4

gs -sDEVICE=pngalpha -dFirstPage="$page" -dLastPage="$page" -o thumb.png -r144 input.pdf
0
Ezequiel Fernandez

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
0
fmw42