PDF를 이미지로 바꾸는 도구 다음 질문은 PDF를 EPUB으로 바꿀 수 있느냐였다. 쪽을 그림으로 넣는 방식과 글자를 뽑는 방식이 있다고 설명하자 글자 추출만 하자는 답이 왔다.
PDF에는 문단이 없다
PDF는 "이 글자를 종이의 이 좌표에 찍어라"라는 지시의 모음이다. pdf.js로 한 쪽을 읽으면 글자 조각 수백 개가 x, y 좌표와 함께 나온다. 줄은 높이가 같은 조각을 모아서 만들고, 문단은 줄과 줄 사이를 보고 정했다. 줄 간격이 평소의 1.5배를 넘거나, 다음 줄이 들여 쓰였고 앞 줄이 문장 부호로 끝났거나, 앞 줄이 오른쪽 끝에 못 미쳤고 마침표로 끝났으면 새 문단으로 본다. 쪽이 넘어갈 때도 같은 규칙을 쓴다. 홀수 쪽과 짝수 쪽은 여백이 다를 수 있어서 왼쪽 여백을 따로 쟀다.
시험 문서
정답을 아는 PDF가 필요했다. 이 사이트의 제작기 8편(한국어)과 7편(영어)을 A5 책 모양으로 조판해 PDF로 찍었다. 장마다 큰 제목을 달고, 첫 줄을 들여 쓰고, 양쪽 맞춤을 하고, 위에는 책 제목, 아래에는 쪽 번호를 넣고, 책갈피도 만들었다. 한국어는 낱말 중간에서도 줄을 바꾸는 판(break-all)과 낱말 사이에서만 바꾸는 판(keep-all) 두 가지를 만들었다. 그리고 변환 결과의 띄어쓰기를 원문과 한 자리씩 대조했다.
줄 끝의 한글
첫 결과는 영어 56문단 중 22개, 한국어 62문단 중 12개만 원문과 똑같았다. 영어는 크롬이 자동 줄 나눔에 쓰는 하이픈이 보통 하이픈(-)이 아니라 U+2010이라서 생긴 문제였고, 이를 고치자 띄어쓰기 3,958곳이 모두 맞았다.
한국어는 어려웠다. "난이"로 끝난 줄 다음에 "도였다"가 오면 붙여야 하고, "예외"로 끝난 줄 다음에 "여섯"이 오면 띄워야 한다. 사전 없이 정하려고 같은 문서의 줄 안쪽 글에서 통계를 냈다. 경계 앞 최대 세 글자와 뒤 최대 두 글자가 붙어서 나온 횟수와 띄어서 나온 횟수를 세고, 근거가 부족하면 범위를 줄여 가며 다시 센다. 그래도 근거가 없으면 그 글자가 낱말 끝·처음에 오는 비율로 정한다. 문서가 낱말 중간에서 줄을 바꾸는지도 먼저 판단해서, 낱말 사이에서만 바꾸는 문서에서는 줄 끝 한글을 언제나 띄운다.
낱말 사이에서만 바꾸는 판에서는 남은 오류가 대부분 문장 부호 쪽이었다. 크롬은 "『"나 "(" 앞에서도 줄을 바꾸고, 전각 괄호와 ㎡는 글자 폭 안에 여백이 있어서 pdf.js가 그 자리에 공백을 넣는다. 여는 괄호는 뒤에, 닫는 괄호는 앞에 붙이고, 숫자와 단위 사이 공백을 지우는 규칙을 더했다.
결과
띄어쓰기 3,092곳 기준으로 낱말 사이에서만 줄을 바꾼 한국어 PDF는 1곳, 낱말 중간에서도 바꾼 PDF는 21곳이 틀렸다(99.3%). 영어는 3,958곳 중 0곳이다. 만든 EPUB은 압축 파일 맨 앞의 mimetype, XML 문법, 목록에 적힌 파일이 다 있는지 확인했고, 브라우저용 EPUB 엔진(epub.js)에 열어 제목, 언어, 목차 8개, 표지, 본문이 나오는 것까지 봤다.