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.
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)
Je vais expliquer en utilisant un PDF avec les phrases suivantes. (Cette image est un PDF exporté au format jpg et découpé.)
#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