Ich habe GhostScript mit Python ausgeführt, das PDF in Seiten aufgeteilt und es in ein JPEG-Bild konvertiert.

Einführung

Hallo! Ich hatte die Möglichkeit, GhostScript mit Python zu verwenden, daher möchte ich diesmal die daraus gewonnenen Erkenntnisse zusammenfassen. Insbesondere wird GhostScript verwendet, um PDF in ein JPEG-Bild zu konvertieren (PDF⇒JPEG-Konvertierung). Die PDF-zu-JPEG-Konvertierung, die wir in diesem Artikel durchführen, lautet "nicht nur einseitiges PDF, sondern auch mehrseitiges PDF wird in eine Seite zerlegt und als JPEG-Bild gespeichert."

Warum GhostScript?

GhostScript ist ein Interpreter für die PostScript-Sprache und PDF, wie Sie auf der offiziellen Website sehen können.

Zitiert von der offiziellen Website

An interpreter for the PostScript language and for PDF.

Wenn ich Google Teacher frage, was ich in diesem Artikel tun möchte, denke ich, dass pdf2image und PyPDF2 gängige Lösungen sind, aber der Grund, warum ich GhostScript verwendet habe, ist einfach.

Weil es ein PDF gab, das nicht mit PyPDF2 und mit GhostScript lol konvertiert werden konnte

Darüber hinaus bezieht sich der Betrieb von GhostScript auf diese Site. (Diese Seite verwendet insbesondere kein Python.) http://michigawi.blogspot.com/2011/12/ghostscriptpdfjpg.html

Entwicklungsumgebung

Windows10 python3.6.9 GhostScript 9.50

Vorbereitung (GhostScript herunterladen)

Laden Sie dieses Mal GhostScript von den folgenden herunter. https://www.ghostscript.com/

Bitte laden Sie je nach Entwicklungsumgebung herunter. In diesem Artikel wird AGPL für Windows (64 Bit) ausgewählt.

ghostscript_download.png

Führen Sie die heruntergeladene Datei zum Einrichten aus.

Setup-Bildschirm

ghostscript_setup_1.png ghostscript_setup_2.png ghostscript_setup_3.png ghostscript_setup_4.png

Was Sie tun möchten ①: Teilen Sie die PDF-Seite

Wie in "Einführung" erläutert, ist dies ein Vorgang, der für ein PDF mit mehreren Seiten erforderlich ist, und für ein PDF mit ursprünglich einer Seite nicht erforderlich. Da es lange dauern wird, habe ich nur die Teile aufgenommen, die sich auf die Division beziehen. Wenn Sie keine Zeit haben, überprüfen Sie bitte den gesamten Quellcode in den folgenden Kapiteln.

Erstellen Sie als Voraussetzung einen "Eingabe" -Ordner im selben Verzeichnis wie der Quellcode und platzieren Sie die PDF-Datei, die das Eingabebild sein soll, dort. Ein Verzeichnis mit dem Namen "output_tmp" wird automatisch erstellt und die paginierte PDF-Datei wird gespeichert.


