PDF에서 검색이 안 되는 이유
PDF는 배치가 고정된 텍스트 형식이 아니다. 이 위치에 이 글리프를 그려라, 이 사각형에 이 이미지를 칠해라 같은 명령의 목록, 즉 페이지 기술서다. 워드프로세서가 만든 페이지는 문자를 그리므로 검색이 된다. 스캐너나 폰 카메라가 만든 페이지는 그림 한 장을 그리고, 파일 안의 그 무엇도 그 그림이 무슨 말을 하는지 알지 못한다.
화면에서는 똑같아 보이는 두 종류의 페이지
텍스트 페이지에는 폰트와 문자 코드와 좌표가 들어 있다. 스캔된 페이지에는 보통 종이 한 장을 통째로 담은 이미지 하나뿐이고 그 외에는 아무것도 없다. 둘 다 글이 적힌 페이지로 그려지며, 보통 배율에서는 구별할 수 없다.
차이는 페이지를 그리는 게 아니라 읽으려 할 때만 드러난다. 검색, 선택, 복사, 스크린 리더, 데이터를 뽑아가는 프로그램이 모두 그렇다. 이들에겐 문자가 필요한데, 스캔된 페이지에는 문자가 없다.
몇 초 만에 구별하는 법
한 줄을 드래그해 보라. 단어가 하이라이트되지 않고 영역에 사각형이 그려진다면 그 페이지는 이미지다. 그다음 크게 확대해 보라. 진짜 텍스트는 폰트 외곽선에서 다시 그려지므로 아무리 확대해도 선명하지만, 스캔은 픽셀이 드러난다.
파일 크기도 단서다. 평범한 텍스트 한 페이지는 대개 수 킬로바이트인 반면, 스캔된 페이지는 사진이라 수백 킬로바이트에서 수 메가바이트다. 스무 쪽짜리 문서가 40메가바이트라면, 겉보기와 무관하게 스캔본이다.
복사하면 깨진 글자가 나오는 경우
페이지에 텍스트가 분명히 들어 있는데도 복사하면 알 수 없는 문자가 나올 때가 있다. 생성 프로그램은 폰트의 일부만 끼워 넣고 글리프에 번호를 마음대로 매길 수 있어서, 글자 A에 저장된 코드가 어떤 숫자든 될 수 있다. 그 숫자를 진짜 문자로 되돌리는 표는 선택 사항이고, 그것이 없거나 잘못되어 있으면 추출은 성실하게 엉뚱한 글자를 돌려준다.
같은 자리에서 나오는 작은 현상이 둘 더 있다. 합자는 글리프 하나라서 fi나 ffi가 한 문자로 뭉치거나 아예 빠진 채 나올 수 있다. 그리고 PDF에는 우리가 기대하는 의미의 공백 문자가 없다. 단어 사이의 간격은 대개 새 위치로 이동하라는 명령일 뿐이며, 추출된 텍스트에서 단어가 붙어 나오는 이유가 이것이다.
단어 순서가 뒤죽박죽으로 나오는 이유
PDF 안에는 읽는 순서를 알려주는 정보가 없다. 글리프는 만든 프로그램이 내보낸 순서대로 그려지며, 2단 편집이라면 왼쪽 단 한 줄, 오른쪽 단 한 줄이 번갈아 나오는 식이 될 수 있다.
그래서 모든 추출기는 기하학적 위치로 순서를 재구성하고, 머리말과 각주와 표와 여백 상자가 바로 그 추정이 무너지는 지점이다. 뽑은 텍스트가 빠짐없이 다 있는데 뒤섞여 있다면 원인은 이것이고, 텍스트가 아예 없는 문제와는 다른 문제다.
OCR이 실제로 더하는 것
광학 문자 인식은 그림을 바꾸지 않는다. 이미지를 읽어 문자를 추정한 뒤, 해당 글자 위치에 보이지 않는 텍스트로 그 결과를 써 넣는다. 눈에 보이는 것은 여전히 스캔 이미지이고, 검색이 찾는 것은 그 밑에 깔린 텍스트다.
그래서 OCR의 품질은 이미지와 달리 그대로 굳는다. 흔한 오인식은 이후의 모든 검색에 남는다. rn을 m으로, 대문자 O를 0으로, 소문자 l을 숫자 1로 읽는 식이다. 언어를 잘못 잡으면 더 나쁘다. 악센트 문자나 비라틴 문자가 선택된 알파벳이 허용하는 것 안으로 억지로 대응되기 때문이다.
검색 가능한 PDF인데도 못 찾을 때
해상도가 가장 흔한 원인이다. 인식에는 인쇄면 기준 300dpi 정도가 필요하고, 200 아래로 내려가면 작은 글자의 획이 서로 붙어 정확도가 급격히 무너진다. 비스듬히 찍은 사진은 기울기까지 더해지는데, 기울어진 줄은 문자 인식이 시작되기도 전에 줄을 찾는 단계를 흔든다.
OCR이 잘못된 것처럼 보이지만 사실은 아닌 경우도 둘 있다. 문서가 암호화되면서 추출 금지 권한이 걸려 있으면, 텍스트는 있는데 뷰어가 내주기를 거부한다. 또 페이지가 이미지가 아니라 페이지 속성으로 회전되어 있으면, 텍스트 층이 눈에 보이는 글자와 90도 어긋난 채 놓이게 된다.
효과가 있는 작업 순서
먼저 텍스트를 추출해서 무엇이 나오는지 읽어라. 그게 파일이 실제로 담고 있는 것에 대한 사실이다. 아무것도 안 나오면 스캔본이다. 다 있는데 뒤섞여 있으면 순서 문제이지 층이 없는 게 아니다. 구조는 알아보겠는데 글자가 틀렸다면 폰트 대응표가 깨진 것이고, 해법은 추출기와 씨름하는 게 아니라 원본 문서에서 다시 내보내는 것이다.
스캔본이라면 보관하기 전에 인식을 돌리고, 원본은 남겨 두어라. OCR은 파일에 기록된 추정이고 이미지는 증거다. 그리고 가진 것 중 가장 높은 해상도로 하라. 페이지를 먼저 압축하면 인식기가 필요로 하는 바로 그 세부가 사라진다.