J'ai exécuté GhostScript avec python, divisé le PDF en pages et l'ai converti en image JPEG.

introduction

salut! J'ai eu l'occasion d'utiliser GhostScript avec python, donc cette fois j'aimerais résumer les résultats que j'en ai tirés. Plus précisément, GhostScript est utilisé pour convertir un PDF en image JPEG (conversion PDF⇒JPEG). La conversion PDF-JPEG que nous allons faire dans cet article est "non seulement un PDF d'une page, mais également un PDF de plusieurs pages est décomposé en une page et enregistré en tant qu'image JPEG".

Pourquoi GhostScript?

GhostScript est un interpréteur pour le langage PostScript et PDF, comme vous pouvez le voir sur le site officiel.

Cité sur le site officiel

An interpreter for the PostScript language and for PDF.

Quand je demande à un enseignant google ce que je veux faire dans cet article, je pense que pdf2image et PyPDF2 sont des solutions courantes, mais la raison pour laquelle j'ai utilisé GhostScript est simple.

Parce qu'il y avait un PDF qui ne pouvait pas être converti avec PyPDF2 et pouvait être converti avec GhostScript lol

De plus, le fonctionnement de GhostScript fait référence à ce site. (Ce site n'utilise pas de python en particulier.) http://michigawi.blogspot.com/2011/12/ghostscriptpdfjpg.html

Environnement de développement

Windows10 python3.6.9 GhostScript 9.50

Préparation (Télécharger GhostScript)

Cette fois, téléchargez GhostScript à partir de ce qui suit. https://www.ghostscript.com/

Veuillez télécharger en fonction de chaque environnement de développement. Dans cet article, AGPL pour Windows (64 bits) est sélectionné.

ghostscript_download.png

Exécutez le fichier téléchargé à configurer.

<détails>

Écran de configuration </ summary>

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

  • Il semble que ghostscript puisse être installé avec la commande pip même avec PyPI, mais cela n'a pas été confirmé au moment de la rédaction de cet article. https://pypi.org/project/ghostscript/

Ce que vous voulez faire Split: Divisez la page PDF

Comme expliqué dans "Introduction", ce processus est requis pour un PDF de plusieurs pages et n'est pas nécessaire pour un PDF d'une page. Comme ce sera long, je n'ai ramassé que les pièces liées à la division. Si vous n'avez pas le temps, veuillez vérifier l'intégralité du code source dans les chapitres suivants.

Au préalable, créez un dossier «input» dans le même répertoire que le code source, et placez-y le fichier PDF qui sera l'image d'entrée. Un répertoire appelé "output_tmp" est automatiquement créé et le fichier PDF paginé est enregistré.


if __name__ == "__main__":

    
    #Obtenez le répertoire actuel
    current_dir = os.getcwd()
    #Obtenir le répertoire d'entrée
    indir = current_dir + "\\input\\"
    indir_error = current_dir + "\\input_error\\"
    
    #Obtenir le répertoire de sortie
    outdir = current_dir + "\\output\\"
    outdir_tmp = current_dir + "\\output_tmp\\"
    
    #Créer s'il n'y a pas de dossier de sortie
    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)            
    
    #Sélectionnez une image dans le répertoire d'entrée
    all_images = glob.glob(indir + "*")
   
     #Traitement pour chaque image
    for img in all_images:
        
        #Obtenez le nom de l'image de l'image d'entrée (avec l'extension)
        basename = os.path.basename(img)
        print(basename)
        
        #Séparez l'extension du nom d'image de l'image d'entrée
        name,ext = os.path.splitext(basename)
        
        try:
            #images = convert_from_path(img)
            with open(img,"rb") as pdf_file: #Bien qu'il dise img, c'est un fichier PDF qui est utilisé comme entrée.
                source = PdfFileReader(pdf_file)
            
                num_pages = source.getNumPages()
                
                #Un PDF d'une seule page est sorti_Copiez vers tmp et passez à l'image suivante
                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 )



