Conversion d’un PDF en PNG

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 faire la conversion:

convert cover.pdf cover.png 

Cela fonctionne, mais malheureusement, cover.png est mal rendu (une partie de l’object alpha du PDF n’est pas correctement rendue). 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 la bibliothèque de conversion car elle a d’autres outils que je voudrais exploiter.

Cette commande dans GhostScript réalise l’image souhaitée:

 gs -sDEVICE=pngalpha -sOutputFile=cover.png -r144 cover.pdf 

Je me demande s’il existe un moyen de transmettre des arguments via la conversion en GhostScript ou est-ce que je suis coincé avec l’appel direct de GhostScript?

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 sur 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 à partir de stdin ( convert -background transparent - output.png ).

Problème résolu:

  • GS utilisé pour le traitement des canaux alpha avec une image spéciale,
  • convertir utilisé pour créer un fond transparent,
  • pipe 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 souhaitez avoir un fichier PNG distinct par page PDF, vous pouvez utiliser la syntaxe %d :

 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 %d -counting est basé sur zéro – file-000.png correspond à la page 1 du PDF, 001 à page 2…

Ou, si vous souhaitez conserver votre arrière-plan 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 fichiers PDF au format PNG. Surtout quand 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, ajoutez-y % 03d gs -oa%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 police.
  • -r300 – 300 dpi

On peut également utiliser les utilitaires de ligne de commande inclus dans le poppler-utils :

 sudo apt-get install poppler-utils pdftoppm --help pdftocairo --help 

Exemple:

 pdftocairo -png mypage.pdf mypage.png 

Voici une 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 pour vous aussi.

Je vais append 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 parsingnt les parameters 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 -sortingm -transparent white -background transparent -density 1200x1200 -resize 25% test.pdf test.png 

Il donne de jolis graphismes sur fond transparent, rognés à ce qui est réellement sur la page. Les parameters de -density et de -resize permettent une meilleure granularité et augmentent la résolution globale.

Je suggère de vérifier si la densité peut être réduite pour vous. Cela réduira le temps de conversion.

Impossible d’obtenir la réponse acceptée au travail. Ensuite, nous avons découvert que la solution était en réalité beaucoup plus simple, Ghostscript ne supportant pas seulement nativement le format PNG, mais aussi plusieurs “encodages” différents :

  • 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 

Il sauvera la page 2 de test.pdf à test.png en utilisant l’encodage pnggray et 500 DPI.

Pour un PDF que ImageMagick donnait des couleurs inexactes, j’ai trouvé que GraphicsMagick avait fait un meilleur 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 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 fais sur mon file.pdf :

 me@home: my.folder$ convert -density 300 -quality 100 file.pdf file.png