스캔 PDF를 검색 가능한 문서로: OCR의 원리와 스캔 설정

OCR이 페이지를 읽는 순서(레이아웃 분석 → 글줄 인식), Tesseract 4의 LSTM, 300DPI 기준의 의미, 이미지 PDF와 검색 가능한 PDF의 차이, 한글·손글씨 인식의 한계를 정리했습니다.

everytooleverywhereallatonce · 작성

복합기로 스캔한 계약서를 열고 Ctrl+F로 「보증금」을 찾았는데 아무것도 안 나온 적이 있다면, 그 PDF는 글자가 아니라 글자를 찍은 사진을 담고 있는 것입니다. 사람 눈에는 똑같이 보여도 컴퓨터 입장에서는 흰 바탕에 검은 점이 흩어진 그림일 뿐입니다. 이 사진에서 문자를 되찾는 기술이 OCR(광학 문자 인식)입니다.

이미지 PDF와 검색 가능한 PDF

PDF 페이지에는 크게 세 종류가 있습니다.

종류 만들어지는 경우 검색·복사
텍스트 PDF 워드·한글에서 PDF로 저장 됨. 글자가 글꼴과 함께 들어 있음
이미지 PDF 스캐너, 휴대폰 스캔 앱 안 됨. 페이지 전체가 한 장의 그림
검색 가능한 PDF 이미지 PDF에 OCR 층을 더함 됨. 그림 위에 보이지 않는 글자가 겹쳐 있음

세 번째가 흥미롭습니다. PDF 규격에는 글자를 칠하지도 테두리를 그리지도 않는 「텍스트 렌더링 모드 3」이 있습니다. OCR 결과를 이 모드로 원래 글자 위치에 겹쳐 두면, 화면에는 스캔 그림만 보이지만 뷰어는 그 아래의 보이지 않는 글자로 검색·선택·복사·화면 낭독을 합니다. 드래그했을 때 파란 선택 영역이 글자에서 살짝 어긋나 보인다면 이 구조이기 때문입니다.

이 방식의 장점은 원본 그림을 건드리지 않는다는 것입니다. 인식이 틀려도 눈에 보이는 문서는 멀쩡하고, 틀린 것은 검색·복사 결과뿐입니다. 반대로 말하면, 검색 가능한 PDF에서 복사한 문장은 한 번 더 확인해야 합니다. 보이는 글자와 복사되는 글자가 다를 수 있으니까요.

OCR은 페이지를 어떤 순서로 읽나

현대 OCR 엔진은 대체로 두 단계로 일합니다.

1단계: 레이아웃 분석. 페이지에서 글자가 있는 영역을 찾고, 그것을 단·단락·글줄로 나눕니다. 그림, 표 괘선, 얼룩은 이 단계에서 걸러야 합니다. 두 단으로 된 문서를 한 단으로 잘못 보면 왼쪽 단 한 줄, 오른쪽 단 한 줄이 번갈아 이어진 엉터리 문장이 나옵니다.

2단계: 글줄 인식. 잘라 낸 글줄 이미지를 문자열로 바꿉니다. 여기서 방식이 크게 바뀌었습니다.

Tesseract는 1985~1994년 HP 연구소에서 개발됐고, 2005년 HP가 오픈소스로 공개한 뒤 2006년부터 2017년까지 구글이 개발을 이끌었습니다. 2007년 레이 스미스(Ray Smith)의 논문이 설명하는 초기 Tesseract는 글줄을 글자 단위로 쪼갠 다음, 글자 하나하나의 윤곽 특징을 분류기로 판정했습니다. 이 방식은 글자 경계를 먼저 정확히 잘라야 한다는 약점이 있습니다. 붙어 버린 「rn」을 「m」으로 읽거나, 번진 획 때문에 두 글자가 한 덩어리로 묶이는 식의 오류가 여기서 나옵니다.

Tesseract 4.0부터는 LSTM(장단기 기억) 신경망이 기본 인식기가 됐습니다. 공식 문서 표현대로 「글줄 인식에 집중한」 엔진으로, 글줄 이미지를 왼쪽부터 조금씩 훑으면서 앞뒤 문맥을 기억해 문자열을 한 번에 내놓습니다. 글자 경계를 미리 확정하지 않으니 붙은 글자나 기울어진 획에 훨씬 강합니다. 대신 연산량은 예전 방식의 약 10배라고 문서에 적혀 있습니다.