Ce que vous voulez faire: Convertir un PDF en image JPEG

Cela fonctionne dans GhostScript. Ce que je veux faire ① Sélectionnez les fichiers PDF qui ont été divisés en pages dans l'ordre et convertissez-les au format JPEG. Le flux est tel que la commande est définie en premier et exécutée par le module de sous-processus.


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

    ######################################
    #
    # pdf2jpeg(ghost script)Paramètres associés
    #
    ######################################
        
    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="   

    #Sélectionnez une image dans le répertoire d'entrée
    all_pdfs = glob.glob(outdir_tmp + "*")
    
    for pdf in all_pdfs:      
    
        #Obtenez le nom de l'image de l'image d'entrée (avec l'extension)
        basename = os.path.basename(pdf)
        print(basename)

        #Séparez l'extension du nom d'image de l'image d'entrée
        name,ext = os.path.splitext(basename)   

        outputfile = outdir + name + ".jpg "

        cmd_list = list()
        cmd_list.append(exe_name)
        cmd_list.extend(exe_option.split()) #C'est étendre, pas ajouter
        cmd_list.append(exe_outfile + outputfile)
        cmd_list.append(pdf)
        
        subprocess.call(cmd_list)



L'ensemble


import os
import glob

from PyPDF2 import PdfFileReader
from PyPDF2 import PdfFileWriter

import subprocess
from shutil import copyfile 

"""
Principale
"""
if __name__ == "__main__":

    
    #Obtenez le répertoire actuel
    current_dir = os.getcwd()
    #Obtenir le répertoire d'entrée
    indir = current_dir + "\\input\\"
    indir_error = current_dir + "\\input_error\\"
    
    #Obtenir le répertoire de sortie
    outdir = current_dir + "\\output\\"
    outdir_tmp = current_dir + "\\output_tmp\\"
    
    #Créer s'il n'y a pas de dossier de sortie
    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)            
    
    #Sélectionnez une image dans le répertoire d'entrée
    all_images = glob.glob(indir + "*")
   
     #Traitement pour chaque image
    for img in all_images:
        
        #Obtenez le nom de l'image de l'image d'entrée (avec l'extension)
        basename = os.path.basename(img)
        print(basename)
        
        #Séparez l'extension du nom d'image de l'image d'entrée
        name,ext = os.path.splitext(basename)
        
        try:
            #images = convert_from_path(img)
            with open(img,"rb") as pdf_file: #Bien qu'il dise img, c'est un fichier PDF qui est utilisé comme entrée.
                source = PdfFileReader(pdf_file)
            
                num_pages = source.getNumPages()
                
                #Un PDF d'une seule page est sorti_Copiez vers tmp et passez à l'image suivante
                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)Paramètres associés
    #
    ######################################
        
    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="   

    #Sélectionnez une image dans le répertoire d'entrée
    all_pdfs = glob.glob(outdir_tmp + "*")
    
    for pdf in all_pdfs:      
    
        #Obtenez le nom de l'image de l'image d'entrée (avec l'extension)
        basename = os.path.basename(pdf)
        print(basename)

        #Séparez l'extension du nom d'image de l'image d'entrée
        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)



à la fin