if __name__ == "__main__":

    
    #Holen Sie sich das aktuelle Verzeichnis
    current_dir = os.getcwd()
    #Eingabeverzeichnis abrufen
    indir = current_dir + "\\input\\"
    indir_error = current_dir + "\\input_error\\"
    
    #Ausgabeverzeichnis abrufen
    outdir = current_dir + "\\output\\"
    outdir_tmp = current_dir + "\\output_tmp\\"
    
    #Erstellen, wenn kein Ausgabeordner vorhanden ist
    if os.path.isdir(outdir) == False:
        os.mkdir(outdir)

    if os.path.isdir(outdir_tmp) == False:
        os.mkdir(outdir_tmp)
    
    if os.path.isdir(indir_error) == False:
        os.mkdir(indir_error)            
    
    #Wählen Sie ein Bild im Eingabeverzeichnis
    all_images = glob.glob(indir + "*")
   
     #Verarbeitung für jedes Bild
    for img in all_images:
        
        #Holen Sie sich den Bildnamen des Eingabebildes (mit Erweiterung)
        basename = os.path.basename(img)
        print(basename)
        
        #Trennen Sie die Erweiterung vom Bildnamen des Eingabebildes
        name,ext = os.path.splitext(basename)
        
        try:
            #images = convert_from_path(img)
            with open(img,"rb") as pdf_file: #Obwohl img steht, handelt es sich um eine PDF-Datei, die als Eingabe verwendet wird.
                source = PdfFileReader(pdf_file)
            
                num_pages = source.getNumPages()
                
                #Einseitiges PDF wird ausgegeben_Kopieren Sie nach tmp und fahren Sie mit dem nächsten Bild fort
                if num_pages == 1:
                    copyfile(img,outdir_tmp + basename )
                    continue
            
            
                for i in range(0,num_pages):
                    file_object = source.getPage(i)
                    pdf_file_name = outdir_tmp + name + "_" + str(i+1) + ".pdf"

                    pdf_file_writer = PdfFileWriter()

                
                    with open(pdf_file_name, 'wb') as f:

                        pdf_file_writer.addPage(file_object)
                        pdf_file_writer.write(f)                    

        except:
            print(basename + "*** error ***")
            copyfile(img,indir_error + basename )



Was Sie tun möchten ②: Konvertieren Sie PDF in JPEG-Bilder

Dies läuft in GhostScript. Was ich tun möchte ① Wählen Sie die PDF-Dateien aus, die der Reihe nach in Seiten unterteilt wurden, und konvertieren Sie sie in JPEG. Der Ablauf ist so, dass der Befehl zuerst definiert und vom Unterprozessmodul ausgeführt wird.


    print("***** pdf to jpg *****")

    ######################################
    #
    # pdf2jpeg(ghost script)Verwandte Einstellungen
    #
    ######################################
        
    exe_name = r'C:\Program Files\gs\gs9.50\bin\gswin64c.exe'
    exe_option = "-dSAFER -dBATCH -dNOPAUSE -sDEVICE=jpeg -dJPEGQ=100 -dQFactor=1.0 -dDisplayFormat=16 -r600" 
    exe_outfile = "-sOutputFile="   

    #Wählen Sie ein Bild im Eingabeverzeichnis
    all_pdfs = glob.glob(outdir_tmp + "*")
    
    for pdf in all_pdfs:      
    
        #Holen Sie sich den Bildnamen des Eingabebildes (mit Erweiterung)
        basename = os.path.basename(pdf)
        print(basename)

        #Trennen Sie die Erweiterung vom Bildnamen des Eingabebildes
        name,ext = os.path.splitext(basename)   

        outputfile = outdir + name + ".jpg "

        cmd_list = list()
        cmd_list.append(exe_name)
        cmd_list.extend(exe_option.split()) #Dies wird erweitert, nicht angehängt
        cmd_list.append(exe_outfile + outputfile)
        cmd_list.append(pdf)
        
        subprocess.call(cmd_list)



Das ganze


import os
import glob

from PyPDF2 import PdfFileReader
from PyPDF2 import PdfFileWriter

import subprocess
from shutil import copyfile 

