3P by GN⁺ | ★ favorite | 댓글 1개
  • 인터넷에 퍼진 “PDF 최대 크기 381km × 381km”는 PDF 형식 자체의 한계가 아니라 Adobe Acrobat 7.0의 구현 제한에서 나온 값임
  • PDF 1.6부터 /UserUnit으로 기본 단위인 1/72인치를 키울 수 있고, Acrobat 7.0의 최대값 75,00015,000,000인치라는 상한을 만듦
  • 손으로 만든 PDF는 %PDF-1.6, 객체 목록, xref, trailer, startxref, %%EOF로 구성되며, 페이지 크기는 /MediaBox/UserUnit 조합으로 결정됨
  • Acrobat은 /MediaBox 14,400 또는 /UserUnit 75,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는 문서 전체 메타데이터를 담음
    • 페이지 수
    • 암호화 여부
    • 문서 루트 객체
  • startxrefxref 테이블의 시작 위치를 가리킴
    • PDF 리더는 파일 끝에서 startxref 값을 찾아 xref 테이블로 이동함
  • 간단한 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가 맞음

/MediaBox/UserUnit으로 페이지 키우기

  • PDF의 페이지 크기는 각 Page 객체에서 설정됨
  • /MediaBox [0 0 300 300]은 너비와 높이가 각각 300단위인 페이지를 만듦
    • 기본 단위는 1/72인치
    • 300단위는 약 4.17인치
  • /MediaBox600 600으로 바꾸면 Acrobat은 페이지를 8.33 x 8.33 in으로 표시함
  • Acrobat에서 허용되는 /MediaBox 최대값 14400 14400200 × 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
    • 문서 대부분은 빈 공간이며, 출력하지 말라는 경고가 붙어 있음

댓글과 토론

