작성일·마지막 확인: 2026-08-29
PDF는 화면에 문장이 보인다는 이유만으로 “텍스트가 들어 있는 문서”라고 단정하기 어렵다. 페이지 전체가 이미지일 수도 있고, 글자 모양과 문자 코드의 연결이 어긋나 있을 수도 있다. 두 단 편집이나 표 때문에 추출 순서만 망가지는 경우도 있다. 제가 PDF 자동화에서 가장 먼저 지키는 원칙은 빈 결과를 내용 없음으로, 깨진 결과를 원문으로 해석하지 않는 것이다. 추출 도구가 파일을 열었다는 사실과 문서를 정확히 읽었다는 사실은 다르다.
이 글이 필요한 사람
Windows에서 Python 계열 도구로 PDF를 검색 가능하게 만들거나, 문서 내용을 요약·분류하기 전에 텍스트를 뽑아야 하는 운영자에게 맞춘 글이다. 특히 스캔 계약서, 표가 많은 보고서, 한글 글꼴이 포함된 자료처럼 문서마다 상태가 다른 작업을 한 번의 명령으로 처리하려는 경우에 도움이 된다. 특정 도구의 정확도를 보장하는 글은 아니며, 중요한 원문 확인을 자동화로 대체하지 않는다.
기준 환경과 준비
- Windows PC
- 원본 PDF의 읽기 전용 사본
- Python 기반 PDF 텍스트 추출 도구
- 필요한 경우 OCR 도구와 페이지 이미지 렌더링 도구
- 원본 페이지와 추출 결과를 나란히 확인할 수 있는 화면
원본은 덮어쓰지 않는다. OCR을 적용한 PDF, 페이지 이미지, 추출 텍스트는 별도 작업 폴더에 만든다. 파일명에는 실제 고객명이나 개인정보를 추가하지 않고 내부 ID를 쓴다. 암호화되었거나 열람 권한이 제한된 문서는 권한을 우회하지 않고 문서 소유자에게 접근 가능한 사본을 요청한다.
1단계: PDF가 어떤 유형인지 분류한다
먼저 뷰어에서 한 문장을 드래그해 선택하고 복사해 본다. 자연스러운 문장이 붙여넣어지면 텍스트 층이 있을 가능성이 높다. 페이지가 통째로 선택되거나 아무것도 복사되지 않으면 스캔 이미지일 수 있다. 하지만 이것만으로 확정하지 않는다. 일부 PDF는 이미지 위에 품질이 낮은 숨은 OCR 텍스트가 있고, 선택은 되지만 내용이 전혀 다를 수도 있다.
프로그램으로는 전체 페이지 수, 페이지별 추출 문자 수, 텍스트가 비어 있는 페이지 목록을 먼저 수집한다. 일부 페이지만 스캔된 혼합형 문서도 있으므로 첫 페이지만 보고 문서 전체 방식을 결정하지 않는다. 문자 수 기준은 경고 신호이지 품질 판정 자체가 아니다. 짧은 표지나 이미지 페이지는 정상적으로 글자가 적을 수 있다.
2단계: 텍스트 층이 있다면 추출 순서를 본다
글자가 나온다고 바로 다음 자동화에 넘기지 않는다. PDF는 화면상의 좌표와 내부 저장 순서가 다를 수 있다. 머리말이 본문 중간에 끼거나, 왼쪽 단을 읽다 오른쪽 단으로 이동하지 않고 줄 단위로 섞일 수 있다. 표에서는 열 제목과 값의 관계가 무너지기도 한다. 첫 페이지, 중간 페이지, 마지막 페이지를 골라 원본의 읽는 순서와 추출 결과를 직접 대조한다.
한글이 네모나 다른 문자로 나오면 글꼴 매핑 문제를 의심한다. 추출 라이브러리를 바꿔 비교하거나, 가능하다면 PDF를 만든 원본 문서에서 텍스트를 받는 편이 낫다. PDF를 다시 인쇄해 새 PDF로 만드는 방법은 링크, 태그, 검색 가능한 텍스트를 잃을 수 있으므로 원본 보존 없이 시도하지 않는다.
3단계: 스캔 페이지는 이미지 품질부터 확인한다
OCR 전에 페이지를 이미지로 렌더링해 기울기, 잘린 가장자리, 흐림, 그림자, 작은 글씨를 본다. 해상도를 무조건 높인다고 원래 없던 세부가 생기지는 않는다. 기울기 보정과 회전 방향 정리는 도움이 될 수 있지만, 전처리를 강하게 하면 얇은 획이나 마침표가 사라질 수 있다. 전처리 사본과 원본 이미지를 모두 남겨 비교할 수 있게 한다.
언어 설정도 확인한다. 한국어 문서에 영어만 지정하면 한글 인식이 나빠질 수 있고, 여러 언어를 과도하게 넣으면 비슷한 글자를 잘못 선택할 수 있다. 사용하는 OCR 엔진이 요구하는 언어 데이터와 옵션은 공식 문서에서 확인한다. OCRmyPDF의 기본 사용법과 제약은 OCRmyPDF 공식 문서, Tesseract 사용 정보는 Tesseract 공식 문서에서 확인할 수 있다.
4단계: 중요한 값은 별도 검증한다
OCR 결과가 문장처럼 자연스러워도 숫자와 고유명사는 틀릴 수 있다. 날짜의 1과 7, 숫자 0과 영문 O, 소수점과 쉼표처럼 형태가 비슷한 문자는 특히 주의한다. 계약금액, 계좌, 주소, 이메일, 표의 합계처럼 영향이 큰 항목은 원본 이미지를 보며 사람이 확인하고, 확인하지 못한 값은 “판독 불가” 또는 “원본 확인 필요”로 표시한다.
자동 검사는 보조 장치로 쓴다. 날짜 형식, 이메일 형식, 표의 합계 관계를 검사해 이상한 값을 찾을 수 있지만 형식이 맞는 오인식까지 잡아내지는 못한다. 사전이나 언어 모델이 문맥에 맞게 단어를 고쳐 주더라도 그것은 원문 복원이 아니라 추정일 수 있다. 수정값과 원시 OCR 결과를 분리해 보관한다.
5단계: 추출 범위와 실패를 기록한다
결과 파일에는 사용한 도구와 옵션, 처리한 페이지 범위, 텍스트가 비었던 페이지, OCR 적용 페이지를 기록한다. 프로그램 버전과 실행 날짜도 재현에 도움이 된다. 다만 로그에 원문 전체나 민감정보를 남기지는 않는다. 추출률이 낮거나 대표 페이지 대조에서 오류가 많다면 부분 성공으로 명시하고 다음 단계의 자동 요약이나 게시를 중단한다.
실무 예시: 일부 페이지만 비어 있는 문서
다음은 점검 흐름을 설명하기 위한 가상 예시이며 실제 처리 결과가 아니다. 여러 페이지 PDF에서 일부 페이지의 추출 글자 수가 0이라고 하자. 먼저 빈 페이지를 이미지로 렌더링해 정말 빈 종이인지, 도장이나 표가 있는 스캔인지 확인한다. 스캔이라면 해당 페이지만 OCR 사본으로 처리하고, 원래 텍스트가 있던 페이지는 불필요하게 다시 OCR하지 않는다. 마지막에는 빈 페이지 주변의 문장 연결, 해당 페이지의 숫자와 제목, 전체 페이지 순서를 원본과 대조한다. 확인하지 못한 칸은 앞뒤 문맥으로 채우지 않는다.
자주 하는 나쁜 접근
- 추출 명령이 오류 없이 끝났다는 이유로 모든 페이지가 읽혔다고 보는 것
- 첫 페이지만 확인하고 전체 문서를 텍스트형 또는 스캔형으로 단정하는 것
- 문자 수가 많다는 이유로 다단 편집의 읽기 순서와 표 구조를 확인하지 않는 것
- OCR이 모르는 고유명사를 문맥상 자연스러운 이름으로 자동 교정하는 것
- 원본 PDF에 OCR 결과를 바로 덮어써서 비교와 복구가 어렵게 만드는 것
- 민감한 문서를 이용약관과 저장 정책을 확인하지 않은 외부 OCR 사이트에 올리는 것
검증 체크리스트
- 원본 해시나 읽기 전용 사본을 보존했는가
- 전체 페이지 수와 처리된 페이지 수가 일치하는가
- 텍스트가 비어 있거나 비정상적으로 짧은 페이지를 목록화했는가
- 첫·중간·마지막 페이지를 원본과 대조했는가
- 두 단 문서와 표의 읽는 순서가 유지되는가
- 날짜, 숫자, 이메일, 고유명사를 표본 확인했는가
- OCR 언어와 회전 방향이 문서에 맞는가
- 판독 불가 부분을 추측으로 채우지 않았는가
- 추출 결과를 다음 자동화에 넘기기 전 품질 경고를 반영했는가
보안과 개인정보 주의
문서 처리 도구가 로컬에서 실행되는지, 파일이나 텍스트를 외부 서버로 보내는지 먼저 확인한다. 외부 서비스를 써야 한다면 보관 기간, 학습 사용 여부, 삭제 방법, 처리 지역과 계약 조건을 검토한다. 고객 문서와 개인정보는 목적에 필요한 페이지만 최소화하고, 임시 이미지와 OCR 캐시도 작업 후 정책에 따라 삭제한다. 공개용 오류 보고에는 원문 페이지를 붙이지 말고 재현 가능한 비식별 샘플을 만든다.
공식 참고 문서
함께 읽을 작업 노트
추출한 문서를 고객별로 연결해야 한다면 CSV 고객사 레지스트리 만드는 방법을 참고할 수 있다. 문서가 외부 서비스로 전송되거나 결과가 게시되는 흐름이라면 사람이 반드시 승인해야 하는 작업도 함께 점검해야 한다.