PDF 파일 구조 분석 자료입니다. 개인적으로 해외자료를 공부하며 정리한 문서입니다. PDF 파일은 색인 정보가 있는 객체 모음으로 PDF 파일 구조를 통해 다른 소프트웨어와의 호환성을 높여 문서를 더 쉽게 변환하거나 연동할 수 있습니다. 또한 파일이 손상되었을 때, 구조를 이해하면 문제를 진단하고 수리하는 데 도움이 됩니다.
목차
PDF란?
PDF ( Portable Document Format )는 1990년대 초에 Adobe社에서 개발하였으며 텍스트, 이미지, 비디오, 오디오 등을 포함한 컴퓨터 문서를 공유하는 방법으로 개발된 파일 형식 입니다 .
PDF는 문서를 보는 사람이 사용하는 소프트웨어, 하드웨어, 운영 체제에 관계없이 문서를 간편하고 안정적으로 표시하고 교환할 수 있는 장점으로 인기를 끌었으며 이제 문서 교환 형식의 표준으로 자리 잡았습니다.
현재 PDF 포맷은 이제 개방형 표준으로 ISO(International Organization for Standardization)에서 유지 관리하고 있습니다. PDF 문서에는 링크와 버튼, 양식 필드, 오디오, 비디오 및 비즈니스 로직을 포함할 수 있습니다.
PDF 파일 구조 요약
- 헤더 : 총 8바이트로 PDF 시그니처와 문서의 버전 정보를 가지고 있습니다.
- 객체 정의 묶음 : 실제 문서의 정보들을 포함하는 오브젝트(객체)와 이 객체들을 구성하는 트리형태로 서로 링크되어 있습니다.
- 교차 참조 테이블 (Xref Table) : 각 개체들을 참조할 때 사용되는 테이블이다. 객체의 사용 여부와 식별 번호 등이 저장되어 있습니다.
- 트레일러 : File Body에 존재하는 객체 중 최상위 객체가 어떤 객체인지, Xref Table이 어디에 위치하는지 기록되어 있는 부분입니다.
PDF 파일 구조 상세
PDF 파일은 색인이 지정된 객체 모음이며 PDF 객체는 구조화된 데이터 청크입니다. PDF 파일은 헤더, 객체 정의 묶음, 교차 참조 테이블, 트레일러로 구성됩니다.
교차 참조 테이블은 파일 내에서 각 번호가 매겨진 객체의 위치를 바이트 오프셋으로 제공하는 조회 테이블입니다. 트레일러는 PDF 파일을 해석하기 위한 시작점의 루트 객체 또는 문서 카탈로그에 대한 정보를 제공합니다. 또한 파일 끝에는 교차 참조 테이블에 대한 바이트 오프셋이 있습니다.
PDF 뷰어가 PDF 파일을 해석할 때는 먼저 파일의 끝으로 이동합니다. PDF 파일의 마지막 항목은 교차 참조 표에 대한 바이트 오프셋입니다. 교차 참조 표에는 트레일러 사전과 함께 각 개체의 파일 내 위치가 포함되어 있으며, 이는 PDF 파일을 해석하기 위한 점프 오프 포인트인 문서 카탈로그의 개체 번호를 알려줍니다.
문서 카탈로그에는 문서 페이지, 개요, 축소판 그림, 주석 및 PDF 파일에 있을 수 있는 수많은 다른 항목에 대한 정보를 찾을 수 있는 위치와 같은 추가 정보가 포함되어 있습니다. PDF 파일에서 가장 중요한 개체는 페이지 트리의 루트이며 특정 페이지를 찾는 데 사용할 수 있는 구조의 핵심입니다.
PDF 파일 구조 예제 설명
- 파일의 끝은 교차 참조 테이블이 바이트 오프셋 478에서 시작한다고 말합니다. 이는 startxref 키워드 바로 뒤, %%EOF 앞에 있는 숫자입니다 .
- 트레일러 사전은 문서 카탈로그( /Root )가 간접 객체 참조 1 0 R 로 표시된 객체 1이라고 말합니다 .
- 교차 참조 표는 객체 1이 바이트 오프셋 9에서 시작한다고 말합니다. (교차 참조 표는 51행에서 실제 객체가 아닌 객체 “0”으로 시작합니다. 각 행에는 다음 객체의 바이트 오프셋이 0으로 채워진 10진수로 포함되어 있으므로 52행은 객체 1의 바이트 오프셋이 9임을 나타냅니다.)
- 문서 카탈로그에 따르면 페이지 트리의 루트는 개체 2입니다.
- 교차 참조 표에 따르면 객체 2는 바이트 오프셋 62에 있습니다.
- 페이지 트리는 첫 번째 페이지가 3페이지임을 나타냅니다.
- 교차 참조 표에 따르면 객체 3의 바이트 오프셋은 133입니다.
- 개체 3은 페이지 경계 상자( /MediaBox )를 표시하고 콘텐츠가 개체 4에 있음을 나타냅니다.
- 객체 4의 바이트 오프셋은 277입니다. 여기에는 페이지의 특정 위치에 “감자”라는 단어를 배치하는 그리기 명령이 포함되어 있습니다. (제 예제 중 다수에 감자라는 단어가 포함되어 있음을 알게 될 것입니다.)
교차 참조 정보를 표현하는 방법은 두 가지가 있습니다. PDF 객체가 특정 바이트 오프셋에서 파일에 직접 나타내거나 PDF 객체가 객체 스트림이라고 하는 컨테이너 객체에 포함될 수 있습니다.
파일에 객체 스트림이 있는 경우 교차 참조 테이블은 바이너리 형식이어서 읽기 어려운 교차 참조 스트림으로 대체됩니다. 교차 참조 스트림은 객체가 바이트 오프셋에서 최상위 수준에 나타난다는 것을 나타낼 수도 있고, 객체 스트림에서 n번째 객체라고 말할 수도 있습니다.
특정 유형의 뷰어가 파일을 순차적으로 읽어서 다운로드하는 동안 파일을 표시할 수 있도록 PDF 파일을 구성하는 다른 방법이 있습니다. PDF 파일을 업데이트하여 교차 참조 표의 다른 부분을 파일의 다른 지점에서 재정의할 수 있는 방법이 있습니다. PDF 파일은 암호화될 수 있습니다.
PDF 객체
PDF 파일의 최상위에 있는 번호가 매겨진 객체는 두 개의 숫자로 시작하고 그 뒤에 obj 라는 단어가 붙습니다. 첫 번째 숫자는 객체 번호입니다. 두 번째 숫자는 세대 라고 하며 거의 항상 0입니다. 객체의 본문은 endobj 까지입니다 .
PDF 사양은 객체와 교차 참조 표에 업데이트를 추가하여 PDF 파일을 수정할 수 있도록 합니다. 생성을 늘려 객체의 내용이 단순히 수정된 것이 아니라 전혀 관련 없는 객체로 대체되었음을 나타낼 수 있습니다.
이렇게 하면 객체 번호를 재사용하는 동시에 이전 객체에 대한 남아 있는 간접 참조가 새 객체로 해결되는 것을 방지할 수 있습니다. 실제로 이와 같은 PDF 파일은 거의 발견되지 않으며 일반적으로 생성 번호를 무시할 수 있습니다. 객체 스트림을 사용하는 PDF 사양의 최신 버전에는 더 이상 생성이 포함되지 않습니다.
PDF 객체 유형
- 문자열: 텍스트 문자열. 다양한 이유로 PDF 문자열은 일반적으로 유니코드 문자열이 아니지만 어떤 상황에서는 유니코드 문자열일 수 있습니다. 문자 인코딩에 대한 논의는 지금은 범위를 벗어나지만 PDF 문자열은 일반적으로 임의의 유니코드 데이터를 포함하지 않는다는 점을 명심하세요. 문자열은 괄호로 구분됩니다. 예: (감자)
- 숫자: 정수 또는 부동 소수점 숫자. 예: 12 , 3.14159 . PDF 사양은 정수와 실수를 별도의 유형으로 취급하지만 실제로 정수는 실수가 예상되는 곳에 나타날 수 있으며 대부분의 뷰어는 정수 대신 나타나는 실수를 반올림하거나 잘라냅니다.
- 부울: 참 또는 거짓
- Null: 키워드 null
- 이름: 슬래시(/) 문자로 시작하는 단어로, 일반적으로 키워드나 사전 키를 나타내는 데 사용됩니다. 예: /Type
- 배열: 대괄호로 둘러싼 다른 객체의 목록. 항목 사이에 구분 기호가 없습니다. 배열과 사전은 임의로 중첩될 수 있습니다. 예: [1(두) 3.14 거짓]
- 사전: Name 유형의 키에서 모든 유형의 값으로의 맵. 사전은 << 및 >> 로 묶이며 키와 값 사이 또는 후속 항목 사이에 구분 기호가 없습니다. 예: << /A 1 /B [2, 3 <</Four 4>> ] >>
- 간접 객체 참조: 두 개의 숫자(객체 및 세대 번호) 뒤에 R 이 붙으며 , 파일에서 번호가 매겨진 객체를 참조하는 데 사용됩니다. PDF 사양에서는 일부 객체가 직접적이어야 하지만, 대부분의 객체는 파일의 최상위로 끌어내어 간접 객체로 참조할 수 있습니다. 예: 1 0 R
- 스트림: 임의의 이진 데이터. 스트림은 최소한 /Length 키(그리고 일반적으로 스트림의 의미에 특정한 다른 키)를 포함하는 사전이며, 그 뒤에 키워드 stream 및 endstream 으로 둘러싸인 이진 데이터의 바이트 수가 옵니다. (🔍스트림의 길이는 간접 객체일 수 있습니다. 이를 통해 PDF 제작자는 길이를 미리 알지 못한 채 스트림을 작성한 다음 나중에 파일에 실제 길이를 간접 객체로 작성할 수 있습니다. 이는 PDF 파일을 생성하거나 단일 패스로 작성하면서 스트리밍할 수 있으므로 매우 일반적입니다.)
PDF 파일 구조에서 % 기호는 주석을 표시합니다. 주석은 다음 줄바꿈 문자까지 지속됩니다. 객체는 공백으로 구분할 수 있지만 어떤 경우에는 선택 사항입니다. 예를 들어, 두 개의 이름 객체를 공백 없이 서로 인접하게 둘 수 있습니다. PDF 사양에서 찾을 수 있는 공백과 줄바꿈 문자에 대한 다른 뉘앙스가 있습니다.
이진 데이터 및 압축
PDF 파일의 기본포멧은 ASCII 파일이지만 대부분의 대부분의 PDF 파일은 ASCII와 이진 데이터가 혼합되어 있습니다.
PDF 파일에는 압축된 데이터와 이미지 데이터의 이진 데이터가 포함되는 경우가 많습니다. 스트림의 내용을 압축했다면 스트림 사전에는 스트림에 적용된 압축 알고리즘(또는 알고리즘들)을 설명하는 /Filter 키워드가 포함됩니다. 스트림의 길이는 PDF 파일에 실제로 기록된 바이트 수이므로 압축 후의 길이입니다. 따라서 대부분의 PDF 파일은 ASCII와 이진 데이터가 혼합되어 있습니다.
또한 PDF 파일 형식은 다른 객체를 포함하는 스트림인 객체 스트림을 지원합니다. 대부분의 비스트림 객체(몇 가지 예외가 있음)는 연결되어 다른 스트림 내부 에 저장될 수 있으며, 이는 전체적으로 압축될 수 있으므로 PDF 파일을 열 때 객체의 정의를 찾을 수 없는 경우도 있습니다. 이러한 유형의 파일에서 교차 참조 테이블도 스트림이며 일반적으로 압축되므로 텍스트 편집기에서 PDF 파일을 열어보면 내용 확인이 어렵습니다.
이상입니다.
참고: https://medium.com/@jberkenbilt/the-structure-of-a-pdf-file-6f08114a58f6
[더 읽어볼거리]