안녕하세요, まさきん입니다.
아이 학원 체험 수업에서 받은 전단을 스마트폰으로 스캔해서 AI에게 읽히려고 했습니다. 그런데 PDF에서 글자를 전혀 뽑을 수 없었습니다. 집안의 종이를 디지털로 바꾸는 분이라면 한 번쯤 부딪히는 이야기일 것 같아서, 구별하는 방법과 대처법을 메모해 둡니다.
※ 글 공개 시점의 정보입니다. 최신 조건은 공식 사이트에서 확인해 주세요.
- 스캔한 PDF의 글자를 읽어 낼 수 없을 때는 우선
pdftotext의 출력이 비어 있는지를 본다 - 비어 있다면
pdftoppm -r 200 -png로 페이지를 이미지로 만들어, AI에게는 이미지로 넘긴다 - 원인으로는 “이미지뿐인 PDF”, “OCR 레이어가 거칠다”, “문자 코드 대응이 없다”의 3종류를 생각할 수 있다
- 해상도는 AI에게 넘길 때는 150~200dpi, OCR을 다시 돌릴 때는 300dpi가 기준이다
- 금액이나 날짜 같은 숫자는 마지막에 반드시 종이 원본으로 확인한다
스캔한 PDF에서 글자를 뽑지 못했다
사용한 것은 Adobe Scan입니다. 학원 전단을 찍어서 PDF로 저장했습니다. 열어 보니 겉보기에는 깔끔합니다. 글자도 선택할 수 있을 것처럼 보였습니다.
그 PDF를 pdftotext라는 명령어에 넣었습니다. PDF에서 글자만 꺼내는 도구입니다. 결과는 비어 있었습니다. 쓸 만한 글자가 한 줄도 나오지 않았습니다.
그래서 페이지를 이미지로 바꿔 AI에게 넘겼습니다. 내용은 문제없이 읽어 냈습니다.
참고로 이것은 제 전단 한 장에서의 이야기입니다. 앱의 결함이라고 말하려는 것이 아닙니다. 스캔 앱의 PDF에서는 이런 일이 일어날 수 있다는 정리로 읽어 주세요.
PDF에는 “보이는 레이어”와 “글자 레이어”가 있다
스캔한 PDF는 종이를 찍은 사진이 바탕입니다. 그 위에 OCR로 읽어 낸 글자가 투명한 레이어로 겹쳐집니다. OCR은 이미지 속 글자를 데이터로 바꾸는 처리죠.
화면에 보이는 것은 사진 쪽입니다. 검색이나 복사에 쓰이는 것은 투명한 글자 레이어입니다. 그래서 겉보기가 깔끔해도 글자 레이어를 쓸 수 없는 경우가 있습니다.
AI에게 PDF를 넘길 때도 이 두 레이어가 관계됩니다. 글자 레이어만 읽는 도구라면, 레이어가 비어 있을 때 아무것도 전달되지 않습니다. 이것이 이번에 걸려 넘어진 정체라고 생각합니다.
증상을 구별하는 방법 3가지
엔지니어가 아니어도 확인할 수 있는 순서로 나열합니다.
- PDF를 열어 문장을 드래그한다. 선택할 수 없거나, 붙여 넣으면 글자가 깨진다
pdftotext를 돌린다. 출력이 비어 있거나 페이지 나눔 기호만 나온다pdffonts를 돌린다. 폰트가 한 줄도 나오지 않는다
첫 번째는 앱만으로 시험할 수 있습니다. 복사해서 메모장에 붙여 넣기만 하면 됩니다. 여기서 비어 있거나 글자가 깨진다면 글자 레이어는 기대하지 않는 편이 좋을지도 모릅니다.
원인으로 생각할 수 있는 3종류
저는 제 전단이 어느 쪽에 해당하는지 특정하지 않았습니다. 그래서 일반론으로서의 정리입니다.
| 종류 | 내용 | 복사·붙여넣기 결과 | pdffonts 표시 |
|---|---|---|---|
| 이미지뿐인 PDF | 글자 레이어가 애초에 없다 | 선택할 수 없다 | 폰트가 나오지 않는다 |
| OCR 레이어가 거칠다 | 레이어는 있지만 오인식이 많다 | 다른 글자나 빠진 문장이 된다 | 폰트는 나온다 |
| 문자 코드 대응이 없다 | 글자와 Unicode의 대응표가 없거나 깨져 있다 | 기호나 공백이 된다 | uni 열이 no인 경우가 있다 |
세 번째는 조금 보충이 필요합니다. pdffonts의 공식 매뉴얼에는 uni라는 열에 대한 설명이 있습니다. ToUnicode라는 대응표가 PDF에 있으면 yes가 되는 열입니다.
다만 매뉴얼에는 주의 사항도 있습니다. 대응표가 없어도 글자로 변환할 수 없다고는 단정할 수 없다는 내용입니다. 그러니 uni가 no라고 해서 곧바로 탈락은 아닙니다. 단서 중 하나 정도로 봐 두는 것이 좋다고 생각합니다.
pdftotext의 매뉴얼에도 비슷한 이야기가 BUGS 항목에 적혀 있습니다. 인코딩이 깨진 폰트를 포함한 PDF가 있다. 그 경우에는 OCR 말고는 글자를 꺼낼 방법이 없다. 그런 취지입니다. 도구 쪽에서도 “뽑을 수 없는 PDF는 있다”고 인정하고 있는 거네요.
poppler 설치 방법
pdftotext와 pdftoppm은 poppler라는 소프트웨어에 포함되어 있습니다. PDF를 다루는 대표적인 무료 도구입니다.
| 환경 | 설치 방법 | 보충 |
|---|---|---|
| macOS | brew install poppler | Homebrew가 필요 |
| Ubuntu / Debian | sudo apt install poppler-utils | 패키지 이름은 poppler-utils |
| Windows | WSL의 Ubuntu에 위의 apt로 설치 | 공식 사이트는 소스 배포가 중심 |
Windows는 조금 번거롭습니다. poppler 공식 사이트가 배포하는 것은 소스 코드이고, 각 OS용은 배포처의 패키지를 쓰는 방식입니다. 저라면 WSL로 Ubuntu를 설치하고 거기서 apt를 쓸 것 같습니다.
설치됐는지는 다음으로 확인할 수 있습니다.
pdftotext -v
버전 번호가 나오면 OK입니다.
대처 순서
흐름은 5단계입니다. 네 번째까지로 대부분의 종이는 정리될 것이라 생각합니다.
순서 1: pdftotext로 비어 있는지 확인
우선 글자 레이어를 쓸 수 있는지 봅니다. 파일 이름은 예시로 flyer.pdf라고 해 두었습니다.
pdftotext -layout flyer.pdf flyer.txt
wc -c flyer.txt
-layout은 원래의 겉보기 배치를 되도록 유지하는 옵션입니다. 전단처럼 단 나눔이 많은 종이에서는 붙이는 편이 읽기 쉬워집니다. wc -c는 파일 크기를 세기만 하는 명령어입니다.
숫자가 0이나 한 자릿수라면 글자를 뽑지 못한 것입니다. 제 전단은 여기서 비어 있었습니다. 반대로 문장이 제대로 나온다면 그대로 쓸 수 있습니다. 이미지로 만들 필요가 없습니다.
페이지를 좁히려면 -f와 -l을 씁니다. 첫 페이지와 마지막 페이지 번호죠.
pdftotext -f 1 -l 2 -layout flyer.pdf -
마지막의 -는 파일에 쓰지 않고 화면에 출력하라는 지정입니다.
순서 2: pdffonts와 pdfimages로 내용 보기
여기는 생략해도 괜찮습니다. 다만 원인을 짐작할 수 있어서 저는 해 두고 싶은 쪽입니다.
pdffonts flyer.pdf
pdfimages -list flyer.pdf
pdffonts는 PDF 안의 폰트를 목록으로 보여 줍니다. 머리글 줄만 나온다면 글자 레이어는 없다고 봐도 될 것 같습니다. pdfimages -list는 안에 든 이미지를 목록으로 보여 줍니다. 페이지마다 큰 이미지가 한 장씩 있다면 스캔에서 만들어진 PDF죠.
순서 3: pdftoppm으로 페이지를 이미지로 만들기
글자를 뽑을 수 없다면 페이지별 이미지로 바꿉니다.
pdftoppm -r 200 -png flyer.pdf page
이렇게 하면 page-1.png, page-2.png 같은 파일이 만들어집니다. -r은 해상도이고 단위는 dpi입니다. 지정하지 않으면 150이 됩니다. -png를 붙이지 않으면 PPM이라는 다루기 어려운 형식으로 나오므로, 여기는 잊지 않는 편이 좋습니다.
한 페이지만 필요할 때는 이렇게 합니다.
pdftoppm -r 200 -png -f 1 -l 1 -singlefile flyer.pdf flyer
-singlefile을 붙이면 번호 없는 flyer.png가 한 장만 만들어집니다.
순서 4: AI에게는 이미지로 넘기기
만들어진 PNG를 그대로 AI 채팅에 첨부합니다. 제 경우에는 이것으로 내용을 읽어 낼 수 있었습니다.
부탁하는 방법은 구체적으로 하는 편이 결과가 안정됩니다. 예를 들면 이런 문구입니다.
첨부한 것은 전단을 스캔한 이미지입니다.
일시·장소·준비물·요금·신청 기한을 표로 만들어 주세요.
읽지 못한 부분은 추측하지 말고 "판독 불가"라고 적어 주세요.
마지막 한 줄이 중요하다고 생각합니다. AI는 읽지 못한 글자를 그럴듯하게 채워 버리는 경우가 있기 때문입니다.
PDF 그대로 넘기면 안 되는 걸까
안 되는 것은 아닙니다. Claude의 개발자용 문서에는 PDF의 각 페이지를 이미지로 변환하는 처리가 적혀 있습니다. 페이지에서 추출한 글자와 이미지 양쪽을 넘기는 구조입니다. Gemini의 문서에도 PDF를 이미지로서 이해한다는 취지의 설명이 있습니다.
그래서 앱에 PDF를 직접 넣으면 읽을 수 있는 경우도 많을 것입니다. 곤란한 것은 글자 추출만 쓰는 경로에 올라탔을 때죠. 직접 만든 스크립트로 pdftotext의 결과만 넘기는 경우가 그렇습니다.
페이지 수가 많은 PDF도 주의가 필요합니다. Claude의 도움말에는 페이지 수가 많으면 글자만 처리하게 된다는 취지의 기재가 있습니다. 망설여지면 이미지로 만들어 넘긴다, 를 기본으로 해 두면 안심이지 않을까요.
가계와 관련된 종이를 AI에게 읽히는 장면은 앞으로도 늘어날 것 같습니다. 요금표를 비교하는 작업은 통신비 재검토에서도 마찬가지였습니다.
누르면 라쿠텐 로그인 페이지가 열립니다. 로그인하면 캠페인 내용이 표시됩니다.
순서 5: 필요하면 OCRmyPDF로 레이어를 다시 붙이기
PDF 자체를 검색할 수 있는 형태로 남기고 싶다. 그럴 때는 글자 레이어를 다시 붙이는 방법이 있습니다. OCRmyPDF라는 무료 도구입니다.
공식 문서에 따르면 스캔한 이미지 PDF에 글자 레이어를 더해 검색할 수 있게 해 주는 것입니다. OCR의 알맹이로는 Tesseract라는 엔진을 쓰고 있습니다.
brew install ocrmypdf
brew install tesseract-lang
ocrmypdf -l jpn --redo-ocr flyer.pdf flyer-ocr.pdf
-l jpn은 일본어로 읽게 하는 지정입니다. 지정하지 않으면 영어로 취급됩니다. 일본어 종이에서 이것을 잊으면 결과가 꽤 무너질 것 같습니다. Ubuntu라면 언어 데이터는 tesseract-ocr-jpn 같은 별도 패키지로 설치합니다.
--redo-ocr은 다른 소프트웨어가 붙인 OCR을 다시 하라는 지정입니다. 잘되지 않으면 --force-ocr이 있습니다. 다만 이쪽은 모든 페이지를 이미지로 다시 만듭니다. 화질이 떨어질 가능성이 있다고 공식에도 적혀 있습니다.
그렇다고 해도 정밀도에는 한계가 있습니다. 문서 스스로도 상용 OCR에 미치지 못하는 경우가 있다고 쓰고 있습니다. 전단 한 장을 읽는 정도라면 이미지를 AI에게 넘기는 쪽이 빠르겠네요.
해상도의 기준
-r의 숫자를 얼마로 할지는 넘기는 상대에 따라 바꿉니다. A4 종이로 계산하면 이렇게 됩니다.
| 해상도 | A4의 화소 수(대략) | 맞는 사용법 |
|---|---|---|
| 150dpi(기본값) | 1240 × 1754 | 보통 크기의 글자를 AI에게 읽힌다 |
| 200dpi | 1654 × 2339 | 작은 주의 문구가 있는 전단 |
| 300dpi | 2480 × 3508 | Tesseract 등의 OCR에 넣는다 |
크게 하면 좋은 것은 아닙니다. Claude의 문서에는 상한을 넘는 이미지는 처리 전에 축소된다고 적혀 있습니다. Gemini도 큰 페이지는 최대 3072 × 3072로 축소한다고 설명하고 있습니다. 너무 올려도 버려질 뿐이네요.
한편 Tesseract 공식 문서는 300dpi 이상의 이미지에서 잘 작동한다고 하고 있습니다. 그래서 제 기준은 두 가지입니다. AI에게는 150~200으로, OCR에는 300으로 합니다.
작은 글자를 읽지 못할 때는 해상도를 올리기보다 잘라 내는 쪽이 효과적일지도 모릅니다. 요금표 부분만 별도 이미지로 만들어 넘기는 방식입니다.
숫자는 반드시 원본으로 확인한다
이미지로 읽어 냈다고 해서 숫자까지 맞다고는 할 수 없습니다.
같은 날, 체험 설명회 녹음도 받아쓰기를 하고 있었습니다. 이쪽은 금액을 잘못 알아들은 부분이 있었습니다. 해당 부분만 잘라 내어 정밀도가 높은 모델로 다시 돌려서 확정했습니다. 경위는 Whisper가 금액 숫자를 틀린 이야기에 썼습니다.
종이든 소리든, AI가 내놓은 숫자는 초안입니다. 월 회비나 신청 기한 같은 숫자는 마지막에 종이 원본과 대조한다. 이것만큼은 생략하지 않는 편이 좋다고 생각합니다.
개인정보가 들어 있는 종이를 넘길 때의 주의
학교나 학원에서 받은 종이에는 이름이나 연락처가 실려 있는 경우가 있습니다. AI에게 넘기기 전에 잠깐 멈춰 서고 싶은 부분입니다.
- 이름·주소·전화번호·얼굴 사진이 찍혀 있지 않은지 먼저 본다
- 필요 없는 부분은 이미지를 잘라 낸 뒤에 넘긴다
- 쓰고 있는 AI 서비스의 데이터 취급(학습에 쓰이는지에 대한 설정)을 한번 확인해 둔다
- 다른 가정의 이름이 실린 명단이나 연락망은 애초에 넘기지 않는다
이미지로 해 두는 이점은 여기에도 있습니다. PDF 그대로는 일부를 가리기가 번거롭습니다. 이미지라면 스마트폰의 사진 앱에서 잘라 내기만 하면 됩니다.
하나 더. PDF에는 작성 일시나 앱 이름 같은 정보가 들어 있는 경우가 있습니다. 이미지로 바꾸면 그것이 빠지므로, 넘기는 정보를 줄인다는 의미에서도 나쁘지 않다고 느끼고 있습니다.
스캔할 때의 요령
뒷공정이 편해지는 것은 결국 찍는 방법입니다. 일반적으로 알려진 것들을 나열해 둡니다.
- 밝은 곳에서 종이에 그림자가 지지 않게 찍는다
- 종이를 평평하게 하고 바로 위에서 찍는다
- 접힌 자국이나 휘어짐은 펴고 나서 찍는다
- 양면인 종이는 뒷면도 잊지 말고 찍는다
- 앱의 텍스트 인식 언어를 확인한다
마지막 항목은 Adobe Scan 공식 도움말에서 확인했습니다. 텍스트 인식은 기본적으로 켜져 있습니다. 환경 설정의 “저장한 PDF에서 텍스트 인식 실행”에서 끌 수도 있습니다.
인식하는 언어는 기본값으로는 기기의 언어가 된다고 합니다. 환경 설정의 “텍스트 인식 언어”에서 바꿀 수 있습니다. 지원 언어에는 일본어도 들어 있습니다. 기기를 영어로 쓰고 있는 분은 여기를 일본어로 해 두면 좋을지도 모릅니다.
도움말에는 페이지 수가 많은 스캔에서는 OCR이 실행되지 않는다는 취지도 적혀 있습니다. 상한은 무료와 유료에서 다른 것 같습니다. 수십 페이지를 한꺼번에 찍는 분은 공식의 최신 기재를 봐 두세요.
흔한 실패와 함정
겉보기로 판단해 버린다. 화면에서 깔끔하게 읽혀도 글자 레이어를 쓸 수 있다고는 할 수 없습니다. 복사·붙여넣기를 한 번 해 보기만 하면 알 수 있습니다.
-png 붙이는 것을 잊는다. pdftoppm은 그대로 두면 PPM 형식으로 출력합니다. AI 채팅에 첨부할 수 없는 경우가 많으므로 PNG나 JPEG를 지정합니다.
해상도를 너무 올린다. 600dpi로 출력하면 파일이 커집니다. 업로드 상한에 걸리거나 결국 축소되거나 합니다.
OCR 언어를 지정하지 않는다. OCRmyPDF는 지정이 없으면 영어로 읽습니다. 일본어 종이에는 -l jpn이 필요합니다.
AI가 읽은 내용을 그대로 일정에 넣는다. 날짜나 금액은 원본과 대조한 뒤에 등록하는 편이 안전합니다. 프린트를 일정으로 옮기는 흐름은 학교 프린트를 캘린더와 리마인더에 등록하는 구조에 써 두었습니다.
- PDF의 문장을 복사해서 메모장에 제대로 붙여 넣을 수 있는지 시험했는가
- pdftotext의 출력이 비어 있는지 확인했는가
- pdftoppm에 -png와 -r 지정을 붙였는가
- 넘기는 이미지에 이름이나 연락처 같은 개인정보가 찍혀 있지 않은가
- 금액과 날짜를 종이 원본과 대조했는가
자주 묻는 질문
Q. 스캔한 PDF의 글자를 읽어 낼 수 없는 이유는 무엇인가요?
글자 레이어가 없거나, 있어도 쓸 수 없는 상태가 되어 있다고 생각할 수 있습니다. 대표적인 것은 3가지입니다. 이미지뿐인 PDF와 OCR의 오인식. 그리고 문자 코드 대응이 없는 경우입니다. 어느 쪽에 해당하는지는 pdftotext와 pdffonts로 어느 정도 짐작할 수 있습니다.
Q. pdftotext가 비어 있어도 오류가 나지 않는 이유는 무엇인가요?
글자 레이어가 없는 PDF는 망가진 것이 아니기 때문입니다. 꺼낼 글자가 없으므로 빈 결과를 정상적으로 돌려줍니다. 오류가 나지 않는 만큼 자동 처리에서는 알아차리기 어렵죠.
Q. 명령어를 쓰지 않고 해결하는 방법이 있나요?
있습니다. PDF를 연 화면을 스크린샷으로 찍으면 그것이 이미지입니다. 스마트폰이라면 원래 사진을 그대로 AI에게 넘기는 것도 방법이라고 생각합니다. 장수가 많을 때만 명령어가 편해집니다.
Q. PNG와 JPEG 중 어느 쪽이 좋은가요?
글자가 중심인 종이라면 PNG가 무난합니다. JPEG는 압축 때문에 글자 테두리가 번지는 경우가 있습니다. 다만 파일이 너무 클 때는 -jpeg로 바꾸면 가벼워집니다.
Q. PyMuPDF 같은 다른 도구를 써도 되나요?
괜찮습니다. 저는 학습지 일괄 스캔과 분류에서는 PyMuPDF로 이미지를 만들고 있습니다. 하는 일은 같아서, 페이지를 이미지로 바꿀 뿐입니다. 가지고 있는 도구로 충분하다고 생각합니다.
Q. OCRmyPDF는 반드시 써야 하나요?
아니요. AI에게 내용을 읽히기만 한다면 이미지로 충분합니다. PDF를 보관해 두고 나중에 검색하고 싶다는 목적이 있을 때의 선택지입니다.
Q. 손글씨도 읽을 수 있나요?
AI의 이미지 읽기라면 읽을 수 있는 경우가 많습니다. 다만 버릇이 심한 글씨나 연한 연필 글씨는 오독이 늘어납니다. Tesseract 같은 기존 방식의 OCR은 손글씨에 강하지 않다고 알려져 있습니다.
Q. 스마트폰만으로 끝낼 수 있나요?
가능합니다. 스캔 앱에서 이미지(JPEG)로 내보내 AI 앱에 넘기면 같은 일입니다. PDF로 만들 필요가 있는 것은 여러 페이지를 한 파일로 묶고 싶을 때 정도일지도 모릅니다.
참고한 공식 정보
- poppler 공식 사이트
- pdftotext 매뉴얼(Debian manpages)
- pdftoppm 매뉴얼(Debian manpages)
- pdffonts 매뉴얼(Debian manpages)
- pdfimages 매뉴얼(Debian manpages)
- poppler(Homebrew Formulae)
- Adobe Scan 설정(Adobe 공식 도움말)
- OCRmyPDF Introduction
- OCRmyPDF Cookbook
- OCRmyPDF 언어 팩 추가
- Tesseract: Improving the quality of the output
- Claude PDF support(Claude Docs)
- Claude Vision(Claude Docs)
- Uploading files to Claude(Claude 도움말 센터)
- Gemini API Document understanding
정리
스캔한 PDF는 겉보기와 글자 레이어가 별개입니다. pdftotext가 비어 있다면 고민하지 말고 pdftoppm으로 이미지로 만든다. 제 환경에서는 그것으로 읽을 수 있었습니다. 원인 특정은 뒤로 미뤄도 곤란하지 않다고 생각합니다.
종이의 정보가 데이터가 되면 비교하는 작업이 편해집니다. 학원 월 회비도, 스마트폰 요금도 마찬가지죠. 숫자를 나란히 놓고 보기만 해도 판단은 꽤 가벼워지지 않을까요.
이 글에는 제휴 광고가 포함되어 있습니다. 이 사이트의 링크를 통해 상품·서비스에 신청하시면 제휴사로부터 보상을 받을 수 있습니다. 또한 운영자는 라쿠텐 그룹 소속 직원으로, 사원 추천 프로그램을 통해 보상을 받는 경우가 있습니다. 기사 내용과 평가는 광고 유무와 관계없이 운영자의 실제 경험과 조사를 바탕으로 작성했지만, 위 관계를 이해하신 후 읽어 주시기 바랍니다. 자세한 내용은 면책조항·제휴 링크 안내를 참고해 주세요. 면책조항·제휴 링크 안내
이 글에는 기계 번역이 포함되어 있습니다. 정확한 조건은 라쿠텐 모바일 공식 사이트의 다국어 페이지에서 확인해 주세요.
라쿠텐 모바일의 통신 지역·전파 상황이 궁금하신 분은, 공식 전파 개선·조사 요청 양식 을 통해 문의하실 수 있습니다.