web-dev-qa-db-fra.com

pdf en jpg sans perte de qualité; gscan2pdf

Quand je convertis un fichier pdf en tas de fichiers jpg en utilisant

convert -quality 100 file.pdf page_%04d.jpg

J'ai une perte de qualité appréciable.

Cependant, si je fais ce qui suit, il n'y a pas de perte de qualité (notable):

Démarrez gscan2pdf, choisissez fichier-> importer (et choisissez fichier.pdf). Accédez ensuite au répertoire temporaire de gscan2pdf. Il existe de nombreux fichiers pnm (un pour chaque page du fichier pdf). Maintenant oui

  for file in *.pnm; do            
  convert $file $file.jpg done

Les fichiers jpg résultants sont (à peu près) de la même qualité que le pdf d'origine (ce que je veux).

Maintenant, ma question est, s'il existe un moyen simple de ligne de commande pour convertir le fichier pdf en un tas de fichiers jpg sans perte de qualité notable? (La solution ci-dessus est trop compliquée et prend trop de temps).

56
student

Ce que vous entendez par "perte de qualité" n'est pas clair. Cela pourrait signifier beaucoup de choses différentes. Pourriez-vous poster quelques exemples pour illustrer? Peut-être couper la même section des versions de mauvaise qualité et de bonne qualité (en tant que PNG pour éviter d'autres pertes de qualité).

Vous devrez peut-être utiliser -density Pour effectuer la conversion à un dpi plus élevé:

convert -density 300 file.pdf page_%04d.jpg

(Vous pouvez ajouter au préalable -units PixelsPerInch Ou -units PixelsPerCentimeter Si nécessaire. Ma copie par défaut est ppi.)

Mise à jour: Comme vous l'avez souligné, gscan2pdf (La façon dont vous l'utilisez) n'est qu'un wrapper pour pdfimages (de poppler ). pdfimages ne fait pas la même chose que convert quand on lui donne un PDF en entrée.

convert prend le PDF, le rend à une certaine résolution et utilise le bitmap résultant comme image source.

pdfimages recherche dans le PDF les images bitmap incorporées et exporte chacune dans un fichier. Il ignore simplement les commandes de texte ou de dessin vectoriel dans le PDF.

Par conséquent, si ce que vous avez est un PDF qui est juste un wrapper autour d'une série de bitmaps, pdfimages fera un bien meilleur travail de les extraire, car il vous obtient les données brutes à son format original. Vous souhaiterez probablement également utiliser l'option -j Pour pdfimages, car un PDF peut contenir des données JPEG brutes. Par défaut, pdfimages convertit tout au format PNM, et la conversion JPEG> PPM> JPEG est un processus avec perte.

Alors, essayez

pdfimages -j file.pdf page

Vous pouvez ou non avoir besoin de suivre cela avec une étape convert à .jpg (Selon le format bitmap que le PDF utilisait).

J'ai essayé cette commande sur un PDF que j'avais fait moi-même à partir d'une séquence d'images JPEG. Les JPEG extraits étaient identiques octet par octet aux images source. Vous ne pouvez pas obtenir une qualité supérieure à cela.

101
cjm

Comme l'a dit la réponse de l'élève, pdfimages est une bonne option. D'après mon expérience, gs et convert exportent vers une qualité médiocre, peu importe si vous spécifiez le bon dpi.

Mais si le pdf a plusieurs couches par page pdfimages ne fonctionne pas et extrait les couches en tant qu'image distincte, dans ce cas, il vaut mieux utiliser inskcape pour exporter la page comme on le voit.

Ce sont les commandes que j'utilise:

pdftk combined_to_do.pdf burst output pg_%04d.pdf
ls ./pg*.pdf | xargs -L1 -I {}  inkscape {} -z --export-dpi=300 --export-area-drawing --export-png={}.png

La première commande divise toutes les pages La deuxième commande convertit page par page en png. Vous pouvez les garder en png ou simplement les convertir en jpeg

ls ./p*.png | xargs -L1 -I {} convert {}  -quality 100 -density 300 {}.jpg

Par rapport à pdfimages, gs et à convert d'ImageMagick, je trouve que l'exportation de inkscape est de la meilleure qualité.

4
Eduard Florinescu

la réponse de @cjm est correcte, mais si vous aimez l'interface graphique et que vous ne voulez pas afficher toutes les pages pdf, juste pour obtenir une image, utilisez gimp.

Ouvrez un pdf avec gimp et vous obtiendrez une fenêtre d'importation avec toutes les pages rendues. Choisissez les pages que vous voulez et réglez la résolution à 600 pixels/pouce (j'ai trouvé 300 trop de netteté dans de nombreux cas). Enregistrez au format souhaité avec "Fichier/exportation"

Quoi qu'il en soit, il doit y avoir un indicateur pour sélectionner les pages souhaitées à partir de la ligne de commande.

3
albfan

En regardant le code source de gscan2pdf, j'ai remarqué qu'il utilise pdfimages. Donc pdfimages file.pdf page entraînerait page-001.ppm, page-002.ppm etc.

2
student

Ce qui n'est pas clair dans votre question est de savoir si vous parlez de texte et de graphiques vectoriels dans votre pdf, ou si votre pdf contient des images incorporées.

Après avoir lu de quoi parle gscan2pdf, je suppose que vos fichiers pdf contiennent (uniquement) des graphiques intégrés.

convert "imprime" essentiellement votre pdf sans tenir compte de son contenu. Comme le suggère @cjm, vous souhaiterez peut-être modifier la densité d'impression. C'est le seul moyen d'augmenter la qualité des graphiques vectoriels.

Si au lieu de cela, vous voulez extraire des images intégrées (un peu comme gscan2pdf semble le faire), deviner la densité entraînera généralement une perte de qualité ou une qualité supérieure à celle requise (et un gaspillage d'espace disque). La réponse est alors d'extraire l'image plutôt que d'imprimer le pdf. Voir cet article qui préconise essentiellement l'utilisation de pdfimages pour extraire des images sans perte de qualité.

2
asoundmove