1. PDF File Format
1.1. PDF File Format
여기서는 Adobe Systems에서 공개한 PDF 파일 포맷에 대해 설명하도록 하겠다.
PDF 파일 포맷은 크게
Header, Body, Cross-reference Table, File Trailer로 총 4가지
영역으로 구분된다. 각각의 역할은 아래와 같다.
Header : 총 8바이트로,
PDF의 시그니처와 PDF 문서의 버전 정보를 포함한다.
Body : 실제 문서의 정보들을 포함하는 오브젝트들로 구성되고, 이
오브젝트들은 트리 형태로 링크되어있다.
Cross-reference Table : 각 오브젝트들을 참조할 때 사용되는 테이블로, 오브젝트의 사용 여부와 번호 등이 저장된다.
File Trailer : File Body에 존재하는 오브젝트 중 루트 오브젝트가 무엇인지,
Cross-reference Table이 어디에 있는지 기재된다.
1.2. File Header
PDF는 대부분 문자열로 구성되어있어 다른 파일포맷보다는 보기에 조금
수월하다. (파서를 제작할 때는 제외한다.) PDF의 Header는 총 8바이트로,
PDF의 시그니처와 문서 버전정보를 포함한다고 앞서 말했다. 위 그림에서 “1.4”가 PDF의 문서 버전 정보를 의미한다. 각 시그니처와 버전정보는 아래 도표와 같다.
1.3. File Trailer
Trailer는 파일의 끝에 위치하여 Root 오브젝트의 위치와 Cross-reference Table의
위치를 표시한다. Adobe Systems에서 배포한
문서를 보면, 맨 앞의 헤더를 읽은 후 파일의 끝의 Trailer를
확인하도록 포맷이 설계되어 있다. 이 Trailer는 위의
그림과 같은 모습을 하고 있고, “trailer”라는 지시어로 시작하여 “%EOF”로 끝난다.
line 80의 “<<”
~ “>>”는 현재 오브젝트의 속성을 표기한다. Trailer는 여기에 다음의
키 지정이 가능하다.
/Size (Integer) : Cross-reference Table의 항목 수
/Prev (Integer) : 이전 Cross-reference Table의
위치
/Root (Dictionary) : Root 오브젝트의 오브젝트
넘버를 표시
그림을 기준으로, /Root라는 이름의 속성은 Root 오브젝트를 의미하며, 여기서는 1번 오브젝트를 레퍼런싱하고 있다. /Size 속성은 오브젝트들의
참조 테이블 즉, Cross-reference Table의 엔트리 개수를 나타낸다.
여기서 “<<” ~ “>>”를 PDF의 자료형 중에서 Dictionary라고 표현한다. Dictionary는 키와 값으로 이루어진 데이터들을 포함하며, 위의
그림에서는 /Root와 /Size 키가 된다. 이러한 키들은 PDF에서 Name이라는
자료형이어야 하며, 이 Name 자료형임을 구분할 수 있는
구분문자가 “/”가 된다.
/Root의 값인 1 0 R에서 R은 Reference의 약자로, 오브젝트를
참조한다는 의미를 가지고 있다. 이를 PDF에서는 Indirect Object 자료형이라고 한다. /Size의 값인 10은 그저 10진수로,
Integer 자료형이다.
Trailer는 startxref라는
키 지정이 가능하다(line 81). 이는
Cross-reference Table의 위치값을 표현해준다. 이후에 오는 값인 8061이 파일에서 Cross-reference Table의 시작
오프셋이 된다.
1.4. Cross-reference Table
Cross-reference Table은 Body에 존재하는 오브젝트들의 위치값과 사용 여부를 기록한다. 이러한
참조 테이블을 순서대로 기록하여, PDF Reader는 이를 이용해 각 오브젝트의 위치로 이동할 수
있다. Adobe Systems의 문서를 보면 이 테이블의 각 항목은 공백을 포함하여 총 20바이트의 크기를 갖도록 되어있다.
위 그림을 보면 xref라는 키워드가 존재한다. 이는 Cross-reference Table의 시작임을 알리며, line 68부터 실제 Table이 기재된다.
line 68을 공백으로 구분하여 첫 번째 숫자는 오브젝트의 시작 번호, 두번째
숫자는 엔트리의 개수를 의미한다. 여기서는 0번 오브젝트부터 9번 오브젝트까지 총 10개의 오브젝트에 대한 위치값과 사용 여부가 line 69부터 line 78까지 표시된다.
각 엔트리 또한 공백으로 구분되어 첫 번째 숫자는 해당 오브젝트의 위치값, 두
번째 숫자는 생성 숫자(Adobe Systems의 문서에서는
5-digit generation number로 표현됨), 세번째의 문자는 해당 오브젝트의
사용 여부를 나타낸다. 오브젝트의 사용 여부는 “f”(free
entry) 또는 “n”(in-use entry)으로 표기된다. 위의 테이블을 해석하면 아래와 같다.
line 68 : 오브젝트 시작 번호, 10 - 엔트리 개수
line 69 : 0번 오브젝트. offset
: 0. 사용되지 않음
line 70 : 1번 오브젝트. offset
: 17. 사용됨
line 71 : 2번 오브젝트.
offset : 109. 사용됨
line 72 : 3번 오브젝트.
offset : 169. 사용됨
line 73 : 4번 오브젝트.
offset : 267. 사용됨
…
Cross-reference Table은 다음과 같은 형태로도 존재할 수 있다.
xref
0 2
0000000000 65535 f // 0번 오브젝트. offset : 0. 사용되지 않음
0000000017 00000 n // 1번 오브젝트. offset : 17. 사용됨
2 1
0000000109 00000 n // 2번 오브젝트. offset : 109. 사용됨
3 2
0000000169 00000 n // 3번 오브젝트. offset : 169. 사용됨
0000000267 00000 n // 4번 오브젝트. offset : 267. 사용됨
1.5. File Body
Body는 파일의 거의 대부분을 차지하고, 오브젝트들로 구성되어 있다. 오브젝트의 시작은 “n1 n2 obj”로 시작하고, “endobj”로 끝나는 것으로 각
오브젝트의 영역이 구분된다. 각 오브젝트는 자신의 성격을 나타내는 정보들을 가지고 참조하는 오브젝트에
대해서도 알려준다. 또한 내부에 stream 영역에 그림, 메모 등과 같은 데이터를 포함할 수 있다.
위의 그림에서 line 3에는 1 0 obj라는 1번 오브젝트의 시작을 알리는 지시어가 존재한다.
이 1번 오브젝트를 해석하자면 아래와 같다.
이 오브젝트의 타입은 Catalog이다.
페이지 레이아웃은 싱글페이지.
페이지들의 대한 내용은 2번 오브젝트를 참조할 것
문서 열람시의 액션은 4번 오브젝트를 참조할 것
여기까지가 기본적인 PDF의 파일 포맷이다. 이를 이용하여 다음 그림과 같이 PDF의 전체적인 구조를 파악할
수 있다.
1.6. Incremental Updates
PDF 파일은 아래 그림과 같이 파일의 재 작성을 고려하여 업데이트되는
데이터를 파일 후반부에 추가하도록 설계되었다. 따라서 한 파일에 Body,
Cross-reference Table, Trailer는 여러 개 존재할 수 있다.
이번 장에서 PDF 파일 포맷의 전체적인 구조를 간략히 설명했다. 다음 장에서는 파일의 대부분을 구성하는 오브젝트에서의 Data Type에 대해 다루도록 하겠다.
참고 자료
http://www.nurilab.co.kr/?p=357
( 누리랩 )
PDF32000_2008.pdf
( Adobe Systems의 PDF 포맷 공개 문서 )