PDF学习--荆轲

PDF学习

 PDF(Portable   Document   Format,便携式文档结构)是一种很有用的文件格式,其最大的特点是平台无关而且功能强大(支持文字/图象/表单/链接/音乐/视频等)。

PDF规范从1993年到现在,已经有过7个版本,六次版本升级,从最初的pdf1.0.6版本到现在的PDF1.7, 每次的版本升级都会加入一些新的特性,PDF参考说明书也是从最初的100多页到现在的1000多页。

PDF规范的发展升级:

1.1 1995 加入了文档加密(40字节),线索树,名字树,链接,设备独立色彩资源。 

1.2 1996 表单, 半色调屏幕,和其他的一些高级色彩特性, 对中文,日文和韩文的支持 

1.3 2000 数字签名, 逻辑结构, JavaScript, 嵌入式文件,Masked Images, 平滑阴影, 支持 CID字体的附加色彩。 

1.4 2001 文件加密 (128 字节), 标签式 PDF, 访问控制,透明,元数据流 

1.5 2003 文档加密 (公钥), JPEG 2000 压缩, 可选的内容组,附加的注解类型 

1.6 2005 文档加密 (AES),增加最大文件支持,加入3D支持,额外的注解类型

1.物理结构

1.1 版本号

这是个固定格式,表示这个PDF文件遵循的PDF规范版本。从1.4版本以后,PDF文件的版本并不唯一的只是在这里表示了,可能后面会改写(catalog的Version词条),所以解析PDF的时候,如果这里的版本大于等于1.4,应该再比较一下catalog里面的version,取其中高一点的版本。

1.2 对象集合

这是一个PDF文件最重要的部分,文件中用到的所有对象都在这里定义。格式如下。

前面的24是对象序号,其用来唯一标记一个对象;0是生成号,按照PDF规范,如果一个PDF文件被修改,那这个数字是累加的,它和对象序号一起标记是原始对象还是修改后的对象,但是实际开发中,很少有用这种方式修改PDF的,都是重新编排对象号;obj和endobj是对象的定义范围,可以抽象的理解为这就是一个左括号和右括号;

可以通过R关键字来引用任何一个对象,比如要引用上面的对象,可以使用24 0 R,需要主意的是,R关键字不仅可以引用一个已经定义的对象,还可以引用一个并不存在的对象,而且效果就和引用了一个空对象一样。

1.3 交叉引用表

交叉引用表是PDf文件内部一种特殊的文件组织方式,可以很方便的根据对象号随机访问一个对象,一般放在文档偏末尾的地方。

xref是开始标志,表示以下为一个交叉引用表的内容;每个交叉引用表又可以分为若干个子段,每个子段的第一行是两个数字,第一个是对象起始号,后面是连续的对象个数,接着每行是这个子段的每个对象的具体信息——每行的前10个数字代表这个这个对象相对文件头的偏移地址,后面的5位数字是生成号(用于标记PDF的更新信息,和对象的生成号作用类似),最后一位f或n表示对象是否被使用(n表示使用,f表示被删除或没有用)。上面这个交叉引用表一共有4个子段,分别有1个,1个,2个对象,12个对象,第一个子段的对象不可用,其余子段对象可用。

1.4 trailer

通过trailer可以快速的找到交叉引用表的位置,进而可以精确定位每一个对象;还可以通过它本身的字典还可以获取文件的一些全局信息,加密信息,等等。


trailer后面紧跟一个字典,包含若干键-值对。具体含义如下:

键     值类型      值说明

Size      整形数字     所有间接对象的个数。一个PDF文件,如果被更新过,则会有多个对象集合、交叉引用表、trailer,最后一个trailer的这个字段记录了之前所有对象的个数。

Prev      整形数字     当文件有多个对象集合、交叉引用表和trailer时,才会有这个键,它表示前一个相对于文件头的偏移位置。

Root     字典      Catalog字典(文件的逻辑入口点)的对象号。必须是间接对象。

Info       字典      存放文档信息的字典,必须是间接对象。

ID  数组      文件的ID

startxref:   后面的数字表示最后一个交叉引用表相对于文件起始位置的偏移量。  

%%EOF   :文件结束符。

数据字典:用"<<"和">>"包含的若干组条目,每组条目都由key和value组成,其中key必须是name对象,并且一个dictionary内的key是唯一的;value可以是任何pdf的合法对象(包括dictionary对象)。

2.逻辑结构

PDF的逻辑大体上是一个树状结构,根节点是catalog字典,通过这里去解析页、目录、链接信息等等。

2.1 Pages字段

这是个必须字段,是PDF里面所有页面的描述集合。Pages字段本身是个字典,它里面又包含了一下几个主要字段:

字段     类型      值

Type     name      (必须)只能为Pages 。

Parent   dictionary     (如果不是catalog里面指定的跟节点,则必须有,并且必须是间接对象) 当前节点的直接父节点。

Kids      array      (必须)一个间接对象组成的数组,节点可能是page或page tree。

Count   integer   (必须) page tree里面所包含叶子节点(page 对象)的个数。

2.2 page对象

Page对象描述了一个PDF页面的属性、资源等信息。

2.3 outline对象

Outline是PDF里面为了方便用户从PDF的一部分跳转到另外一部分而设计的,有时候也叫书签(Bookmark),它是一个树状结构,可以直观的把PDF文件结构展现给用户。用户可以通过鼠标点击来打开或者关闭某个outline项来实现交互,当打开一个outline时,用户可以看到它的所有子节点,关闭一个outline的时候,这个outline的所有子节点会自动隐藏。并且,在点击的时候,阅读器会自动跳转到outline对应的页面位置。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用Power Query对每个小组内的学生总分进行排名,按照以下步骤进行操作: 1. 将学生数据复制到一个新的Excel工作表中,确保列标题正确。 2. 在Excel菜单栏中选择“数据”选项卡,然后点击“从表格/范围”来创建一个新的查询。 3. 在“导入数据”对话框中,选择需要导入的学生数据范围并勾选“我的表格包含标题”选项,然后点击“确定”。 4. 在Power Query编辑器中,点击“组”列标题的下拉箭头,并选择“排序”>“升序”。 5. 在Power Query编辑器中,点击“姓名”列标题的下拉箭头,并选择“排序”>“升序”。 6. 在Power Query编辑器中,点击“数学”、“英语”和“语文”列标题的下拉箭头,并选择“更多操作”>“添加列”>“自定义列”。 7. 在弹出的对话框中,输入列名为“总分”,并在公式框中输入以下公式:[数学] + [英语] + [语文],然后点击“确定”。 8. 在Power Query编辑器中,点击“总分”列标题的下拉箭头,并选择“排序”>“降序”。 9. 在Power Query编辑器中,点击“姓名”列标题的下拉箭头,并选择“排名”>“升序”。 10. 点击“关闭并应用”按钮来应用查询并关闭Power Query编辑器。 11. 查询将被应用到工作表中,将显示每个小组内学生的总分排名。 通过这种方法,您可以使用Power Query轻松对每个小组内的学生总分进行排名。请根据您的实际情况进行调整和修改查询。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值