3. Broken Format


3.1. File Header


PDF Header“%PDF-1.7”과 같이 버전 정보를 포함한 시그니처로 구성되어있다. 여기서 확인해야 할 점은 PDF의 유효한 시그니처이다. 몇 번의 테스트를 해 본 결과, 앞의 5 Bytes“%PDF-”가 실제 PDF Reader가 체크하는 것으로 확인되었다.


Test 환경 : Adobe Reader X



또한 이 Header“%”로 시작한다. 이는 PDF Data Type Comment에 해당한다. Comment“%”로 시작해서 End-of-Line으로 끝난다고 되어있다. 그렇다면 과연 이 Header 또한 Comment처럼 처리될 것인지 의문을 가질 수 있다.


“%PDF-“ 이후의 값을 End-of-Line으로 변경하고, 8번째 문자를 특정 값으로 남겨놓자. 문서를 열어보면 이 의문점은 쉽게 풀린다.




여기서 두 가지의 사실을 알 수 있다.


1. 유효 Signature“%PDF-“이다.

2. Header Signature 체크 후 Comment로 처리된다.






Posted by bong9
,

2. PDF Data Type


2.1. PDF Chracter Set


PDF Reader는 파일을 읽어들일 때 특정 규칙에 의거하여 읽어들인다. 각각의 문자마다 의미가 있고, 그에 따른 처리 방식이 달라진다. 여기서는 그 구분 방법에 대해 설명하도록 한다.


PDF에서 특수한 문자는 White-space, Delimiter가 있다. White-space는 흔히 우리가 아는 공백문자이며, Delimiter는 이후 올 문자들을 구분짓기 위한 구분 문자이다. 해당 특수 문자의 의미는 아래 표와 같다.




2.2. Comments


CommentsPDF에서 주석을 의미하는 것으로, “%” 구분자로 시작하여 End-of-Line으로 끝난다. Comments는 지시어 사이, 파일의 처음 또는 끝 등에 존재할 수 있다.




2.3. Boolean


Boolean PDF의 오브젝트 내에서 참(“true”)과 거짓(“false”)을 나타낸다.




2.4. Numeric


Numeric PDF에서 숫자를 표현 할 때 사용된다. 크게 Integer objectsReal objects로 구분되며, 각각의 예는 아래 그림과 같다.





2.5. Literal String


Literal String PDF에서 문자열을 나타낼 때 사용된다. “(“로 문자열의 시작을, “)”로 문자열의 끝을 알린다.



 Literal String 내에서는 개별적인 “(“, “)” 또는 “\”를 허용하지 않는다. 위의 그림을 보면 알 수 있겠지만 Literal String 내의 “(“, “)”는 쌍으로 이루어져 있을 때에는 특별한 처리 없이 문자열로 인식된다. 개별적인 “(“ 또는 “)” 혹은 특수한 문자들은 “\”를 이용해 시퀀스 문자로 표현할 수 있다.




2.6. Hexadecimal Strings


Hexadecimal String“<”“>” 안의 0-9, A-F로 이루어진 2바이트의 데이터가 하나의 Hex data로 인식된다. 이 문자열 안의 White-space는 무시된다.


 


2.7. Name


PDF에서 Name“/” 이후의 문자열로, 0x21에서 0x7E까지의 문자로 구성된다. 이 자료형 내에서 “#”은 이후 2바이트의 문자가 하나의 Hex 값으로 취급하는데, 아래의 표를 보면 이해가 쉬울 것이다.




2.8. Array


Array PDF에서 “[“로 시작하여 “]”로 끝나는 배열을 의미한다. 배열 내 각 요소들은 Array를 포함한 Name, String, Number, Dictionary PDF의 모든 자료형을 가질 수 있다. 요소가 없는 빈 Array도 존재한다.




2.9. Dictionary


Dictionary“<<”“>>” 내에서 Key-Value의 쌍으로 구성된다. Key는 반드시 자료형이 Name이어야 하고, ValueDictionary를 포함 한 모든 자료형을 가질 수 있다. 요소가 없는 빈 Dictionary도 존재한다.




2.10. Indirect


Indirect“n1 n2 R”과 같이 표현되며 Referencing 하는 오브젝트를 표현한다.




2.11. Stream


Stream은 오브젝트 내에서 “stream” 키워드와 “endstream” 키워드 사이에 존재한다.



Stream은 해당 오브젝트의 Dictionary에서 몇 가지의 속성을 지시하는데, 기본적으로 /LengthStream의 길이를 나타내주어야 한다.





여기까지 PDF의 Data Type을 살펴보았다. 다음 장에는 PDF의 Spec과 맞지 않는 포맷에 대해 알아볼 것이다. 즉, PDF 포맷 공개 문서에는 나와있지 않은 실제 PDF Reader가 읽어들이는 방법에 대한 내용을 다루도록 하겠다.





참고 자료

PDF32000_2008.pdf ( Adobe Systems PDF 포맷 공개 문서 )


Posted by bong9
,

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
,