it-swarm.com.de

Python: Extrahieren Sie eine Seite aus einem pdf als JPEG

Wie kann man im Python-Code eine bestimmte Seite in einer PDF-Datei effizient als JPEG-Datei speichern? (Anwendungsfall: Ich habe einen Python-Flaschen-Webserver, auf dem die PDF-Dateien hochgeladen werden und die entsprechenden JPEG-Seiten gespeichert werden.)

Diese Lösung ist nahe, aber das Problem ist, dass nicht die gesamte Seite in JPEG konvertiert wird.

20
vishvAs vAsuki

Die pdf2image-Bibliothek kann verwendet werden.

Sie können es einfach installieren, indem Sie 

pip install pdf2image

Nach der Installation können Sie folgenden Code verwenden, um Bilder abzurufen.

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

Speichern von Seiten im JPEG-Format

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

Edit: Das Github-Repo pdf2image erwähnt auch, dass es pdftoppm verwendet und dass es andere Installationen erfordert:

pdftoppm ist die Software, die die eigentliche Magie ausübt. Es wird als Teil eines größeren Pakets mit dem Namen poppler ..__ verteilt. Windows-Benutzer müssen poppler für Windows ..__ installieren. Mac - Benutzer müssen poppler für Mac ..__ installieren. Linux-Benutzer haben pdftoppm mit der Distribution vorinstalliert (Tested on Ubuntu und Archlinux), falls dies nicht der Fall ist, führen Sie Sudo apt install poppler-utils aus.

Hier ist die richtige Installation für Windows: http://blog.alivate.com.au/poppler-windows/

36
Keval Dave

Die Python-Bibliothek pdf2image (die in der anderen Antwort verwendet wird) führt in der Tat nicht viel mehr als nur das Startenpdttoppm mit subprocess.Popen aus. Hier ist eine kurze Version, die das direkt macht:

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

Hier ist der Windows-Installationslink für pdftoppm (in einem Paket namens poppler enthalten): http://blog.alivate.com.au/poppler-windows/

8
Basj

Ich fand diese einfache Lösung, PyMuPDF, als Ausgabe in eine PNG-Datei

    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
JJPty

@gaurwraith, install poppler für Windows und verwende pdftoppm.exe wie folgt:

  1. Laden Sie die ZIP-Datei mit den neuesten Binärdateien/dlls von Poppler von http://blog.alivate.com.au/poppler-windows/ - herunter und entpacken Sie sie in einen neuen Ordner in Ihrem Programmordner. Zum Beispiel: "C:\Programme (x86)\Poppler".

  2. Fügen Sie der Umgebungsvariable SYSTEM PATH "C:\Programme (x86)\Poppler\poppler-0.68.0\bin" hinzu.

  3. Von cmd line installieren Sie das Modul pdf2image -> "pip install pdf2image".

  4. Alternativ können Sie pdftoppm.exe auch direkt mit Hilfe des Python-Subprozess-Moduls aus Ihrem Code ausführen, wie von Benutzer Basj erläutert.

@vishvAs vAsuki, dieser Code sollte die gewünschten JPGs über das Unterprozessmodul für alle Seiten eines oder mehrerer PDF-Dateien in einem bestimmten Ordner generieren:

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))

Oder mit dem pdf2image-Modul:

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

Sie müssen Poppler nicht auf Ihrem Betriebssystem installieren. Das wird funktionieren:

pip installiere Wand

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

Ich benutze eine (vielleicht) viel einfachere Option von pdf2image:

cd $dir
for f in *.pdf
do
  if [ -f "${f}" ]; then
    n=$(echo "$f" | cut -f1 -d'.')
    pdftoppm -scale-to 1440 -png $f $conv/$n
    rm $f
    mv  $conv/*.png $dir
  fi
done

Dies ist ein kleiner Teil eines Bash-Skripts in einer Schleife für die Verwendung eines Narrow Casting-Geräts. Überprüft alle 5 Sekunden alle hinzugefügten PDF-Dateien und verarbeitet sie. Dies ist für ein Demo-Gerät, am Ende wird die Konvertierung auf einem Remote-Server durchgeführt. Die Konvertierung in .PNG ist jetzt möglich, aber auch .JPG.

Diese Konvertierung, zusammen mit Übergängen im A4-Format, die ein Video, zwei flüssige Lauftexte und ein Logo (mit Übergang in drei Versionen) anzeigt, setzt den Pi3 auf fast 4x 100% CPU-Auslastung ;-)

0
Robert

Es handelt sich um ein Hilfsprogramm namens pdftojpg, mit dem das PDF in das IMG-Format konvertiert werden kann

Den Code finden Sie hier https://github.com/pankajr141/pdf2jpg

from pdf2jpg import pdf2jpg
inputpath = r"D:\inputdir\pdf1.pdf"
outputpath = r"D:\outputdir"
# To convert single page
result = pdf2jpg.convert_pdf2jpg(inputpath, outputpath, pages="1")
print(result)

# To convert multiple pages
result = pdf2jpg.convert_pdf2jpg(inputpath, outputpath, pages="1,0,3")
print(result)

# to convert all pages
result = pdf2jpg.convert_pdf2jpg(inputpath, outputpath, pages="ALL")
print(result)
0
duck