181 votes

Extraire une page d'un pdf en tant que jpeg

En code python, comment enregistrer efficacement une certaine page d'un pdf en tant que fichier jpeg ? (Cas d'utilisation : J'ai un serveur web python flask où les pdf seront téléchargés et où les jpeg correspondant à chaque page seront stockés).

Cette solution est proche, mais le problème est qu'il ne convertit pas la page entière en jpeg.

2 votes

Selon l'image, il peut être préférable d'extraire en png. C'est le cas si la page contient principalement du texte.

220voto

Keval Dave Points 967

La bibliothèque pdf2image peut être utilisée.

Vous pouvez l'installer simplement en utilisant,

pip install pdf2image

Une fois installé, vous pouvez utiliser le code suivant pour obtenir des images.

from pdf2image import convert_from_path
pages = convert_from_path('pdf_file', 500)

Enregistrement des pages au format jpeg

for page in pages:
    page.save('out.jpg', 'JPEG')

Editer : le repo Github pdf2image mentionne également qu'il utilise pdftoppm et qu'il nécessite d'autres installations :

pdftoppm est le logiciel qui fait la magie. Il est distribué dans le cadre d'un paquetage plus important appelé poppler . Les utilisateurs de Windows devront installer poppler pour Windows . Les utilisateurs de Mac devront installer poppler pour Mac . Les utilisateurs de Linux auront pdftoppm pré-installé avec la distribution (Testé sur Ubuntu et Archlinux) si ce n'est pas le cas, exécutez sudo apt install poppler-utils .

Vous pouvez installer la dernière version sous Windows en utilisant anaconda en faisant :

conda install -c conda-forge poppler

note : Les versions Windows jusqu'à 0.67 sont disponibles à l'adresse suivante http://blog.alivate.com.au/poppler-Windows/ mais notez que 0,68 était publié en août 2018 Vous ne bénéficierez donc pas des dernières fonctionnalités ni des corrections de bugs.

6 votes

Bonjour, le poppler est juste un fichier zippé, il n'installe rien, qu'est ce qu'on est supposé faire avec les dll ou les fichiers bin ?

0 votes

@gaurwraith : Utilisez les éléments suivants lien vers poppler . Pour une raison quelconque, le lien dans la description de Rodrigo n'est pas le même que dans le repo github.

0 votes

@Keval Dave Avez-vous installé poppler et essayé pdf2image sur une machine Windows ? Quel Windows s'il vous plaît ?

138voto

JJPty Points 21

J'ai trouvé cette solution simple, PyMuPDF La sortie est un fichier png. Notez que la bibliothèque est importée sous le nom de "fitz", un nom historique pour le moteur de rendu qu'elle utilise.

import fitz

pdffile = "infile.pdf"
doc = fitz.open(pdffile)
page = doc.loadPage(0)  # number of page
pix = page.getPixmap()
output = "outfile.png"
pix.writePNG(output)

2 votes

Veuillez ajouter une explication à votre réponse.

3 votes

Une bonne bibliothèque et elle s'installe sur Windows 10 sans problèmes (pas de roues requises). github.com/pymupdf

31 votes

C'est la MEILLEURE réponse. C'était le seul code qui ne nécessitait pas d'installation supplémentaire sur mon système d'exploitation. Les scripts Python doivent se concentrer sur le travail au sein du système Python. Je n'ai pas eu besoin d'installer poppler, pdftoppm, imageMagick ou ghostscript, etc. (Python 3.6)

30voto

Basj Points 776

La bibliothèque Python pdf2image (utilisé dans l'autre réponse) en fait ne fait pas bien plus qu'un simple lancement pdttoppm avec subprocess.Popen Voici donc une version courte qui le fait directement :

PDFTOPPMPATH = r"D:\Documents\software\____PORTABLE\poppler-0.51\bin\pdftoppm.exe"
PDFFILE = "SKM_28718052212190.pdf"

import subprocess
subprocess.Popen('"%s" -png "%s" out' % (PDFTOPPMPATH, PDFFILE))

Voici le lien d'installation Windows pour pdftoppm (contenu dans un paquet nommé poppler) : http://blog.alivate.com.au/poppler-Windows/

4 votes

Bonjour, le lien d'installation Windows pour pdftoppm est juste un tas de fichiers zippés, que devez-vous faire avec eux pour qu'ils fonctionnent ? Merci !

17voto

DevB2F Points 1537

Il n'est pas nécessaire d'installer Poppler sur votre système d'exploitation. Cela fonctionnera :

pip install Wand

from wand.image import Image

f = "somefile.pdf"
with(Image(filename=f, resolution=120)) as source: 
    for i, image in enumerate(source.sequence):
        newfilename = f[:-4] + str(i + 1) + '.jpeg'
        Image(image).save(filename=newfilename)

19 votes

Bibliothèque ImageMagick doit être installé pour fonctionner sur la baguette.

4 votes

J'ai essayé cela et j'ai dû installer Ghostscript également (j'utilise Windows 10 et Python 3.7). Je l'ai fait et ça a parfaitement fonctionné.

1 votes

À quoi sert le f[:-4] ? il n'est référencé nulle part ailleurs.

13voto

photek1944 Points 31

@gaurwraith, installez poppler pour Windows et utilisez pdftoppm.exe comme suit :

  1. Téléchargez le fichier zip avec les derniers binaires/dlls de Poppler à partir de http://blog.alivate.com.au/poppler-Windows/ et dézippez-la dans un nouveau dossier de votre dossier de fichiers de programmes. Par exemple : " C:\Program Fichiers (x86) \Poppler ".

  2. Ajouter " C:\Program Fichiers (x86) \Poppler\poppler -0.68.0 \bin "dans votre variable d'environnement SYSTEM PATH.

  3. Depuis la ligne cmd installer le module pdf2image -> "pip install pdf2image".

  4. Ou encore, exécutez directement pdftoppm.exe à partir de votre code en utilisant le module subprocess de Python comme l'explique l'utilisateur Basj.

@vishvAs vAsuki, ce code devrait générer les jpgs que vous souhaitez via le module subprocess pour toutes les pages d'un ou plusieurs pdfs dans un dossier donné :

import os, subprocess

pdf_dir = r"C:\yourPDFfolder"
os.chdir(pdf_dir)

pdftoppm_path = r"C:\Program Files (x86)\Poppler\poppler-0.68.0\bin\pdftoppm.exe"

for pdf_file in os.listdir(pdf_dir):

    if pdf_file.endswith(".pdf"):

        subprocess.Popen('"%s" -jpeg %s out' % (pdftoppm_path, pdf_file))

Ou en utilisant le module pdf2image :

import os
from pdf2image import convert_from_path

pdf_dir = r"C:\yourPDFfolder"
os.chdir(pdf_dir)

    for pdf_file in os.listdir(pdf_dir):

        if pdf_file.endswith(".pdf"):

            pages = convert_from_path(pdf_file, 300)
            pdf_file = pdf_file[:-4]

            for page in pages:

               page.save("%s-page%d.jpg" % (pdf_file,pages.index(page)), "JPEG")

0 votes

Cela m'a beaucoup aidé. Merci !

2 votes

Cela devrait en fait être la réponse acceptée. Indique ce qu'il faut faire avec les binaires installés pour Poppler

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X