개요
•
PDF를 전처리할 일이 있었는데, 만들어진 PDF를 pypdf로 읽어봤더니 text가 인식이 안됐다. (인디자인에서 바로 뽑아낸 책이라서 데이터에 오류가 있는게 있어보였음)
•
그리고 PDF에서 텍스트 긁어서 복붙하니까 안되더라…! 진짜 암울했음.
•
다른 OCR 오픈소스를 사용하여 내용을 추출하고, 이를 기반으로 AI Agent를 구축해서 최대한의 효과를 내보고자 함.
◦
Vision Model 을 Langchain 에서 부를 때 내용을 추출해도 되겠지만 비용적인 문제로 고려하지는 않았음
코드
우선적으로 Tesseract라는 OCR을 위한 오픈소스를 설치해준다.
본인은 GCP에서 linux 환경을 사용하고 있었으므로 apt-get 명령어로 쉽게 설치가 가능했다.
아래의 홈페이지를 참고하여 설치하면 된다.
중요한 것은 한국어 엔진을 다운 받아줘야만 한다.
•
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
첫번쨰 난관
•
두번쨰 난관
•
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.')