千变万化-江西大学生门户's Archiver

admin 发表于 2006-8-22 16:06

PDF研究笔记(一)

我在其他地方看见的,好像有点老了,而且还只有一篇,不过希望对于这里的相关人士有那么点帮助。Acrobat对于汉语的支持实在是不怎么样…… ??%?g  
PDF研究笔记 ?O#?W?  
雩???  
现在我的几个计划都需要我能够对PDF格式进行解码,所以找了一下资料,找到了一个PDF1.3的手册,特放出下载,如果谁有更高版本的,请给我一份,谢谢。 P??○D  
因为最近很忙,所以就不做严格的翻译了,这个笔记将是一个比较简单的文档,而且不会涉及到比较复杂的PDF特性,目前关注点主要在于Pdf->Txt的转换。 ?U?Nb1D  
?Vv@???
下面是正式的笔记: 痧G埤噘@4G  
;h诔??  
??3?'  
概述 ??浇?琼  
PDF文件依赖于PostScript的图像模型,对文本和图像用设备无关和资源无关的语法进行描述。为了提高交互速度,PDF定义了一些不同于PostScrtpi的格式。PDF支持对象,比如注释和超链接,他们不是页面的组成部分,但是对于交互式显示非常重要。 谀着?)??
PDF文件是用一系列编号的对象来建立的。文本,图形和图像等对象用PsostScript语言组织成页面。 v ????
但是PDF文件不是一个PostScript语言程序,也不能直接用PostScript解释器来解释。但是PDF文件的页面描述信息是可以转换成PostScript程序的。 ???s4  
40$逍???
c3洞崔笥?
坐标系统 ??舣?9M  
PDF的坐标系统定义了一个画布,用来显示你的PDF文档。文本、图形和图像在页面上的位置、方向和大小都是用这个坐标系统来定义的。 ?D? >u@?
PDF支持几种坐标系统,他们大部分和PostScript的坐标系统相同。 永R,上 };?
后暂略... ?T。代表Unicode的高位字节必须在前。 C6?q&?  
text还可以包含一个换码序列来标明text使用的语言。换码序列必须用Unicode的16进制值U 001B开头,后面跟随两个由ISO639标准 定义的表示语言的ASCII代码,然后可选择的,跟随两个由ISO3166定义的表示国家的ASCII代码。汉语的语言编号是zh,中国的编号是CN。 鲼r|腙鲻  
name就是一个用/开头的string。 ??媚R揆e  
array就是一个对象的序列。一个array可以有多种类型的对象在其中。用""结束。下面是一个array的例子: >漆纣甸?  
????#39;?
上面的例子也可以作为刚才说过的几种对象的例子。 :??/O,  
dictionary是一对对象的对应表。第一个对象叫做key,第二个叫做value。key必须是一个name对象(这点和PostScript里面的dictionay对象的key不同)。value可以是任何的对象,甚至也可以是一个dictionary。 晷磁师)?
dictionay用"<<"开始,">>"结束。一般dictionay的例子: ??e??  
<< /Type /Example /Key2 12 /Key3 (a string) >> ?速拽珑?  
包含dictionay的dictionay的例子: Q&?b睿   
<< i誊W〈胚  
/Type /AlsoAnExample ??y)??  
/Subtype /Bad ;?a??  
/Reason (unsure) ?X茜D#邂0  
/Version 0.01 廊?u}??
/MyInfo * 瀑轵??
<< ?????  
/Item1 0.4 H? ???
/Item2 true O?n-丕  
/LastItem (not!) ?胝B$:?\  
/VeryLastItem (OK) マV素绒遵  
>> ?傥?s?  
>> ?5Z6?M?
dictionary对象是PDF文档的主要构成部分。PDF文档的很多部分,比如页面、字体,都是用dictionary来表现的。 v磴s匪?L  
stream和string一样就是一个字符的序列。然而应用程序可以读取stream的一个部分,但是读取string就必须读取整个string。所以,尺寸大的数据,比如图像或者页面描述,一般用stream来表现。 B$EN.??
一个stream包含一个dictionary,后面是关键字stream,然后是0行或者多行的字符序列,后面是关键字endstream。 ????]?
所有的stream必须是间接对象。stream的dictionary必须是一个直接对象。关键字stream和stream的dictionary之间必须用回车换行符来分割而不能仅仅用换行符。 0#k //?9  
stream的格式细节暂略。 , 4?"\享G  
null关键字用来表现null对象。 ?朱?e?Y  
直接对象就是boolean、number、string、name、array、dictionary、stream或者null。一个间接对象就是一 个直接对象加上了一个标签,这样就可以被其他的对象所引用。任何类型的对象都可以被标签为间接对象。间接对象非常有用,比如,你可以把stream的 Length key设定为了一个间接对象,这样长度可以保存在stream后面。这样可以让应用程序用一个流程来生成一个PDF文件。 RT? ??n  
一个间接对象包括一个对象标识符,一个直接对象和一个endobj关键字。对象标识符包括一个整数的对象编号,一个整数的生成编号,和一个obj关键字。形如: 屠8????
1 0 obj ?噫\轮  
(test) ?A?酏KW?
endobj ?:?万4l  
用在arrary和dictionary元素里面的对象可以是直接对象,也可以是间接对象。间接对象引用包含一个间接对象的对象编号和产生编号,还有一个关键字R。例如: j?┓隹鹩  
<< /Length 8 0 R >> ?e磴X义?
8 0 obj 谐i?Gm??
64 z8???  
endobj ?=桫`2o?
这里的长度就等于8 0代表的number??64。 Q/T =陕蓰-  
注意:引用一个没有定义的对象,不是一个错误,而是相当于引用一个null对象。

页: [1]
※ 本 站 声 明※

点击注册 千变万化是由昌大师生建立的非官方南昌大学论坛,言论纯属发表者个人意见,与本论坛立场无关
如果?容有涉及侵权,请马上联络
管理员 有事请留言

sitemap

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.