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 포맷 공개 문서 )

Posted by bong9
,