分享

[ 原创首发] PDF Reference 学习札记(一) - 网上读书园地 - 信息资讯...

 xrzs 2010-05-12
[ 原创首发]  PDF Reference 学习札记(一)
作者: regina  发布日期: 2008-8-03    查看数: 586   出自: 网上读书园地
Google Adsene

PDF Reference 学习札记(一)

By Regina 梳理



  进入readfree有一段时间了,看了coolmancheming、老马等高手的一些旧贴和他们的宝贝后,大大激发了我的求知欲,我感到要想成为他们这样的高手,必须从基础开始学起,学习PDF Reference就是我迈出的第一步。今天,我第一次来这里发贴,把我学到的东西和大家一起分享,望高手们批评指正。



    我模仿了PDF Referenceexample 1,用记事本输入下面的文本,并把该文件保存为Ex001.pdf,它就是一个简单的PDF文件。


%PDF-1.6
1  0  obj
<< /Type  /Catalog
  /Outlines  2 0 R
  /Pages  3 0 R
>>
endobj

2  0  obj
<< /Type  /Outlines
  /Count  0
>>

endobj

3  0  obj
<<  /Type  /Pages
  /Kids  [  4 0 R  ]
  /Count  1
>>

endobj

4  0  obj
<<  /Type  /Page
  /Parent  3 0 R
  /MediaBox  [  0  0  612  792  ]
  /Contents  5 0 R
  /Resources  <<  /ProcSet  6 0 R
  /Font  <<  /F1  7 0 R  >>
>>
>>
endobj

5  0  obj
<<  /Length  73  >>
stream
BT
/F1  28  Tf
100 100 Td
5 Tr
1 0 0 rg
0 0 1 RG
(Hello Word !)'
ET
endstream
endobj

6  0  obj
[  /PDF  /Text  ]
endobj

7  0  obj
<<  /Type  /Font
  /Subtype  /Type1
  /Name  /F1
  /BaseFont  /Helvetica
  /Encoding  /MacRomanEncoding
>>
endobj
1062
xref
0  8
0000000000  65535  f
0000000009  00000  n
0000000074  00000  n
0000000120  00000  n
0000000179  00000  n
0000000364  00000  n
0000000466  00000  n
0000000496  00000  n
trailer
<<  /Size  8
  /Root  1 0 R
>>
startxref
625
%%EOF


下面,我对上面的文件结构做一些细致的分析。

%PDF-1.6

▲ 这是PDF文件头部,“-”后的1.6PDF的版本信息。


1  0  obj
<< /Type  /Catalog
  /Outlines  2 0 R
  /Pages  3 0 R
>>
endobj

▲ 这是一个PDF中的“对象”,它的特点是:以obj开始,以endobj结尾。PDF文档都是以对象为单位组织其结构的。
△ “1  0  obj”中的“1”是对象编号,每个对象的编号是唯一的;“0”是对象的生成号,每当我们修改了PDF中的对象时,它会自增1
△ 中间的“<<  >>”称为“字典”,里面有许多“键-值”对的描述信息。
△ 其中,“/Type  /Catalog”说明了该对象的类型是/Catalog(即“目录”对象),它是PDF文档的根对象。
△ “/Type”中除了有“/Catalog(目录对象)”外,还有“/Outlines(书签大纲对象)”、“/Pages (页面组对象)”以及“页面组对△ 象/Pages”中含有的若干“/Page(页面对象)”等。
△ “2 0 R”和“3 0 R”都是对对象的“间接引用”。“2 0 R”就是在引用“2 0 obj”对象,“3 0 R”就是在引用“3 0 obj”对象。


2  0  obj
<< /Type  /Outlines
  /Count  0
>>
endobj


▲ 这是的一个“/Outlines(书签大纲对象)”。
△ “/Count  0说明没有此书签个数为0,即没有书签。(以后我再详细分析)


3  0  obj
<<  /Type  /Pages
  /Kids  [  4 0 R  ]
  /Count  1
>>
endobj


▲ 这是的PDF中的“/Pages (页面组对象)”,它有两个主要的选项“/Kids”和“/Count”。
△ “/Kids”说明了这个/Pages是由哪些/Page组成的,后面的“[4 0 R]”是一个数组,里面的“4 0 R”就是一个“/Page(页面对象)”,[]里可以有多个/Page对象组成。
△ “/Count  1说明了/Pages对象里含有/Page对象的个数,这要与[]中的对象数目一致,这里表明这个PDF文件只有一页。