"""
Maine
"""
if __name__ == "__main__":

    
    #Holen Sie sich das aktuelle Verzeichnis
    current_dir = os.getcwd()
    #Eingabeverzeichnis abrufen
    indir = current_dir + "\\input\\"
    indir_error = current_dir + "\\input_error\\"
    
    #Ausgabeverzeichnis abrufen
    outdir = current_dir + "\\output\\"
    outdir_tmp = current_dir + "\\output_tmp\\"
    
    #Erstellen, wenn kein Ausgabeordner vorhanden ist
    if os.path.isdir(outdir) == False:
        os.mkdir(outdir)

    if os.path.isdir(outdir_tmp) == False:
        os.mkdir(outdir_tmp)
    
    if os.path.isdir(indir_error) == False:
        os.mkdir(indir_error)            
    
    #Wählen Sie ein Bild im Eingabeverzeichnis
    all_images = glob.glob(indir + "*")
   
     #Verarbeitung für jedes Bild
    for img in all_images:
        
        #Holen Sie sich den Bildnamen des Eingabebildes (mit Erweiterung)
        basename = os.path.basename(img)
        print(basename)
        
        #Trennen Sie die Erweiterung vom Bildnamen des Eingabebildes
        name,ext = os.path.splitext(basename)
        
        try:
            #images = convert_from_path(img)
            with open(img,"rb") as pdf_file: #Obwohl img steht, handelt es sich um eine PDF-Datei, die als Eingabe verwendet wird.
                source = PdfFileReader(pdf_file)
            
                num_pages = source.getNumPages()
                
                #Einseitiges PDF wird ausgegeben_Kopieren Sie nach tmp und fahren Sie mit dem nächsten Bild fort
                if num_pages == 1:
                    copyfile(img,outdir_tmp + basename )
                    continue
            
            
                for i in range(0,num_pages):
                    file_object = source.getPage(i)
                    pdf_file_name = outdir_tmp + name + "_" + str(i+1) + ".pdf"

                    pdf_file_writer = PdfFileWriter()

                
                    with open(pdf_file_name, 'wb') as f:

                        pdf_file_writer.addPage(file_object)
                        pdf_file_writer.write(f)                    

        except:
            print(basename + "*** error ***")
            copyfile(img,indir_error + basename )

    print("***** pdf to jpg *****")

    ######################################
    #
    # pdf2jpeg(ghost script)Verwandte Einstellungen
    #
    ######################################
        
    exe_name = r'C:\Program Files\gs\gs9.50\bin\gswin64c.exe'
    exe_option = "-dSAFER -dBATCH -dNOPAUSE -sDEVICE=jpeg -dJPEGQ=100 -dQFactor=1.0 -dDisplayFormat=16 -r600" 
    exe_outfile = "-sOutputFile="   

    #Wählen Sie ein Bild im Eingabeverzeichnis
    all_pdfs = glob.glob(outdir_tmp + "*")
    
    for pdf in all_pdfs:      
    
        #Holen Sie sich den Bildnamen des Eingabebildes (mit Erweiterung)
        basename = os.path.basename(pdf)
        print(basename)

        #Trennen Sie die Erweiterung vom Bildnamen des Eingabebildes
        name,ext = os.path.splitext(basename)   

        outputfile = outdir + name + ".jpg "

        cmd_list = list()
        cmd_list.append(exe_name)
        cmd_list.extend(exe_option.split())                   
        cmd_list.append(exe_outfile + outputfile)
        cmd_list.append(pdf)
        
        subprocess.call(cmd_list)



schließlich

Da der Quellcode schnell für das erstellt wurde, was ich tun wollte, wurde er ziemlich schmutziger Quellcode lol (Es ist kein Lachen)

Darüber hinaus gab es einige PDFs, die selbst mit GhostScript nicht gut in JPEG konvertiert werden konnten. Die Ursache ist nicht klar, aber nach ein wenig Recherche scheint es, dass die Schriftart sie nicht unterstützt. Ich werde je nach Antwort etwas mehr untersuchen.

Wenn Sie Fragen haben, hinterlassen Sie bitte einen Kommentar.

Recommended Posts

