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?

Était-ce utile?

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.

  1. Heureusement, gs peut écrire sur stdout ( ... -o% stdout ... ).
  2. 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:

xelatex test.tex

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:

gm convert -trim -transparent white -background transparent -density 1200x1200 -resize 25% test.pdf test.png

Cela donne de jolis graphismes sur un fond transparent, ajustés à ce qui est réellement sur la 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. Cela réduira le temps de conversion.

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top