Changyu Lee

PDF를 OCR로 전처리하기

Published at
2024/10/10
Last edited time
2024/10/12 10:21
Created
2024/10/08 08:21
Section
ML
Status
Done
Series
Tags
Code
AI summary
Keywords
Linux
PDF
PreProcessing
OCR
Tesseract
Language

개요

PDF를 전처리할 일이 있었는데, 만들어진 PDF를 pypdf로 읽어봤더니 text가 인식이 안됐다. (인디자인에서 바로 뽑아낸 책이라서 데이터에 오류가 있는게 있어보였음)
그리고 PDF에서 텍스트 긁어서 복붙하니까 안되더라…! 진짜 암울했음.
다른 OCR 오픈소스를 사용하여 내용을 추출하고, 이를 기반으로 AI Agent를 구축해서 최대한의 효과를 내보고자 함.
Vision Model 을 Langchain 에서 부를 때 내용을 추출해도 되겠지만 비용적인 문제로 고려하지는 않았음

코드

우선적으로 Tesseract라는 OCR을 위한 오픈소스를 설치해준다.
본인은 GCP에서 linux 환경을 사용하고 있었으므로 apt-get 명령어로 쉽게 설치가 가능했다.
아래의 홈페이지를 참고하여 설치하면 된다.
tesseract
tesseract-ocr
중요한 것은 한국어 엔진을 다운 받아줘야만 한다.
TroubleShooting에 있는 블로그를 참조할 것.
이후 내가 생각한 PDF 에서 OCR하는 방법은 다음과 같다.
1.
PDF를 이미지로 변환
2.
이미지에서 OCR
이렇게 두 파트로 구성된다.
먼저 패키지를 설치해야한다.
!pip install pdf2image pytesseract
Shell
복사
pytesseract를 설치하기 전에 반드시 apt-get 명령어로 tesseract OCR을 설치해야한다.
패키지를 설치하고 난 후에 하나씩 과정을 실행해보자
1.
PDF에서 이미지 변환
images = convert_from_path(file_path)
Python
복사
2.
이미지를 저장한 리스트를
text = pytesseract.image_to_string(img, lang='kor')
Python
복사
정말 쉽다. 위 두줄이면 된다. 위 두줄을 사용해서 원하는 코드를 짜면된다.
file_path로 pdf를 불러오고 이를 images 로 바꿔준다.
그리고 이 이미지들을 하나씩 OCR을 실행해주면 끝.
내가 쓰는 코드를 살짝쿵 공개해보면 아래와 같다.
설정 파일 등을 사용하고 있으므로, 참고하기만 하면 된다. (폴더 구조 안 만들고 하면 당연히 에러남)
from pdf2image import convert_from_path import pytesseract from PIL import Image # Store Pdf with convert_from_path function is_converting_finished = True if status.get('converted_pdf_to_image') == "FINISHED" else False is_OCR_finished = True if status.get('OCR_process') == "FINISHED" else False total_pages = int(config.get("total_pages")) print("IS CONVERTING FINISHED:", is_converting_finished) print("IS OCR FINISHED:", is_OCR_finished) images = [] print("CONVERTING PDF TO IMAGE STARTED") if not is_converting_finished: images = convert_from_path(file_path) total_pages = len(images) config['total_pages'] = total_pages # save JSON file with open("./config.json", 'w') as f: json.dump(config, f, indent=4) status['converted_pdf_to_image'] = "FINISHED" with open("./status.json", 'w') as f: json.dump(status, f, indent=4) print("CONVERTING PDF TO IMAGE FINISHED") for i in tqdm.tqdm(range(total_pages)): if not is_converting_finished: # Save pages as images in the pdf images[i].save('./data/page/page'+ str(i) +'.jpg', 'JPEG') else : # Load pages as images in the "./data/page" directory images.append(Image.open('./data/page/page'+ str(i) +'.jpg')) print("CONVERTING PDF TO IMAGE OR LOAD IMAGE FINISHED") print("TOTAL PAGES:", len(images)) assert (len(images) > 0), "ERROR: NO PAGES FOUND" assert (total_pages == len(images)), "ERROR: TOTAL PAGES NOT MATCHED" book_text_list = [] for i in tqdm.tqdm(range(0, total_pages)): if is_OCR_finished: break img = images[i] text = pytesseract.image_to_string(img, lang='kor') if cfg_is_test_mode: print(f"-------------------<TEXT: {i}>-------------------") print(text) print(f"-------------------</TEXT: {i}>-------------------") book_text_list.append(text) with open('./data/text_ocr/'+ str(i) +'.txt', 'w') as f: f.write(text) f.close() print("OCR PROCESS FINISHED") print("TOTAL PAGES:", len(images)) if is_OCR_finished: book_text_list = [] for i in range(len(images)): with open('./data/text_ocr/'+ str(i) +'.txt', 'r') as f: book_text_list.append(f.read()) f.close() # status update status['OCR_process'] = "FINISHED" with open("./status.json", 'w') as f: json.dump(status, f, indent=4)
Python
복사

Trouble Shooting

첫번쨰 난관

PDF 읽어올 때 Poppler 에러.
sudo apt-get install poppler-utils

두번쨰 난관

TesseractError: (1, 'Error opening data file /usr/share/tesseract-ocr/4.00/tessdata/kor.traineddata Please make sure the TESSDATA_PREFIX environment variable is set to your "tessdata" directory. Failed loading language \'kor\' Tesseract couldn\'t load any languages! Could not initialize tesseract.')

참고