Ich habe GhostScript mit Python ausgeführt, das PDF in Seiten aufgeteilt und es in ein JPEG-Bild konvertiert.
Bildverarbeitung mit Python (ich habe versucht, es in 0 und 1 Mosaikkunst zu binarisieren)
Ich möchte mit Python nur das Gesicht aus einem Personenbild ausschneiden und speichern ~ Gesichtserkennung und Zuschneiden mit face_recognition ~
Konvertieren Sie PDF in Bilder (JPEG / PNG) mit Python
Konvertieren Sie das Bild in .zip mit Python in PDF
Ich habe ein Programm erstellt, um Bilder mit Python und OpenCV in ASCII-Grafik umzuwandeln
[Einführung in den Systemhandel] Ich habe einen Stochastic Oscillator mit Python gezeichnet und damit gespielt ♬
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Wahrscheinlich der einfachste Weg, um mit Python 3 ein PDF zu erstellen
Rufen Sie die Excel-Liste rekursiv in einem bestimmten Ordner mit Python ab und schreiben Sie sie in Excel.
Ich habe einen Server mit Python-Socket und SSL erstellt und versucht, über den Browser darauf zuzugreifen
Geben Sie die Bilddaten mit Flask of Python zurück und zeichnen Sie sie in das Canvas-Element von HTML
Ich habe eine Funktion zum Trimmen des Bildes von Python openCV erstellt. Verwenden Sie sie daher bitte.
Ich habe auch versucht, die Funktionsmonade und die Zustandsmonade mit dem Generator in Python nachzuahmen
Ich wandelte die Zeit in eine ganze Zahl um, zerlegte sie in Primfaktoren und machte einen Bot, um das Ergebnis zu twittern (xkcd story)
[Einführung in Python] So teilen Sie eine Zeichenfolge mit der Funktion split
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
Ich wollte das ABC164 A ~ D-Problem mit Python lösen
Ich habe Umgebungsvariablen in Docker festgelegt und in Python angezeigt.
Ich möchte eine in Python in PDF konvertierte Tabelle wieder in CSV konvertieren
Ein Python-Programm, das die Größe eines Videos ändert und es in ein Bild verwandelt
Stellen Sie die PDF-Datei ab und stempeln Sie alle Seiten mit vertraulichen Stempeln (Bildern).
Starten Sie die Webkamera, machen Sie ein Standbild und speichern Sie es lokal
[Python] Senden Sie das von der Webkamera aufgenommene Bild an den Server und speichern Sie es
Geben Sie den Bericht mit Python aus DB in PDF aus, hängen Sie ihn automatisch an eine E-Mail an und senden Sie ihn
Die Geschichte, ein Tool zum Laden von Bildern mit Python zu erstellen ⇒ Speichern unter
Ich habe versucht, das Bild mit Python + OpenCV zu "glätten"
Ich habe versucht, einen periodischen Prozess mit CentOS7, Selenium, Python und Chrome durchzuführen
Ich habe versucht, das Bild mit Python + OpenCV zu "differenzieren"
ffmpeg-Erstellen Sie eine Python-Umgebung und teilen Sie das Video
Teilen Sie jede PowerPoint-Folie in eine JPG-Datei und geben Sie sie mit Python aus
Ich möchte ein Spiel mit Python machen
Ich möchte ein Element mit numpy in eine Datei schreiben und es überprüfen.
Ich habe versucht, das Bild mit Python + OpenCV zu "binarisieren"
Ich habe versucht, mit Python viele Bilder wie das Favicon des Google-Kalenders zu generieren und in Vues Projekt zu integrieren
Ich habe ein System erstellt, das automatisch entscheidet, ob es morgen mit Python ausgeführt wird, und es zu Google Kalender hinzufügt.
GAE - Drehen Sie mit Python das Bild basierend auf den Rotationsinformationen von EXIF und laden Sie es in den Cloud-Speicher hoch.
Ich möchte mit Python in eine Datei schreiben
Ich habe versucht, eine einfache Bilderkennungs-API mit Fast API und Tensorflow zu erstellen
Extrahieren Sie Bilder und Tabellen mit Python aus PDF, um die Berichtslast zu verringern
Ich möchte die Variablen in der Python-Vorlagendatei ersetzen und in einer anderen Datei in Massenproduktion herstellen
Erstellen Sie mit Streamlit schnell ein Python-Datenanalyse-Dashboard und stellen Sie es in AWS bereit
Ich habe versucht, die Verarbeitungsgeschwindigkeit mit dplyr von R und pandas von Python zu vergleichen
Es ist einfach, SQL mit Python auszuführen und das Ergebnis in Excel auszugeben
Ich möchte die Optimierung mit Python und CPlex behandeln
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Ich habe versucht, Soma Cube mit Python zu lösen
Ich möchte mit Python-Datenklasse nach hinten erben
Ich möchte mit einem Roboter in Python arbeiten.
Ich habe versucht, LINE BOT mit Python und Heroku zu machen
Ich möchte eine Zeichenkette mit Hiragana teilen
Ein Memo, dass ich den Datenspeicher mit Python berührt habe
[Python] Maskiere das Bild mit Pillow zu einem Kreis
POST das Bild mit json und erhalte es mit der Flasche