- 인터넷에 퍼진 “PDF 최대 크기 381km × 381km”는 PDF 형식 자체의 한계가 아니라 Adobe Acrobat 7.0의 구현 제한에서 나온 값임
- PDF 1.6부터
/UserUnit으로 기본 단위인 1/72인치를 키울 수 있고, Acrobat 7.0의 최대값75,000이15,000,000인치라는 상한을 만듦 - 손으로 만든 PDF는
%PDF-1.6, 객체 목록,xref,trailer,startxref,%%EOF로 구성되며, 페이지 크기는/MediaBox와/UserUnit조합으로 결정됨 - Acrobat은
/MediaBox14,400 또는/UserUnit75,000을 넘겨도 15,000,000인치로 표시하고,/UserUnit초과는 경고 없이 무시함 - macOS Preview.app은
/UserUnit을 무시하지만/MediaBox에는 Acrobat 같은 상한을 두지 않아, 우주보다 큰 PDF처럼 표시되는 파일도 만들 수 있음
381km 제한은 어디서 나왔나
- PDF 문서의 최대 크기가 381km × 381km라는 주장은 오래전부터 인터넷에 반복적으로 퍼져 있음
- 이 숫자는 PDF 형식의 한계가 아니라 Adobe Acrobat의 구현 제한에서 비롯됨
- PDF 1.7 명세에 따르면 페이지 크기 제한은 다음과 같이 정리됨
- PDF 1.6 이전에는 기본 사용자 공간 단위가 1/72인치로 고정됨
- Acrobat 5.0 이후 기본 페이지 크기 최대값은
14,400 × 14,400단위, 즉 200 × 200인치임 - PDF 1.6부터 페이지 사전의
/UserUnit으로 기본 사용자 공간 단위 크기를 설정할 수 있음 - Acrobat 7.0은
/UserUnit최대값75,000을 지원해 최대 페이지 치수 15,000,000인치를 만들 수 있음
15,000,000인치는 약 381km이며, “PDF version 7”이라는 표현은 PDF 버전이 아니라 Adobe Acrobat 7.0에서 나온 것으로 보임
손으로 만든 PDF의 기본 구조
- PDF 파일은 시작 부분의 버전 번호와 끝부분의 EOF 표시를 가짐
- 예:
%PDF-1.6 - 끝 표시:
%%EOF
- 예:
- 버전 번호 뒤에는 페이지, 텍스트, 그래픽 등을 나타내는 객체 목록이 이어짐
xref는 객체 위치를 알려주는 상호 참조 테이블임- PDF 리더는 각 객체가 파일 시작점에서 몇 바이트 떨어져 있는지 확인함
trailer는 문서 전체 메타데이터를 담음- 페이지 수
- 암호화 여부
- 문서 루트 객체
startxref는xref테이블의 시작 위치를 가리킴- PDF 리더는 파일 끝에서
startxref값을 찾아xref테이블로 이동함
- PDF 리더는 파일 끝에서
- 간단한 PDF 파일을 만드는 글을 참고하면 빨간 사각형이 있는 PDF를 손으로 만들 수 있음
객체와 페이지 정의
- 예시 PDF는 네 가지 핵심 객체로 구성됨
- 객체 1: 빨간 사각형을 그리는 stream 객체
- 객체 2: 단일 페이지를 정의하는
Page객체 - 객체 3: 여러 페이지 정보를 담는
Pages객체 - 객체 4: 문서의 주 구조를 제공하는
Catalog객체
Page객체는 페이지 내용을 다른 객체 참조로 연결함1 0 R은 객체 번호 1, 세대 번호 0을 참조함3 0 R은 페이지 집합인Pages객체를 참조함
- 손으로 PDF를 작성하면 객체 위치가 바뀔 때마다
xref테이블 값을 다시 맞춰야 해서 매우 번거로움 - 2025년 4월 16일 업데이트에서 예시 코드의
xref 0 4가 잘못된 값으로 정정됨- 실제 상호 참조 테이블에는 5개 항목이 있으므로
xref 0 5가 맞음
- 실제 상호 참조 테이블에는 5개 항목이 있으므로
/MediaBox와 /UserUnit으로 페이지 키우기
- PDF의 페이지 크기는 각
Page객체에서 설정됨 /MediaBox [0 0 300 300]은 너비와 높이가 각각 300단위인 페이지를 만듦- 기본 단위는 1/72인치
- 300단위는 약 4.17인치임
/MediaBox를600 600으로 바꾸면 Acrobat은 페이지를8.33 x 8.33 in으로 표시함- Acrobat에서 허용되는
/MediaBox최대값14400 14400은 200 × 200인치로 표시됨- 이 값을 넘기면 Acrobat에서 경고가 발생함
/UserUnit을 추가하면 기본 사용자 공간 단위를 키울 수 있음/UserUnit 2는 페이지 양쪽 치수를 두 배로 만듦/MediaBox [0 0 14400 14400]와/UserUnit 2를 함께 쓰면 Acrobat은400.00 x 400.00 in으로 표시함
/UserUnit 75000을 적용하면 Acrobat은 페이지를 15,000,000.00 × 15,000,000.00인치로 표시함- 이는 약 381km × 381km이며 원래 주장과 일치함
- 예시 파일: biggest.pdf
Acrobat과 Preview의 처리 차이
- Acrobat은
/MediaBox나/UserUnit을 더 크게 설정해도 페이지 크기를 15,000,000인치로 계속 표시함 /UserUnit값을75000보다 크게 설정하면 경고나 오류 없이 값이 제한됨/UserUnit은 실제 사용 사례가 많지 않은 것으로 보임- Stack Overflow 답변도 이 값이 널리 쓰이지 않는다고 함
- 온라인에서 예시를 찾기 어려웠음
- macOS Preview.app은
/UserUnit을 지원하지 않음- 모든 PDF를 기본 단위 1/72인치로 처리함
- 대신 Preview.app은 Acrobat과 달리
/MediaBox에 큰 상한을 두지 않음1뒤에 0이 12개 붙은 너비도 받아들임- 이 너비는 대략 지구와 달 사이 거리 수준임
- 더 큰
/MediaBox값을 넣으면 Preview가 약 37조 광년 제곱 크기의 PDF로 표시하는 파일도 만들 수 있음- 예시 파일: universe.pdf
- 문서 대부분은 빈 공간이며, 출력하지 말라는 경고가 붙어 있음