[PYTHON] Texte extrait de l'image

J'ai écrit un programme qui utilise l'OCR pour extraire du texte à partir de fichiers PDF et d'images. Ce n'est pas plus facile d'utiliser l'OCR parce que je parle à mes amis de l'automatisation des tâches envoyées au format PDF et que je tape le rapport d'un autre ami dans Word, j'ai donc écrit un programme utilisant l'OCR. Je me suis demandé si je devais l'essayer.

mouvement

  1. Sélectionnez un fichier PDF ou image Utilisez Tkinter.filedialog.askopenfilenames pour sélectionner les fichiers PDF et JPG. Vous permet de sélectionner plusieurs fichiers à la fois.
  2. Convertissez le PDF en image L'OCR ne peut pas être effectué directement à partir d'un PDF, donc convertissez-le une fois en image. J'utilise poppler et pdf2image.
  3. Extraire le texte de l'image Extrait le texte de l'image convertie à partir du PDF et de l'image sélectionnée en 1. Utilisez tesseract et PyOCR.
  4. Sortie sous <nom de fichier sélectionné> .txt Si le fichier sélectionné est hoge.jpg, affichez-le en tant que hoge.txt.

code

main.py


import os
import pyocr
import tkinter
from tkinter import filedialog
from pdf2image import convert_from_path
from PIL import Image


class UseOCR:

    def __init__(self):
        pyocr.tesseract.TESSERACT_CMD = '/usr/local/bin/tesseract'
        self.poppler_executable_path = '/usr/local/bin/'
        self.initialdir = '~/'
        self.extract_lang = 'jpn+eng'
        self.extension = [('pdf files', '*.pdf'),
                          ('jpeg file', '*.jpeg'),
                          ('jpg file', '*.jpg'),
                          ('png file', '*.png')]

    def askfilenames(self):
        root = tkinter.Tk()
        root.withdraw()
        path = filedialog.askopenfilenames(filetypes=self.extension, initialdir=self.initialdir)
        return path

    @staticmethod
    def get_fileinfo(path):
        basename = tuple(map(os.path.basename, path))
        fileinfo = dict(zip(basename, path))
        return fileinfo

    def pdf_to_image(self, pdf):
        image = convert_from_path(pdf, poppler_path=self.poppler_executable_path)
        return image

    def image_to_text(self, image):
        tool = pyocr.get_available_tools()[0]
        txt = tool.image_to_string(
            image,
            lang='jpn',
            builder=pyocr.builders.TextBuilder()
        )
        return txt


if __name__ == '__main__':
    OCR = UseOCR()
    path = OCR.askfilenames()
    fileinfo = OCR.get_fileinfo(path)
    for basename, path in fileinfo.items():
        filename, extension = os.path.splitext(basename)
        if extension == '.pdf':
            image = OCR.pdf_to_image(path)[0]
            txt = OCR.image_to_text(image)
        else:
            image = Image.open(path)
            txt = OCR.image_to_text(image)
        with open('./output/{}.txt'.format(filename), mode='w') as f:
            f.write(txt)

La description

Je vais expliquer en utilisant un PDF avec les phrases suivantes. (Cette image est un PDF exporté au format jpg et découpé.) hoge.jpg

constructeur

#TESSERACT de pyocr_Réécrivez CMD pour tesseract chemin. Localisation → quel tesseract
pyocr.tesseract.TESSERACT_CMD = '/usr/local/bin/tesseract'

# convert_from_path()Le chemin du poppler à affecter à l'argument de. Emplacement → quel pdfinfo
self.poppler_executable_path = '/usr/local/bin/'

#Répertoire au démarrage de tkinter
self.initialdir = '~/'

#Caractère à OCR
self.extract_lang = 'jpn+eng'

#Spécifier l'extension à sélectionner avec tkinter
self.extension = [('pdf files', '*.pdf'),
                  ('jpeg file', '*.jpeg'),
                  ('jpg file', '*.jpg'),
                  ('png file', '*.png')]

askfilenames Renvoie un tapple du chemin complet du fichier sélectionné par Tkinter.

>>> path = OCR.askfilenames()
>>> path
('/Users/Username/Desktop/hoge.pdf',)

get_fileinfo Prendre un taple de chemin complet comme argument renvoie un nom de fichier et un dictionnaire de chemin complet.

>>> fileinfo = OCR.get_fileinfo(path)
>>> fileinfo
{'hoge.pdf': '/Users/Username/Desktop/hoge.pdf'}

pdf_to_image Le passage du chemin du fichier PDF comme argument renvoie une liste d'objets Image PIL. Étant donné que pdf2image et PyOCR ont une dépendance sur Pillow, il est plus facile à gérer si vous renvoyez un objet Image au lieu d'en faire un fichier image.

>>> for k,v in fileinfo.items():
...     image = OCR.pdf_to_image(v)
>>> image
[<PIL.PpmImagePlugin.PpmImageFile image mode=RGB size=1654x2339 at 0x10E1749E8>]

image_to_text C'est le processus central pour l'exécution de l'OCR. Si vous passez un fichier image ou un objet Image comme argument, l'OCR est exécuté et le texte est renvoyé.

>>> txt = OCR.image_to_text(image[0])
>>> txt
'Test du caractère de test 0123'

Recommended Posts

Texte extrait de l'image
Télécharger des images à partir d'un fichier texte contenant l'URL
Générer du texte d'image ensemble
Générer une image verticale d'un roman à partir de données textuelles
Supprimer le cadre de l'image
Créer un identifiant Santa à partir d'une image du Père Noël
Générer automatiquement un collage à partir de la liste d'images
Extraire du texte d'images avec Python
Coupons le visage de l'image
Traitement d'image | prédire les espèces à partir d'images
Obtenir des statistiques, etc. à partir de l'échantillon extrait
Extraire du texte japonais d'un PDF avec PDFMiner
Acquisition d'images depuis une caméra avec Python + OpenCV
Classification des documents avec texte toch de PyTorch
Alignement d'image: du SIFT au deep learning
Enregistrer l'image du chien à partir de la recherche d'images Google
Ajouter des lignes et du texte sur l'image
Récupérez uniquement le texte du formulaire Django.