[ 原创首发] PDF Reference 学习札记(一) - 网上读书园地 - 信息资讯...
[ 原创首发] PDF Reference 学习札记(一) 作者: regina 发布日期: 2008-8-03 查看数: 586 出自: 网上读书园地 Google Adsene
PDF Reference 学习札记(一)
By Regina 梳理
进入 readfree 有一段时间了,看了 coolman 、 cheming 、老马等高手的一些旧贴和他们的宝贝后,大大激发了我的求知欲,我感到要想成为他们这样的高手,必须从基础开始学起,学习 PDF Reference 就是我迈出的第一步。今天,我第一次来这里发贴,把我学到的东西和大家一起分享,望高手们批评指正。 我模仿了 PDF Reference 的 example 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.6 是 PDF 的版本信息。 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 >> ”表示其后的 stream 和 endstream 之间的二进制流的长度(注:单位为“字节”)。 △ “ /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 ,生成数为 65535 , f 表示该对象未被引用,这是 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 的内部,编出像 coolman 、 cheming 、老马等高手的软件。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报 。