首页  |  信息资讯  |  资源检索  |  浏览精彩论坛 .
设为首页
收藏本站
站点导航
 新手学园 检索方法 国内文献 国外文献 FTP联盟 BT资源 网络资源 计算机技术 读书软件 外语学习
 网络经管 法律之窗 生命科学 教学相长 学术妙笔 读书参考 文学原创 多媒体 书园茶社 茶社转贴
 强国梦 秋爽斋 淡泊草 水清木华 书园旧梦     
您的位置: 首页 >> 信息资讯 >> 专业交流 >> 读书软件 >> 查看内容
[ 原创首发]  PDF Reference 学习札记(一)
作者: regina  发布日期: 2008-8-03    查看数:    出自: 网上读书园地


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、老马等高手的软件。








PDF Reference 学习札记(一).rar
【论坛浏览】 【我来说两句】 【打印】 【大】 【中】 【小】 【关闭】

 相关评论
作者: coolman 发布日期: 2008-8-03
楼主不忽悠上课,开始做学习笔记了。很多人会失望的。
作者: lucy12345678 发布日期: 2008-8-03

   

   
作者: regina 发布日期: 2008-8-03
哇, 大鲨鱼来了 
  什么上课,没看明白,是不是认错人了

给一个截图,直观地描述PDF内部结构如下:
[attachment=185448]

作者: gear 发布日期: 2008-8-03
也学习学习,
作者: 啊cr 发布日期: 2008-8-03
学习学习
作者: vorber 发布日期: 2008-8-03

QUOTE:
引用第1楼coolman于2008-08-03 18:02发表的  :
楼主不忽悠上课,开始做学习笔记了。很多人会失望的。

难道楼主是传说中的person08
作者: yiqihouba 发布日期: 2008-8-03
秋风落叶乱为堆,
扫去还来千百回。
一笑罢休闲处坐,
任它着地自成灰。
作者: ykjsx 发布日期: 2008-8-03
又打起了哑语  
作者: regina 发布日期: 2008-8-03
希望大家一起讨论 PDF Reference ,共同进步

园子里的高手们,谁能给一个简单的显示“中文”的PDF?

(不要用acrobat生成,用记事本这样写的例子)
作者: ykjsx 发布日期: 2008-8-04
这个值得关注,比发什么星的软件好多了  
共有评论数 15/每页显示数 10

 我来说两句
请遵守国家法律和互联网法规。
您要为您所发的言论的后果负责,故请各位遵纪守法并注意语言文明。
注意:系统启用了静态/缓存功能,您的回复可能不能立即显示。
 热点主题
·网上惊现Pizza Pro破解版
·【2008.08.21更新】bookinfo v1.5 ——读
·某软件奥运版
·Magic PDG BookContents (新一代PDG书签
·httplook破解文件
·VI--对禁言期或被删除的ID,软件销售者无
·(原创)PDF Reference 学习札记 (三)—
·电子书下载整理软件
·求近似于“Foxit Library”支持所有文件格
·介绍一个免费 pdf 工具
 最新主题
·VI--对禁言期或被删除的ID,软件销售者无
·【2008.08.21更新】bookinfo v1.5 ——读
·网上惊现Pizza Pro破解版
·Magic PDG BookContents (新一代PDG书签
·httplook破解文件
·某软件奥运版
·电子书下载整理软件
·介绍一个免费 pdf 工具
·(原创)PDF Reference 学习札记 (三)—
·求近似于“Foxit Library”支持所有文件格
 
 
 
 XML   RSS 2.0   WAP 
 
版权所有  2005  网上读书园地  免责声明  最佳分辨率  1024 X 768
Copyright   ©  http://www.readfree.net  All rights reserved.  Powered by supstie™
鄂ICP备05004310号