본문으로 건너뛰기
ezyPDF
문서 구조

PDF 파일 안에는 무엇이 들어 있나 — 구조 해부

8분 분량

PDF가 왜 어떤 작업은 빠르고 어떤 작업은 어려운지, 왜 손상된 파일이 생기는지는 내부 구조를 알면 자연스럽게 이해됩니다.

PDF는 '객체'들의 창고입니다

PDF 파일을 텍스트 편집기로 열면 맨 앞에 %PDF-1.7 같은 버전 표기가 보이고, 이어서 '1 0 obj … endobj' 같은 블록이 반복됩니다. 이 블록 하나하나가 객체입니다. 페이지 하나, 글꼴 하나, 이미지 하나가 각각 번호가 붙은 객체로 저장됩니다.

객체들은 서로를 번호로 참조합니다. '3번 페이지 객체는 12번 글꼴 객체와 47번 이미지 객체를 쓴다'는 식입니다. 문서 전체는 이 참조들이 이어진 하나의 나무 구조이고, 뿌리에 해당하는 카탈로그 객체에서 출발하면 모든 페이지에 닿을 수 있습니다.

본문은 '그리기 명령'으로 저장됩니다

페이지의 실제 내용은 콘텐츠 스트림이라는 객체에 담깁니다. 안에는 '좌표 (100, 700)으로 이동해서, 12pt 크기로, 이 글자들을 그려라' 같은 그리기 명령이 들어 있습니다. 워드 문서처럼 '문단'이나 '표'라는 구조가 아니라, 종이에 잉크를 얹는 순서를 적어 놓은 것에 가깝습니다.

PDF에서 표를 편집하거나 워드로 깔끔하게 변환하기 어려운 근본 이유가 여기 있습니다. 파일 어디에도 '이것은 표다'라는 정보가 없어서, 도구가 글자 좌표를 보고 구조를 역추론해야 하기 때문입니다.

상호참조 테이블 — 빠른 열람의 비밀

파일 끝부분에는 상호참조 테이블(xref)이 있습니다. 각 객체가 파일의 몇 바이트째에 있는지 적어 둔 색인입니다. 뷰어는 이 색인 덕분에 500페이지 문서라도 파일 전체를 읽지 않고 요청된 페이지의 객체만 골라 읽을 수 있습니다.

대용량 PDF가 첫 페이지를 순식간에 띄우는 것도, 웹 브라우저가 PDF를 조금씩 내려받으면서 열 수 있는 것도 이 색인 구조 덕분입니다.

'손상된 PDF'의 정체

열리지 않는 PDF의 상당수는 내용이 아니라 이 색인이 깨진 경우입니다. 전송 중 파일 끝부분이 잘리면 내용 객체가 멀쩡해도 뷰어가 객체들의 위치를 찾지 못합니다.

일부 뷰어와 복구 도구가 손상 파일을 살려내는 원리는 단순합니다. 색인을 무시하고 파일 전체를 처음부터 훑으며 'obj' 표시를 찾아 색인을 다시 만드는 것입니다. 내용 자체가 깨진 경우가 아니라면 이 방법으로 복구되는 경우가 많습니다.

수정 이력이 파일에 남을 수 있습니다

PDF에는 증분 저장이라는 방식이 있습니다. 문서를 수정할 때 파일 전체를 다시 쓰는 대신, 바뀐 객체와 새 색인을 파일 뒤에 덧붙이는 것입니다. 저장이 빠르고 전자서명을 보존할 수 있다는 장점이 있습니다.

뒤집어 말하면, 증분 저장된 파일에는 수정 전의 내용이 그대로 남아 있을 수 있다는 뜻입니다. 민감한 내용을 지우고 저장한 파일이라도 이전 버전이 파일 안에 남아 있을 수 있으니, 외부 공유 전에는 새 파일로 완전히 다시 저장하는 것이 안전합니다.

이 구조가 실무에 말해 주는 것

병합·분할·회전이 빠르고 품질 손실이 없는 이유: 객체를 옮겨 담고 참조만 고치는 작업이라 내용을 다시 그리지 않기 때문입니다. 반대로 '표 편집'이나 '워드 변환'이 어려운 이유: 존재하지 않는 구조 정보를 추론으로 만들어내야 하기 때문입니다.

도구가 할 수 있는 일과 없는 일을 가르는 경계선은 대부분 이 지점입니다. 객체를 다루는 작업인가, 구조를 추론해야 하는 작업인가.