Parce que le code source a été créé rapidement pour ce que je voulais faire, il est devenu un code source assez sale lol (Ce n'est pas un rire)

De plus, certains fichiers PDF ne pouvaient pas être correctement convertis en JPEG, même avec GhostScript. La cause n'est pas claire, mais après un peu de recherche, il semble que la police ne la supporte pas. En fonction de la réponse, je vais enquêter un peu plus.

Si vous avez des questions, laissez un commentaire.

Recommended Posts

J'ai exécuté GhostScript avec python, divisé le PDF en pages et l'ai converti en image JPEG.
Traitement d'image avec Python (j'ai essayé de le binariser en art mosaïque 0 et 1)
Je veux découper uniquement le visage d'une image de personne avec Python et l'enregistrer ~ Détection de visage et rognage avec face_recognition ~
Convertir un PDF en image (JPEG / PNG) avec Python
Convertissez l'image au format .zip en PDF avec Python
J'ai créé un programme pour convertir des images en art ASCII avec Python et OpenCV
[Introduction au trading système] J'ai dessiné un oscillateur stochastique avec python et joué avec ♬
J'ai essayé de trouver l'entropie de l'image avec python
Probablement le moyen le plus simple de créer un pdf avec Python 3
Obtenez de manière récursive la liste Excel dans un dossier spécifique avec python et écrivez-la dans Excel.
J'ai créé un serveur avec socket Python et ssl et j'ai essayé d'y accéder depuis le navigateur
Renvoyez les données d'image avec Flask of Python et dessinez-les dans l'élément canvas de HTML
J'ai créé une fonction pour découper l'image de python openCV, alors veuillez l'utiliser.
J'ai aussi essayé d'imiter la fonction monade et la monade d'état avec le générateur en Python
J'ai converti le temps en un entier, je l'ai décomposé en facteurs premiers et j'ai fait un bot pour tweeter le résultat (matériel xkcd)
[Introduction à Python] Comment fractionner une chaîne de caractères avec la fonction split
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
Je voulais résoudre le problème ABC164 A ~ D avec Python
J'ai défini des variables d'environnement dans Docker et je les ai affichées en Python.
Je souhaite convertir une table convertie en PDF en Python en CSV
Un programme python qui redimensionne une vidéo et la transforme en image
Imaginez le fichier pdf et tamponnez toutes les pages avec des tampons (images) confidentiels.
Démarrez la webcam, prenez une image fixe et enregistrez-la localement
[python] Envoyez l'image capturée de la caméra Web au serveur et enregistrez-la
Exportez le rapport au format PDF à partir de DB avec Python et attachez-le automatiquement à un e-mail et envoyez-le
L'histoire de la création d'un outil pour charger une image avec Python ⇒ l'enregistrer sous un autre nom
J'ai essayé de "lisser" l'image avec Python + OpenCV
J'ai essayé de faire un processus périodique avec CentOS7, Selenium, Python et Chrome
J'ai essayé de "différencier" l'image avec Python + OpenCV
ffmpeg-Construisez un environnement python et divisez la vidéo
Divisez chaque diapositive PowerPoint en un fichier JPG et exportez-le avec python
Je veux faire un jeu avec Python
Je veux écrire un élément dans un fichier avec numpy et le vérifier.
J'ai essayé de "binariser" l'image avec Python + OpenCV
J'ai généré beaucoup d'images comme le favicon du calendrier Google avec Python et je l'ai incorporé dans le projet de Vue
J'ai créé un système qui décide automatiquement de s'exécuter demain avec Python et l'ajoute à Google Agenda.
GAE --Avec Python, faites pivoter l'image en fonction des informations de rotation d'EXIF et importez-la dans Cloud Storage.
Je veux écrire dans un fichier avec Python
J'ai essayé de créer une API de reconnaissance d'image simple avec Fast API et Tensorflow
Extraire des images et des tableaux de pdf avec python pour réduire la charge de reporting
Je veux remplacer les variables dans le fichier de modèle python et le produire en masse dans un autre fichier
Créez rapidement un tableau de bord d'analyse de données Python avec Streamlit et déployez-le sur AWS
J'ai essayé de comparer la vitesse de traitement avec dplyr de R et pandas de Python
Il est facile d'exécuter SQL avec Python et de générer le résultat dans Excel
Je veux gérer l'optimisation avec python et cplex
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé de résoudre Soma Cube avec python
Je veux hériter de l'arrière avec la classe de données python
Je veux travailler avec un robot en python.
J'ai essayé de faire LINE BOT avec Python et Heroku
Je veux diviser une chaîne de caractères avec hiragana
Un mémo que j'ai touché au magasin de données avec python
[Python] Masquez l'image dans un cercle à l'aide de Pillow
POSTER l'image avec json et la recevoir avec flask