PDF에서 텍스트 추출하기: 텍스트 레이어와 OCR
어떤 PDF는 텍스트를 바로 내주지만, 어떤 PDF에는 페이지를 찍은 그림만 들어 있어 OCR이 필요합니다. 이 가이드는 PDF에 텍스트가 저장되는 방식, 추출한 텍스트가 깨지거나 순서가 뒤섞이는 이유, OCR이 스캔한 페이지를 읽는 방식과 정확도에 영향을 주는 요인, 결과를 믿고 쓰기 전에 확인할 점을 설명합니다.
PDF 페이지의 두 종류
PDF 페이지에 텍스트가 담기는 방식은 두 가지입니다. 워드프로세서, 브라우저, 디자인 프로그램에서 내보낸 PDF는 대부분 텍스트 레이어가 있습니다. 각 글자가 글꼴 안의 코드로 저장되고 페이지의 특정 위치에 놓입니다. 스캔하거나 사진으로 찍은 페이지는 다릅니다. 페이지 전체가 그림 한 장이어서, 소프트웨어가 보기에 그 안의 글자는 픽셀일 뿐입니다.
| 페이지 종류 | 만들어진 방식 | 추출 결과 |
|---|---|---|
| 텍스트 PDF | 앱에서 PDF로 내보내거나 인쇄 | 저장된 글자, 대개 그대로 |
| 스캔 PDF | 스캐너, 휴대폰 카메라, 팩스 | OCR이 이미지를 읽기 전에는 아무것도 없음 |
| 검색 가능한 스캔본 | 스캔 후 OCR 텍스트 레이어를 덧붙임 | 그때의 OCR 결과와 그 오류 |
| 윤곽선으로 바꾼 텍스트 | 디자인 프로그램에서 글자를 도형으로 변환 | 글자 없음, OCR로만 읽을 수 있음 |
어느 쪽인지는 PDF 뷰어에서 대개 알 수 있습니다. 단어 하나를 선택하거나 검색창으로 찾을 수 있으면 텍스트 레이어가 있는 페이지입니다. 드래그하면 페이지 전체가 한 덩어리로 선택되거나 검색 결과가 없으면 이미지 페이지입니다. 타이핑한 보고서에 스캔한 부록이 붙은 경우처럼 한 파일에 두 종류가 섞일 수도 있습니다.
텍스트 레이어 추출의 원리
PDF는 문단을 저장하지 않습니다. 글꼴과 위치를 가진 글자 묶음을, 흔히 단어 하나나 글자 몇 개 단위로, 파일을 만든 프로그램이 정한 순서대로 저장합니다. 추출 도구는 이 묶음을 읽고 위치를 바탕으로 줄을 다시 만듭니다.
LeedyBox PDF 텍스트 추출 도구는 Firefox의 PDF 엔진인 PDF.js로 이 묶음을 읽습니다. 세로 위치가 5포인트(약 1.8mm)보다 많이 바뀌면 새 줄을 시작하고, 그렇지 않으면 묶음 사이에 공백을 넣어 잇습니다. 결과에서 각 페이지는 --- 페이지 1 --- 같은 표시로 시작합니다. 한 단으로 된 문서는 대부분 읽기 좋게 나오지만, 몇 가지 부작용이 있습니다.
- 자간 조정 등으로 한 단어가 여러 묶음으로 저장되어 있으면 단어 중간에 공백이 들어갈 수 있습니다.
- 단, 사이드바, 캡션은 저장된 순서대로 나오며, 이 순서는 사람이 읽는 순서와 다를 수 있습니다.
- 위 첨자, 각주 번호처럼 줄보다 높거나 낮게 놓인 글자는 따로 한 줄이 될 수 있습니다.
- 머리글, 바닥글, 쪽 번호도 각 페이지 텍스트에 포함됩니다.
추출한 텍스트가 깨지는 이유
PDF 안에서 텍스트는 유니코드 문자가 아니라 글꼴의 글리프 코드로 저장됩니다. 이 코드를 다시 글자로 바꾸려면 파일에 대응표가 있어야 합니다. 잘 만든 PDF는 글꼴마다 ToUnicode 표를 넣어 두고, 표준 인코딩을 쓰는 글꼴은 이 표 없이도 해석할 수 있습니다. 문제는 글꼴이 자체 번호를 쓰는 부분 집합(서브셋)으로 포함되고 대응표가 없을 때 생깁니다. 이때 코드는 파일 밖에서는 아무 의미가 없어서, 화면에서는 멀쩡해 보여도 추출하면 엉뚱한 글자, 기호, 빈 네모가 나옵니다.
한국어, 중국어, 일본어 글꼴은 자체 표 대신 Adobe-Korea1, Adobe-Japan1 같은 미리 정의된 문자 대응표(CMap)를 쓰는 경우가 많습니다. LeedyBox 도구는 PDF.js와 함께 이 CMap을 불러오므로, 단순한 추출 도구에서 깨지는 동아시아 문서도 상당수 제대로 읽습니다. 그 밖의 흔한 원인으로는 fi처럼 두 글자를 글리프 하나로 저장한 합자, 글자를 도형으로 그려 대응표가 없는 경우가 많은 Type 3 글꼴, 복사를 어렵게 하려고 일부러 인코딩을 뒤섞은 PDF가 있습니다.
페이지에 텍스트 레이어가 있으면 도구는 그 텍스트가 깨져 있어도 그대로 사용하고, 그 페이지에는 OCR을 실행하지 않습니다. 이런 페이지를 OCR로 읽으려면 PDF를 JPG로 도구로 이미지로 바꾼 뒤 이미지 텍스트 추출(OCR)로 읽으세요.
LeedyBox 도구가 OCR을 쓰는 경우
도구는 페이지마다 따로 판단합니다. 페이지의 텍스트 레이어가 15자 미만이면 그 페이지를 원래 크기의 두 배, 약 144ppi의 이미지로 그린 뒤 "OCR 언어"에서 고른 언어와 영어로 Tesseract.js가 읽습니다. 따라서 타이핑한 페이지와 스캔한 페이지가 섞인 문서에서도 타이핑한 페이지는 정확히 읽고, 스캔한 페이지만 OCR을 거칩니다.
도장이나 쪽 번호 때문에 글자가 몇 개 있는 스캔 페이지는 여전히 빈 페이지로 보고 OCR을 실행합니다. 반대로 이미 15자 이상의 텍스트 레이어가 있는 스캔본은 OCR을 실행하지 않으므로, 스캐너가 붙인 품질 낮은 OCR 레이어도 그대로 나옵니다. OCR 엔진과 언어 데이터는 OCR을 처음 실행할 때 leedybox.com에서 내려받기 때문에 첫 스캔 페이지는 더 오래 걸립니다. PDF는 브라우저에서 읽으며 업로드되지 않습니다.
OCR이 픽셀을 글자로 바꾸는 방식
OCR은 여러 단계로 진행됩니다. 엔진은 먼저 이미지를 흑백으로 바꾸고 글 덩어리, 줄, 단어를 찾는데, 이 단계를 페이지 분할이라고 합니다. 그다음 언어나 문자 체계별로 학습된 신경망이 줄마다 가장 그럴듯한 글자 순서를 고르며, 이때 그 언어의 단어 목록도 참고합니다. 결과는 복사본이 아니라 추정치입니다. 0과 O, 1과 l과 I, rn과 m처럼 모양이 비슷한 글자를 헷갈릴 수 있고, 언어 데이터에 없는 단어는 더 자주 잘못 읽힙니다.
언어 설정은 어떤 옵션보다 중요합니다. 라틴 문자로 학습한 모델은 태국어나 일본어를 읽지 못하고, 선택하지 않은 언어로 된 글은 대개 엉뚱한 글자로 나옵니다. LeedyBox 도구의 "영어만"을 제외한 모든 옵션은 선택한 언어에 영어를 더해 인식하므로, 영어 제품명이 들어간 한국어 계약서처럼 두 언어가 섞인 문서에 도움이 됩니다.
OCR 정확도에 영향을 주는 요인
| 요인 | 영향 | 도움이 되는 방법 |
|---|---|---|
| 해상도 | 작은 글자는 글자를 구별하는 세부가 사라짐 | 300DPI 이상으로 스캔, 작은 글자는 더 높게 |
| 기울어짐과 휘어짐 | 기울어진 줄과 휘어진 책 페이지는 줄 찾기를 방해함 | 평평하고 반듯하게 스캔, 바로 위에서 촬영 |
| 대비와 잡티 | 회색 배경, 얼룩, 뒷면 비침, JPEG 압축 흔적이 글자처럼 보임 | 흰 바탕에 진한 글자로 깨끗하게 스캔 |
| 글꼴 | 장식체, 아주 가늘거나 굵은 글꼴은 더 자주 틀림 | 결과를 꼼꼼히 확인 |
| 손글씨 | Tesseract는 인쇄된 글자로 학습됨 | 좋은 결과를 기대하기 어려우니 직접 입력 |
| 세로쓰기 | 세로로 쓴 일본어나 중국어는 자주 잘못 읽힘 | 꼼꼼히 확인하거나 다시 입력 |
도구가 페이지를 약 144ppi로 그리기 때문에, 각주나 계약서의 작은 글씨 같은 글자는 좋은 스캔본에서도 읽기 어려울 수 있습니다. 이런 페이지는 PDF를 JPG로 도구로 더 높은 해상도의 이미지로 바꾸고, 이미지 텍스트 추출(OCR)에서 작은 글자를 두 배 크기로 다시 읽거나 대비를 높인 뒤 인식할 수 있습니다.
표, 단, 레이아웃
결과는 일반 텍스트입니다. 표는 격자가 사라지고, 여러 단으로 된 페이지는 단별로 나오거나 단을 가로질러 줄 단위로 나올 수 있으며, 텍스트 상자와 캡션은 파일이나 OCR 엔진이 정한 순서의 어딘가에 들어갑니다. 단어를 인식하는 일과 레이아웃을 다시 만드는 일은 별개의 문제이고, 이 도구는 앞의 것만 해결합니다. 숫자가 든 표는 모든 값을 원본과 대조하거나 스프레드시트에 다시 입력하세요. 긴 문서는 텍스트를 추출한 뒤 편집기에서 제목과 문단을 다시 정리하세요.
결과 확인과 정리
- 숫자, 이름, 날짜 몇 개를 원본과 비교하세요. 숫자의 OCR 오류는 놓치기 쉽습니다.
- 0과 O, 1과 l과 I, 5와 S, rn과 m처럼 자주 헷갈리는 글자와 빠진 악센트나 성조 부호를 찾아보세요.
- 줄 끝에서 하이픈으로 나뉜 단어와 문단 중간에서 끊긴 줄을 다시 이으세요.
- 이어진 텍스트가 필요하면 페이지 표시, 머리글, 쪽 번호를 지우세요.
- "텍스트 복사"나 ".TXT 파일로 저장"으로 결과를 보관하세요. 저장한 파일은 UTF-8 일반 텍스트입니다.
자주 묻는 질문
왜 어떤 페이지는 비어 있나요?
그 페이지에 텍스트 레이어가 없었고 OCR도 읽을 만한 글자를 찾지 못한 경우입니다. 스캔이 비어 있거나 너무 흐리거나 작을 수 있고, 손글씨일 수도 있습니다. 더 선명하게 스캔하거나, PDF를 JPG로 도구로 페이지를 바꾼 뒤 이미지 텍스트 추출의 대비와 확대 옵션을 사용해 보세요.
비밀번호가 걸린 PDF도 읽을 수 있나요?
열 때 비밀번호를 묻는 PDF는 읽을 수 없고, 대신 오류가 표시됩니다. 권한이 있다면 PDF 뷰어에서 비밀번호로 연 뒤 보호를 해제한 사본을 먼저 저장하세요.
검색 가능한 PDF를 만들 수 있나요?
아니요. 결과는 복사하거나 .txt 파일로 저장할 수 있는 일반 텍스트이며, PDF 자체는 바뀌지 않습니다. 검색 가능한 PDF를 만드는 프로그램은 스캔한 페이지마다 보이지 않는 OCR 텍스트 레이어를 덧붙입니다.
긴 문서에서 OCR이 느린 이유는 무엇인가요?
OCR 엔진과 언어 데이터를 내려받은 뒤, 스캔한 페이지를 한 장씩 이미지로 그려 브라우저에서 인식하기 때문입니다. 느린 기기에서는 한 페이지에 몇 초 이상 걸릴 수 있습니다. 텍스트 레이어가 있는 페이지는 인식 과정이 필요 없어 훨씬 빠릅니다.