이미지에서 텍스트 추출

14631 단어 Python
나는 OCR로 PDF와 이미지 파일에서 텍스트를 추출하는 프로그램을 썼다.
친구와 PDF가 보낸 과제의 자동화에 대해 이야기하거나 다른 친구의 보고서를 워드에 넣으면 OCR을 사용하는 것이 편하다. OCR로 프로그램을 써 보는 것이 계기다.

액션

  • PDF 또는 이미지 파일 선택
    Tkinter.filedialog.askopenfilenames를 사용하여 PDF 및 JPG 파일을 선택합니다.
    파일은 여러 개를 동시에 선택할 수 있습니다.
  • PDF를 이미지로 변환
    PDF에서 OCR을 직접 수행할 수 없기 때문에 먼저 이미지로 변환합니다.
    poppler와 pdf2imge를 사용합니다.
  • 이미지에서 텍스트 추출
    PDF 변환된 이미지와 1에서 선택한 이미지에서 텍스트를 추출합니다.
    tesseract와 PyOCR을 사용합니다.
  • <선택한 파일 이름>.txt로 내보내기
    선택한 파일은 hoge입니다.jpg의 경우 hoge.txt로 출력합니다.
  • 코드


    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)
    
    

    설명


    다음 글이 작성된 PDF를 사용하여 설명합니다.
    이 이미지는 PDF를 jpg에 써서 트림된 것입니다.

    구조기

    # pyocrのTESSERACT_CMDをtesseractのパスに書き換え。場所 → which tesseract
    pyocr.tesseract.TESSERACT_CMD = '/usr/local/bin/tesseract'
    
    # convert_from_path()の引数に代入するpopplerのパス。 場所 → which pdfinfo
    self.poppler_executable_path = '/usr/local/bin/'
    
    # tkinterが起動したときのディレクトリ
    self.initialdir = '~/'
    
    # OCRする文字
    self.extract_lang = 'jpn+eng'
    
    # tkinterで選択する拡張子の指定
    self.extension = [('pdf files', '*.pdf'),
                      ('jpeg file', '*.jpeg'),
                      ('jpg file', '*.jpg'),
                      ('png file', '*.png')]
    

    askfilenames


    Tkinter에서 선택한 파일의 전체 경로를 반환하는 모듈
    >>> path = OCR.askfilenames()
    >>> path
    ('/Users/Username/Desktop/hoge.pdf',)
    

    get_fileinfo


    전체 경로의 원조를 매개 변수로 설정하면 파일 이름과 전체 경로의 사전을 되돌려줍니다.
    >>> fileinfo = OCR.get_fileinfo(path)
    >>> fileinfo
    {'hoge.pdf': '/Users/Username/Desktop/hoge.pdf'}
    

    pdf_to_image


    PDF 파일의 경로를 매개변수에 전달한 후 PIL의 Image 객체 목록으로 돌아갑니다.
    pdf2image와 PyOCR은 Pillow와 의존 관계이기 때문에 이미지 파일에 넣지 않고 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


    OCR의 중추 처리입니다.
    이미지 파일 또는 Image 객체를 매개변수에 전달하는 경우 OCR을 실행하여 텍스트를 반환합니다.
    >>> txt = OCR.image_to_text(image[0])
    >>> txt
    'テストtest文字0123'
    

    좋은 웹페이지 즐겨찾기