PaddleOCR 같은 최신 딥러닝 OCR도 뼈대는 같습니다. 검출 모델이 「이 픽셀이 글자일 확률」 지도를 만들어 글줄 상자를 찾고, 인식 모델이 각 글줄을 문자열로 바꿉니다. 인식 단계에서 흔히 쓰는 CTC 디코딩은 글줄을 수십~수백 개의 세로 조각으로 보고 조각마다 가장 그럴듯한 글자(또는 「빈칸」)를 고른 뒤, 연속된 중복을 합쳐 문자열을 만듭니다. PDF OCR 도구는 이 두 계열을 모두 제공합니다. 기본값은 PaddleOCR 모델이고, 모델을 받고 싶지 않다면 Tesseract(한국어·영어)를 고를 수 있습니다.

300DPI라는 기준의 정체

Tesseract 공식 문서는 「최소 300DPI 이미지에서 가장 잘 동작한다」고 적습니다. 이 숫자는 절대 규칙이 아니라 글자 한 개에 픽셀이 충분히 돌아가는지를 가늠하는 대리 지표입니다.

계산해 보면 이렇습니다. 1인치는 72pt이므로 10pt 글자의 높이는 300DPI에서 10 × 300 ÷ 72 ≈ 42픽셀, 200DPI에서는 약 28픽셀, 150DPI에서는 약 21픽셀입니다. 영문 소문자는 21픽셀이어도 모양이 대체로 남지만, 한글은 한 칸 안에 초성·중성·종성이 겹쳐 들어가 획 사이 간격이 한두 픽셀로 줄어듭니다. 「됐/됬」 「읽/잃」 「몇/멏」처럼 한 획 차이인 글자를 가르려면 그 한두 픽셀이 살아 있어야 합니다.

그래서 실무 기준은 이렇습니다.

  • 일반 본문(10~12pt): 300DPI
  • 각주, 약관, 영수증처럼 8pt 이하: 400DPI 이상
  • 큰 글씨 포스터나 제목만 있는 문서: 200DPI로도 충분

주의할 점은 이미 저해상도로 저장된 스캔은 나중에 해상도를 올려도 나아지지 않는다는 것입니다. 150DPI로 스캔한 PDF를 400DPI로 렌더링하면 픽셀이 커질 뿐 사라진 획 간격은 돌아오지 않습니다. 해상도는 스캔할 때 정해야 합니다.

스캔할 때 결과를 좌우하는 설정

해상도 다음으로 중요한 것은 다음 네 가지입니다.

컬러 모드. 스캐너의 「흑백(1비트)」 모드는 파일이 가장 작지만, 스캐너가 페이지 전체에 기준값 하나로 흑백을 자릅니다. 연한 글씨나 그림자 진 가장자리는 이 단계에서 영영 사라집니다. 회색조로 스캔해 두면, 나중에 주변 밝기를 보고 픽셀마다 기준을 정하는 적응형 이진화(Sauvola 방식 등)를 적용할 수 있습니다. Tesseract 문서도 내장 이진화(Otsu)가 「배경 밝기가 고르지 않으면 결과가 나쁠 수 있다」고 적고 있습니다.

압축. JPEG 품질을 너무 낮추면 글자 가장자리에 얼룩(링잉)이 생기고, OCR은 이것을 획으로 착각합니다. 스캐너 설정에서 「고화질」 또는 압축률이 낮은 쪽을 고르세요.

기울기. 몇 도만 기울어도 긴 글줄의 끝이 아래 줄에 걸립니다. Tesseract 문서는 「글줄이 수평이 되도록 페이지를 돌리라」고 권합니다. 급지대로 여러 장을 스캔하면 흔히 생기는 문제라, OCR 전에 스캔 보정 도구의 기울기 보정으로 펴 두면 인식이 안정됩니다. 이 보정은 페이지를 다시 그리지 않고 좌표만 돌려 화질이 떨어지지 않습니다.

테두리와 그림자. 책을 펴서 스캔하면 가운데 제본 부분에 짙은 그림자가, 가장자리에 검은 띠가 생깁니다. Tesseract 문서는 이런 어두운 테두리가 글자로 잘못 인식될 수 있다고 경고합니다. 펀치 구멍도 「o」나 마침표로 읽히곤 합니다. 인식 전에 지우는 것이 가장 확실합니다.

휴대폰으로 찍는 경우에는 원근 왜곡(사다리꼴)과 조명 얼룩이 추가됩니다. 스캔 앱의 문서 모드로 사각형을 맞춰 찍고, 그늘 없이 밝은 곳에서 찍으세요.

한글·한자 인식이 영어보다 어려운 이유