4  0  obj
<<  /Type  /Page
  /Parent  3 0 R
  /MediaBox  [0  0  612  792]
  /Contents  5 0 R
  /Resources  <<  /ProcSet  6 0 R
  /Font  <<  /F1  7 0 R  >>
              >>
>>
endobj

 这是/Page页面对象)”,它是属于3 0 R这个/Pages 页面组对象)”这可以由它的/Parent  3 0 R看出来。

△ “/MediaBox”标识了该页的大小,单位为磅(注:1英寸=72=2.54厘米)。
△ “/Contents  5 0 R”就是指页面的具体内容是“5 0 obj”对象。
△ “Resources << /ProcSet  6 0 R /Font  << /F1  7 0 R  >> >> >> ”表明该页包含的一系列资源,包括“字体对象”和“PDF的内容类型”为文本型TEXT


5  0  obj
<<  /Length  73  >>
stream
  BT
    /F1  28  Tf
    100 100 Td
    5 Tr
    1 0 0 rg
    0 0 1 RG
    (Hello Word !)'
  ET
endstream
endobj


▲ 这是/Page页面的具体内容。
△ “<<  /Length  73  >> ”表示其后的streamendstream之间的二进制流的长度(注:单位为“字节”)。
△ “/F1  28  Tf”表示选择由“7 0 obj”定义的字体,字号大小为28。(以后再详述)
△ “100 100 Td”表明要显示的字符位置,它以页面左下角为原点。
△ “6 Tr”为字体的样式修饰,“6”代表“填充字体内部并描边”。
△ “1 0 0 rg”和“0 0 1 RG”分别设置“填充颜色”和“边框颜色”。“填充颜色”用小写的“rg”,“边框颜色”用大写的“RG”。“1 0 0表示“红、绿、蓝”三种色调的百分比,这里红色是1,就是100%的红。
△ (Hello Word !)'是要打印的字符文本。目前,只能是英文,如要显示中文字,必须要引入中字的字符。(以后再详述)


6  0  obj
[  /PDF  /Text  ]
endobj

▲ 这个对象说明了PDF的内容类型为纯文本,如果是图片类型的,要改为“[/PDF /Image]


7  0  obj
<<  /Type  /Font
  /Subtype  /Type1
  /Name  /F1
  /BaseFont  /Helvetica
  /Encoding  /MacRomanEncoding
>>
endobj


▲ 这是一个字体对象,以后再详述。


xref
0  8
0000000000  65535  f
0000000009  00000  n
0000000074  00000  n
0000000120  00000  n
0000000179  00000  n
0000000364  00000  n
0000000466  00000  n
0000000496  00000  n


▲ 这是PDF文件的“交叉引用表”,如果这个表被破坏,那整个PDF文档就不能被Adobe Acrobat Reader打开了,但Foxit Reader的容错率比较强,它还是可以打开的,所以建议大家把上面的文件保存成Ex001.PDF后,用Foxit Reader打开。
△ 第二行“0  8”这两个数,第一个“0”表示“交叉引用表”的起始对象号(这个文件是0,为PDF自定义的对象0,无特殊作用),第二个“8”表示“交叉引用表”的对象总数(包含刚才自定义的0对象)。
△ 其余的8行,每行为一个对象。
△ “0000000000  65535  f”这一行比较特殊。“0000000000”表示该对象在的起始位置为0,生成数为65535f表示该对象未被引用,这是PDF的规定。
△ 剩下的7行中,n表示该对象已被引用。


注:在读取对象信息的时候,就是靠着这个交叉引用表找到各对象位置进行解析的。


trailer
<<  /Size  8
  /Root  1 0 R
>>
startxref
625
%%EOF


▲ 这是PDF文件的“文件尾”部分,以trailer对象的开始,“trailer <<  >>”里面是一个字典。
△ “/Size  8表示该PDF文件中的obj对象总数。
△ “/Root 1 0 R”表示该PDF文件中的根对象,为“1 0 obj”。
△ “Startxref 625”表示“交叉引用表”的偏移地址,可以用它来定位PDF文档中所有的对象的相对地址。
△ 一般放在文件最后,是文件结束标志。


    以上是我今天一天读PDF Reference的笔记,先到这里,希望园子里的各位高手批评指正,我想只有这样我们大家才能慢慢深入PDF的内部,编出像coolmancheming、老马等高手的软件。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多