OCR 분기 시점
· 2.4 KiB · Text
Bruto
force_ocr = False # OCR을 강제할지 여부 플래그
pdf_page_count = 0
# 3-1. PDF 텍스트 추출 시도 (PyMuPDF)
try:
print("Attempting text extraction from PDF...")
with fitz.open(stream=contents, filetype="pdf") as doc:
pdf_page_count = len(doc)
if doc.needs_pass:
print("PDF is password protected. Text extraction skipped, proceeding to OCR.")
force_ocr = True # 비밀번호가 있으면 OCR 강제
else:
all_text = ""
for page_num in range(pdf_page_count):
page = doc.load_page(page_num)
page_text = page.get_text("text")
all_text += page_text
if page_num < pdf_page_count - 1:
all_text += "\n--- Page Break ---\n" # 페이지 구분 추가
# 추출된 텍스트 유효성 검사
if all_text and not all_text.isspace():
print(f"Text extracted ({len(all_text)} chars). Validating content...")
# 워터마크 제거 후 텍스트 확인
cleaned_text = watermark_regex.sub("", all_text).strip()
# 페이지 구분자도 제거하고 길이 계산
cleaned_text_for_length = cleaned_text.replace("\n--- Page Break ---\n", "")
# 1. 전체 텍스트 길이가 페이지 수 * 임계값보다 긴지 확인
# 2. 워터마크 제거 후에도 텍스트가 남아있는지 확인
min_total_length = MIN_MEANINGFUL_TEXT_LENGTH_PER_PAGE * pdf_page_count
if len(cleaned_text_for_length) >= min_total_length and cleaned_text:
print("Meaningful text found after validation.")
extracted_text_from_pdf = all_text.strip() # 원본 추출 텍스트 저장
processing_method = "pdf_text_extraction"
else:
print(f"Extracted text seems insufficient or mostly watermarks (Cleaned length: {len(cleaned_text_for_length)}, Threshold: {min_total_length}). Forcing OCR.")
force_ocr = True
else:
print("No text found via direct extraction. Proceeding to OCR.")
force_ocr = True # 텍스트가 아예 없으면 OCR 강제
except Exception as e:
print(f"Error during PDF text extraction: {e}. Proceeding to OCR.")
force_ocr = True # 텍스트 추출 중 에러 발생 시 OCR 강제
| 1 | force_ocr = False # OCR을 강제할지 여부 플래그 |
| 2 | pdf_page_count = 0 |
| 3 | |
| 4 | # 3-1. PDF 텍스트 추출 시도 (PyMuPDF) |
| 5 | try: |
| 6 | print("Attempting text extraction from PDF...") |
| 7 | with fitz.open(stream=contents, filetype="pdf") as doc: |
| 8 | pdf_page_count = len(doc) |
| 9 | if doc.needs_pass: |
| 10 | print("PDF is password protected. Text extraction skipped, proceeding to OCR.") |
| 11 | force_ocr = True # 비밀번호가 있으면 OCR 강제 |
| 12 | else: |
| 13 | all_text = "" |
| 14 | for page_num in range(pdf_page_count): |
| 15 | page = doc.load_page(page_num) |
| 16 | page_text = page.get_text("text") |
| 17 | all_text += page_text |
| 18 | if page_num < pdf_page_count - 1: |
| 19 | all_text += "\n--- Page Break ---\n" # 페이지 구분 추가 |
| 20 | |
| 21 | # 추출된 텍스트 유효성 검사 |
| 22 | if all_text and not all_text.isspace(): |
| 23 | print(f"Text extracted ({len(all_text)} chars). Validating content...") |
| 24 | # 워터마크 제거 후 텍스트 확인 |
| 25 | cleaned_text = watermark_regex.sub("", all_text).strip() |
| 26 | # 페이지 구분자도 제거하고 길이 계산 |
| 27 | cleaned_text_for_length = cleaned_text.replace("\n--- Page Break ---\n", "") |
| 28 | |
| 29 | # 1. 전체 텍스트 길이가 페이지 수 * 임계값보다 긴지 확인 |
| 30 | # 2. 워터마크 제거 후에도 텍스트가 남아있는지 확인 |
| 31 | min_total_length = MIN_MEANINGFUL_TEXT_LENGTH_PER_PAGE * pdf_page_count |
| 32 | if len(cleaned_text_for_length) >= min_total_length and cleaned_text: |
| 33 | print("Meaningful text found after validation.") |
| 34 | extracted_text_from_pdf = all_text.strip() # 원본 추출 텍스트 저장 |
| 35 | processing_method = "pdf_text_extraction" |
| 36 | else: |
| 37 | print(f"Extracted text seems insufficient or mostly watermarks (Cleaned length: {len(cleaned_text_for_length)}, Threshold: {min_total_length}). Forcing OCR.") |
| 38 | force_ocr = True |
| 39 | else: |
| 40 | print("No text found via direct extraction. Proceeding to OCR.") |
| 41 | force_ocr = True # 텍스트가 아예 없으면 OCR 강제 |
| 42 | |
| 43 | except Exception as e: |
| 44 | print(f"Error during PDF text extraction: {e}. Proceeding to OCR.") |
| 45 | force_ocr = True # 텍스트 추출 중 에러 발생 시 OCR 강제 |