Hacker News 의견들
  • PDF는 기술적으로 여러모로 끔찍하지만, 내 손에 보관할 수 있는 자기완결적 정적 파일이라는 점은 언제든 사라질 수 있는 사용자 적대적 동적/SaaS 웹사이트와 대비되어 훌륭함
    PDF/A가 진짜 PDF에 가깝고, 위험한 잡동사니 대부분을 제거해 줌
    이상한 PDF 장난을 좋아한다면, PDF/A이면서 CSV이고 동시에 Amiga soundtracker mod 사운드트랙이기도 한 폴리글롯 파일이 있음: https://www.lab6.com/6

    • Amazon이 계정에서 책을 회수하기 시작하면 내 손에 보관한다는 부분이 중요해짐
      https://www.nytimes.com/2009/07/18/technology/companies/18am...
    • PDF는 실행 가능한 파일
      많은 사람이 JavaScript 실행은 걱정하면서도 PDF 파일은 별문제 없이 사용함
    • PDF/A는 최근까지도 파일이 정말 PDF/A인지 쉽게 확인할 방법이 없었고, 이제는 veraPDF가 있지만 꽤 복잡한 소프트웨어임
      임의의 PDF를 오픈소스 소프트웨어로 PDF/A로 바꾸려면 Ghostscript로 PostScript로 갔다가 다시 돌아오는 방법뿐인 듯한데, Ghostscript는 Affero 라이선스라 여러 문제가 따라올 수 있음
      예전 GPL 버전도 있고 대부분 PDF에서 동작하지만 15년쯤 된 물건임
      예전 직장에서 PDF/A를 다뤄야 했는데 전혀 즐겁지 않았음
    • 여러 출처의 PDF 수백만 개를 파싱하는 프로젝트를 하며 겪은 고통 때문에 “PDF는 훌륭한 포맷”이라는 말은 용서하기 어려움
      문단을 재구성하는 것만으로도 큰 노력이 들었고, 표 파싱은 말할 것도 없음
      사실상 표준인 것치고는 더 나아져야 하며, PDF 매뉴얼도 정말 별로임
    • 그래픽 업계에서 일하는 입장에서는 진짜 PDF는 PDF/X라고 봄
  • 비교 삼아 PNG를 분석해 보면, 최대 너비와 높이는 2147483647, 즉 2^31 - 1임
    pHYs 청크로 지정 가능한 최저 밀도는 미터당 1픽셀이므로, 20억 미터는 태양 지름 1.39기가미터보다 큼: https://en.wikipedia.org/wiki/Orders_of_magnitude_(length)#g...
    sCAL 청크는 ASCII 부동소수점을 쓰기 때문에 훨씬 더 큰 물리 크기도 표현 가능함

    • sCAL은 이미지 자체보다는 이미지가 나타내는 대상의 크기에 관한 것에 가까움
      1:10,000,000 축척 세계지도는 pHYs 기준으로는 폭 10m 미만이지만, sCAL 기준으로는 약 40,000km 폭이 됨
  • PDF 너비를 킬로미터 단위로 재는 순간, 좋은 기술 글을 읽고 있다는 걸 알 수 있음

    • microSD 카드는 아주 작은 공간에 수백만 마일을 담을 수 있음
  • 10년도 더 전에 Game of Life의 PostScript 구현으로 만들었던 PDF가 떠오름
    아직 동작하는 듯하지만 macOS Preview를 크래시시킴: https://andrewcutler.net/docs/joke/life.pdf

    • Sonoma에서는 Preview가 크래시하지 않음
      다만 애니메이션은 보이지 않고 최종 상태만 보이며, Firefox의 PDF 뷰어에서는 약간의 애니메이션이 보임
      Skim도 Preview와 비슷하지만 격자는 표시하지 않음
    • Monterey의 Mac OS에서는 크래시하지 않고 정적인 Game of Life 렌더링만 보임
  • 이 글은 Umberto Eco의 지적 유희를 떠올리게 함
    특히 “On the Impossibility of Drawing a Map of the Empire on a Scale of 1 to 1”가 생각남: https://s3.amazonaws.com/arena-attachments/881694/cb6119367b...

  • Preview는 MediaBox에 넣을 수 있는 값의 상한이 Acrobat과 달리 없고, 1 뒤에 0을 12개 붙인 너비도 받아들임
    문서 검사기에는 페이지 크기가 352777777777.78 x 10.59cm로 표시되고, 이 너비는 대략 지구와 달 사이 거리쯤 됨
    태양계 모든 행성을 나란히 놓아도 이 문서 안에 여유 있게 들어감

    • 계산해 보면 그 문서는 약 373km²라서 독일보다 훨씬 작음
      결국 자가 필요했던 셈임
    • 7이 하나 너무 많음
      352777777777.78cm는 3,527,777.7777778km
    • 빈 공간이 아니라 실제 내용으로 채운다면 그런 PDF의 파일 크기가 얼마나 될지 궁금해짐
  • 재미있는 실험임, alexwlchan
    글에 작은 실수가 두 개 있는데, “15,000,000,000.00 in”과 “페이지 크기가 150억 인치”라고 쓴 부분은 1500만 인치가 맞음
    텍스트 서식 지정이 어렵다고 했는데, “Hello World” 두 단어만 있는 PDF 예시는 글꼴 객체를 정의하고, 스트림에서 Tf로 글꼴을 쓰고 Td로 위치를 잡고 Tj로 텍스트를 쓰면 됨

    • 숫자 실수를 어디선가 할 줄 알았고, 곧 수정할 예정임
      텍스트 예시도 고맙고, 내가 시도하던 것과 비슷해 보이지만 어딘가 실수가 있었던 게 분명함
    • PDF 끝의 xref는 필수인지 궁금함
      명세상으로는 필요한 것처럼 보임
    • “15,000,000,000.00 in”이 왜 150억이 아니라 1500만인지 0 개수 세는 걸 도와줄 수 있음?
    • “인쇄하지 마세요”라고 하면, 7번보다 더 많이 접을 수 있는지 어떻게 알 수 있겠음?
  • 이쯤에서 Steven Wright를 바꿔 말하고 싶어짐
    “미국 지도를 하나 갖고 있다. 실물 크기다”

    • 휴대폰에 미국 지도를 갖고 있는데, 길 안내가 좀 헷갈림
      지도의 위쪽이 내가 움직이는 방향인지 북쪽인지 모르겠고, 예전 지도들은 항상 북쪽이 위였는데 Google Maps는 그렇지 않은 것처럼 보여 혼란스러움
      90도 돌면 지도가 같이 도는데, 돈 것은 지도인지 나인지도 헷갈림
      멈춰 있으면 어디로 가는 중인지 지도가 알 수 없으니, 방향을 알려면 먼저 움직여야 하는 것 같음
      스마트폰을 눈앞에 들면 지도의 위쪽은 하늘을 향하는데, 지도를 위에서 내려다봐야 하는 건지도 모르겠음
      휴대폰에서 Google Maps를 잘 쓰는 요령이 궁금함
    • Umberto Eco도 같은 주제로 “On the Impossibility of Drawing a Map of the Empire on a Scale of 1 to 1”을 썼음
      https://s3.amazonaws.com/arena-attachments/881694/cb6119367b...
    • 관련 농담 중 “내 몸 전체에 나 자신 문신을 새기고 싶다. 단 2인치 더 크게”를 항상 좋아했음
      https://scomedy.com/quotes/10779
  • “인쇄하지 마세요”는 프린트 폭탄이 될 준비가 된 말처럼 들림
    마지막으로 프린터를 썼을 때 Windows에서 인쇄 작업 취소가 거의 불가능했음
    Wi-Fi 프린터가 열려 있거나 보안이 허술하던 시절은 재미있었음

    • Windows에서 인쇄 작업 취소는 여전히 불가능함
      내가 찾은 유일하게 믿을 만한 방법은 프린터 전원을 끄고 큐에서 인쇄 작업을 삭제하는 것임
      프린터가 바로 옆에 없으면 안 되고, 왜 이렇게 어려운지 모르겠음
    • 조금 더 확실한 방법은 프린터 플러그를 뽑고 컴퓨터를 창밖으로 던지는 것임
    • “인쇄하지 마세요”를 읽자마자 든 첫 반응은 “당신은 내 엄마가 아니잖아”였음
  • 약 30년 전 Microsoft 여름 인턴 면접에서, 면접관이 Excel을 두고 이와 매우 비슷한 질문을 했음
    이런 주제는 사람의 호기심과 잠재적 문제를 분해하는 능력을 보기에 언제나 좋은 소재임