web-dev-qa-db-fra.com

Python: Extraire une page d'un pdf au format jpeg

En code python, comment enregistrer efficacement une certaine page d'un fichier PDF au format jpeg? (Cas d'utilisation: j'ai un serveur Web en flacon python où pdf-s sera chargé et jpeg correspondant à chaque page est stocké.)

Cette solution est proche, mais le problème est qu'elle ne convertit pas l'intégralité de la page au format jpeg.

20
vishvAs vAsuki

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 de pages au format JPEG

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

Edit: 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 paquet plus important appelé poppler . Les utilisateurs Windows devront installer poppler pour Windows . Les utilisateurs de Mac devront installer poppler pour Mac . Les utilisateurs de Linux auront préinstallé pdftoppm avec la distribution (testée sur Ubuntu et Archlinux) si ce n’est pas le cas, exécutez Sudo apt install poppler-utils.

Voici la bonne installation pour Windows: http://blog.alivate.com.au/poppler-windows/

36
Keval Dave

La bibliothèque Python pdf2image (utilisée dans l'autre réponse) ne fait en réalité pas beaucoup plus que de lancerpdttoppm avec subprocess.Popen, voici donc une version courte le faisant 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)) #have updated the values here

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

8
Basj

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

  1. Téléchargez le fichier Zip contenant les derniers fichiers binaires/dll de Poppler à partir de http://blog.alivate.com.au/poppler-windows/ et décompressez-le dans un nouveau dossier situé dans le dossier des fichiers de votre programme. Par exemple: "C:\Program Files (x86)\Poppler".

  2. Ajoutez "C:\Program Files (x86)\Poppler\poppler-0.68.0\bin" à votre variable d'environnement SYSTEM PATH.

  3. Depuis le programme cmd line, installez le module pdf2image -> "pip install pdf2image".

  4. Ou bien, exécutez directement pdftoppm.exe à partir de votre code en utilisant le module de sous-processus de Python, comme expliqué par l'utilisateur Basj.

@vishvAs vAsuki, ce code devrait générer les fichiers jpgs de votre choix via le module de sous-processus pour toutes les pages d'un ou plusieurs pdfs d'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")
1
photek1944

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

pip installer la baguette

from wand.image import Image

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