Tesseract는 100개가 넘는 언어를 인식할 수 있지만, 언어마다 학습 데이터 파일이 따로 있고 인식할 때 어떤 언어를 쓸지 사람이 정해 줘야 합니다. 한국어 데이터로 영어 문서를 읽거나 그 반대로 하면, 엔진은 자기가 아는 글자 목록 안에서 가장 비슷한 것을 억지로 고릅니다. 결과가 이상할 때 가장 먼저 확인할 설정이 언어인 이유입니다.

영어는 대소문자와 숫자, 기호를 합쳐도 100자 안팎입니다. 한글은 유니코드에 완성형 음절이 11,172자 있고, 실제 문서에 자주 나오는 것만 2,000자가 넘습니다. 일본어는 상용한자만 2,136자에 가나가 더해집니다. 분류해야 할 글자 수가 수십 배라, 모양이 비슷한 글자 쌍도 그만큼 많습니다.

한글 특유의 문제도 있습니다.

  • 닮은 음절이 많다. 받침 하나, 점 하나 차이인 음절이 대량으로 존재합니다. 해상도가 낮거나 잉크가 번지면 가장 먼저 무너지는 곳입니다.
  • 띄어쓰기. OCR은 글자 사이 간격으로 공백을 추정하는데, 한글은 음절 폭이 거의 일정해 어절 사이 간격이 좁은 조판에서는 공백이 빠지거나 더해지기 쉽습니다.
  • 한자·영문 혼용. 법률 문서의 한자, 계약서의 영문 약어가 섞이면 한 언어 모델로는 한쪽을 놓칩니다. 인식 언어를 한국어+영어처럼 문서에 맞게 고르는 것이 중요합니다.

세로쓰기도 넘어야 할 벽입니다. Tesseract 4 문서는 중국어·일본어·한국어 세로쓰기를 지원한다고 적고 있지만, 모든 OCR 도구가 그런 것은 아닙니다. 쓰는 도구가 세로쓰기를 지원하는지 먼저 확인하세요.

손글씨는 왜 여전히 어려운가

인쇄체 OCR은 같은 글꼴의 같은 글자가 매번 거의 같은 모양이라는 전제 위에 서 있습니다. 손글씨는 사람마다, 같은 사람이라도 줄마다 모양이 다릅니다. 글자끼리 이어지고, 글줄이 기울고, 칸 밖으로 삐져나옵니다. 이런 글씨를 읽으려면 손글씨로 따로 학습한 모델이 필요하고, 그래도 인쇄체 수준의 정확도는 기대하기 어렵습니다.

PaddleOCR의 PP-OCRv5는 중국어·영어 손글씨 인식을 개선했다고 밝히고 있지만, 한글 손글씨까지 같은 수준이라는 자료는 찾지 못했습니다. 현실적으로는 신청서의 손글씨 칸은 사람이 옮겨 적고, 인쇄된 부분만 OCR에 맡기는 편이 빠릅니다.

결과를 믿어도 되는지 확인하는 법

OCR 엔진은 단어마다 「신뢰도」를 냅니다. 평균 신뢰도가 90%여도 틀린 10%가 금액이나 계좌번호일 수 있습니다. 확인 순서는 이렇습니다.

  1. 신뢰도가 낮게 표시된 단어부터 원본과 대조합니다.
  2. 숫자, 날짜, 고유명사를 따로 훑어봅니다. 사전 기반 보정이 통하지 않는 영역이라 오류가 남기 쉽습니다.
  3. 검색 가능한 PDF에서 핵심 단어를 검색해, 실제로 찾아지는지 봅니다.

이미 텍스트 층이 있는 PDF라면 OCR이 필요 없는 경우도 많습니다. PDF 텍스트 추출로 먼저 뽑아 보세요. 결과가 비어 있으면 이미지 PDF이고, 글자가 나오는데 엉뚱한 기호로 깨져 있다면 PDF 안에 글리프를 유니코드로 바꾸는 표(ToUnicode)가 없거나 틀린 경우입니다. 이때는 추출로는 고칠 수 없고, 역설적으로 텍스트 PDF인데도 OCR로 다시 읽는 것이 답입니다.

순서대로 정리한 작업 흐름

  1. 가능하면 300DPI(작은 글씨는 400DPI), 회색조로 스캔합니다.
  2. 방향과 기울기를 바로잡고, 테두리·그림자·잡티를 지웁니다.
  3. 문서 언어를 맞춰 OCR을 돌리고, 신뢰도 낮은 단어와 숫자를 확인합니다.
  4. 검색이 되는지 확인한 뒤 원본 스캔과 함께 보관합니다.

마지막 단계에서 원본을 함께 두는 이유는 단순합니다. OCR은 해마다 좋아지고, 좋은 원본 스캔만 있으면 몇 년 뒤 더 나은 엔진으로 다시 읽을 수 있기 때문입니다.

출처