2. 概述
PDF是一种文件格式,用于以与创建文档时所用的应用软件、硬件和操作系统以及显示或打印文档的输出设备无关的方式来表示文档。一个PDF文档由一组对象组成,这些对象共同描述了一个或多个页面的外观,可能还会伴有额外的交互元素和更高级别的应用程序数据 。一个PDF文件包含构成PDF文档的对象以及相关的结构信息,所有这些都表示为一个自包含的字节序列。
文档的页面(以及其他可视元素)可以包含文本、图形和图像的任意组合。页面的外观由PDF内容流描述,内容流包含一系列要在页面上绘制的图形对象。这种外观是完全确定的;所有布局和格式设置决策都已由生成内容流的应用程序完成。
除了描述页面的静态外观,PDF文档还可以包含一些只有在电子表示中才可能实现的交互元素。PDF支持多种注释类型,用于文本注释、超文本链接、标记、文件附件、声音和影片等。文档可以定义自己的用户界面;键盘和鼠标输入可以触发由PDF对象指定的操作。文档可以包含供用户填写的交互式表单字段,并且可以将这些字段的值导出到其他应用程序或从其他应用程序导入。
最后,PDF文档可以包含对应用程序之间交换内容有用的更高级别信息。除了指定外观,文档的内容还可以包括标识和逻辑结构信息,以便能够在其他地方进行搜索、编辑或提取重用。PDF特别适合在印前制作工作流程的各个阶段表示文档。
2.1 成像模型
PDF的核心能力在于其能够描述复杂图形和排版的外观。这一能力是通过使用Adobe成像模型实现的,该模型与PostScript页面描述语言中使用的高级、设备无关的表示方式相同。
尽管应用程序理论上可以将任何页面描述为全分辨率像素阵列,但由此产生的文件会体积庞大、依赖特定设备,并且对于高分辨率设备而言并不实用。高级成像模型使应用程序能够用抽象图形元素,而非直接用设备像素,来描述包含文本、图形形状和采样图像的页面外观。这样的描述既经济又与设备无关,并且可用于在各种打印机、显示器和其他输出设备上生成高质量的输出。
2.1.1 页面描述语言
除了其他作用外,PDF还充当一种页面描述语言,用于依据成像模型描述页面的图形外观。应用程序通过两个阶段来产生输出:
- 应用程序使用页面描述语言生成所需输出的设备无关描述。
- 控制特定输出设备的程序解释该描述,并在该设备上进行呈现。
这两个阶段可能在不同的地点和时间执行。页面描述语言作为一种交换标准,用于以紧凑、设备无关的方式传输和存储可打印或可显示的文档。
2.1.2 Adobe成像模型
Adobe成像模型是一种源自图形艺术领域的、对二维图形的简洁统一视图。在这个模型中,“颜料”被应用于页面的特定区域:
- 绘制的图形可以是字符形状(字形)、几何形状、线条,或者是诸如照片的数字表示形式的采样图像。
- 颜料可以是彩色的,也可以是黑色、白色或任意灰度。它还可以采用重复图案(PDF 1.2)或颜色之间的平滑过渡(PDF 1.3)的形式。
- 这些元素中的任何一个在放置到页面上时,都可以被裁剪,以使其显示在其他形状内部。
页面的内容流包含操作数和操作符,用于描述一系列图形对象。PDF消费应用程序会维护一个隐式的当前页面,该页面会累积绘制操作符所做的标记。最初,当前页面是完全空白的。对于在内容流中遇到的每个图形对象,应用程序会在当前页面上进行标记,这些标记会替换或与它们覆盖的任何先前标记合并。一旦页面完全合成,累积的标记就会在输出介质上进行呈现,并且当前页面会被清除为空白状态,以便进行下一次绘制。
PDF 1.3及更早版本使用不透明成像模型,在该模型中,绘制到页面上的每个新图形对象都会完全覆盖页面上该位置的先前内容(某些可选参数可能会改变这种行为,具体请参见4.5.6节“叠印控制”)。无论对象是什么颜色(白色、黑色、灰色或彩色),它在页面上的绘制效果就如同使用不透明颜料进行绘制一样。PDF 1.4引入了透明成像模型,在该模型中,绘制在页面上的对象不必完全不透明。相反,新绘制的对象会与页面上先前存在的内容进行合成,根据它们各自的不透明度特性,将对象的颜色与其背景颜色组合,产生最终的显示效果。透明成像模型将在第7章中进行详细描述。
主要的图形对象(以及其他对象)如下:
- 路径对象由一系列相连和不相连的点、线和曲线组成,共同描述形状及其位置。它是通过顺序应用路径构建操作符来构建的,每个操作符会添加一个或多个新元素。路径对象由路径绘制操作符结束,该操作符以某种方式在页面上绘制路径。主要的路径绘制操作符是S(描边),用于沿路径绘制线条,以及f(填充),用于填充路径的内部。
- 文本对象由一个或多个表示文本字符的字形形状组成。字符的字形形状在一个称为字体的单独数据结构中进行描述。与路径对象一样,文本对象也可以进行描边或填充。
- 图像对象是一个矩形的样本值阵列,每个样本值代表矩形内特定位置的颜色。这类对象通常用于表示照片。
绘制操作符需要各种参数,有些是显式的,有些是隐式的。隐式参数包括当前颜色、当前线宽、当前字体(字体类型和大小)以及许多其他参数。这些隐式参数共同构成了图形状态;有专门的操作符用于设置图形状态中每个隐式参数的值。绘制操作符在调用时会使用当前生效的值。
图形状态中的一个额外隐式参数会修改绘制图形对象的结果。当前裁剪路径勾勒出当前页面上可以绘制内容的区域。尽管绘制操作符可能尝试在当前页面的任何位置进行标记,但只有落在当前裁剪路径内的标记才会对页面产生影响;落在路径外的标记则不会产生影响。最初,当前裁剪路径涵盖页面的整个可成像区域。它可以临时缩小为路径或文本对象定义的形状,或者缩小为多个此类形状的交集。后续绘制操作符所做的标记将被限制在该边界内。
2.1.3 光栅输出设备
Adobe成像模型的强大之处很大程度上源于其处理一般光栅输出设备的能力。这类设备涵盖了激光、点阵、喷墨打印机、数字照排机以及光栅扫描显示器等技术。光栅输出设备的定义属性是,打印或显示的图像由一个矩形阵列(即光栅)的点(称为像素,Picture Element)组成,这些像素可以单独寻址。在典型的双色输出设备上,每个像素可以设置为黑色或白色。在一些设备上,像素可以设置为中间灰度或某种颜色。能够设置单个像素的颜色,使得生成的打印或显示输出可以包含文本、任意图形形状以及采样图像的再现。
光栅输出设备的分辨率衡量沿两个线性维度上每单位距离的像素数量。分辨率通常(但并非总是)在水平和垂直方向上相同。制造商在设备技术和性价比权衡方面的决策,造就了不同的分辨率范围:
- 计算机显示器的分辨率相对较低,通常为每英寸75到110像素。
- 点阵打印机的分辨率一般在每英寸100到250像素之间。
- 喷墨和激光扫描静电印刷技术可实现300到1400像素每英寸的中等分辨率。
- 摄影技术能够达到2400像素每英寸或更高的高分辨率。
更高的分辨率可产生质量和保真度更好的输出,但成本也更高。随着技术的进步和计算成本的降低,产品的分辨率也在不断提高。
2.1.4 扫描转换
抽象图形元素(如直线、圆形、字符字形或采样图像)通过一种称为扫描转换的过程在光栅输出设备上进行呈现。给定图形元素的数学描述,此过程确定要调整哪些像素以及为这些像素分配什么值,以便在可用设备分辨率下实现尽可能逼真的呈现。
页面上的像素可以用计算机内存中的二维像素值数组来表示。对于像素只能为黑色或白色的输出设备,每个像素仅需一位即可表示。对于能够再现灰度或颜色的设备,则每个像素需要多位。
注:尽管打印或显示页面的最终表示在逻辑上是一个完整的像素数组,但其在计算机内存中的实际表示不一定是每个像素对应一个存储单元。一些实现使用其他表示形式,如显示列表。Adobe成像模型在设计时已仔细考虑,不依赖于光栅内存的任何特定表示形式。
对于要显示在页面上的每个图形元素,扫描转换器会设置相应像素的值。当页面描述的解释完成后,内存中的像素值就代表了页面的外观。此时,光栅输出过程可以在打印页面或显示屏上呈现此表示(使其可见)。
扫描转换图形形状(如矩形或圆形)需要确定哪些设备像素位于形状内部,并相应地设置它们的值(例如,设置为黑色)。由于形状的边缘并不总是恰好落在像素边界上,因此需要某种策略来决定如何设置边缘处的像素。扫描转换代表文本字符的字形在概念上与扫描转换任意图形形状相同。然而,字符字形对易读性要求更为敏感,必须满足更严格的客观和主观质量标准。
在双色设备上渲染灰度元素是通过一种称为半调的技术实现的。像素阵列根据某种图案(称为半调网屏)被划分为小的簇。在每个簇内,根据页面上该位置所需的灰度级别,将一些像素设置为黑色,另一些设置为白色。从足够远的距离观看时,单个点变得不可察觉,所感知到的结果就是一种灰度。这使得双色光栅输出设备能够再现灰度并近似自然图像(如照片)。一些彩色设备也使用类似的技术。
2.2 其他一般属性
本节介绍PDF除成像模型之外的其他显著的一般属性。
2.2.1 可移植性
PDF文件以8位二进制字节序列的形式表示。PDF文件旨在跨所有平台和操作系统实现可移植性。其二进制表示旨在直接生成、传输和使用,无需在不同平台使用的本地字符集、行尾表示法或其他约定之间进行转换。
任何PDF文件也可以用仅使用7位ASCII(美国信息交换标准代码)字符代码的形式来表示。在本书中,为便于阐述,这种表示形式较为常用。然而,实际使用中并不推荐这种表示形式,因为它不如普通二进制表示高效。无论使用哪种表示形式,PDF文件都必须作为二进制文件进行传输和存储,而不是文本文件。不经意的更改,如文本行尾约定的转换,都可能损坏文件,使其无法使用。
2.2.2 压缩
为了减小文件大小,PDF支持多种行业标准的压缩过滤器:
- 对彩色和灰度图像进行JPEG和(在PDF 1.5中)JPEG2000压缩。
- 对单色图像进行CCITT(第3组或第4组)、行程长度编码和(在PDF 1.4中)JBIG2压缩。
- 对文本、图形和图像进行LZW(Lempel-Ziv-Welch)和(从PDF 1.2开始)Flate压缩。
使用JPEG压缩,彩色和灰度图像的压缩比可达10倍或更高。单色图像的有效压缩程度取决于所使用的压缩过滤器和图像的特性,但通常可以实现2:1至8:1的压缩比(对于满页文本图像的JBIG2压缩,可达到20:1至50:1)。对文档中描述所有其他文本和图形的内容流进行LZW或Flate压缩,压缩比约为2:1。所有这些压缩过滤器都会生成二进制数据,如果需要7位ASCII表示,则可以进一步转换为ASCII base-85编码。
2.2.3 字体管理
在文档交换中,字体管理是一项基本挑战。一般来说,文档的接收者必须拥有与创建文档时最初使用的相同字体。如果使用了不同的字体,其字符集、字形形状和度量可能与原始字体不同。这种替换可能会产生意外和不理想的结果,例如文本行延伸到页边距或与图形重叠。
PDF提供了多种处理字体管理的方法:
- 可以将原始字体程序嵌入PDF文件中,这能确保获得最可预测和可靠的结果。PDF支持多种字体格式,包括Type 1、TrueType、OpenType和CID键控字体。
- 为节省空间,可以嵌入字体子集,其中仅包含文档中实际使用的字符的字形描述。此外,Type 1字体可以以一种特殊的紧凑格式表示。
- PDF规定了一组14种标准字体,无需事先定义即可使用。这些字体包括三种拉丁文本字体(Courier、Helvetica和Times)的四种字重,以及两种符号字体(Symbol和ITC Zapf Dingbats®)。所有PDF消费应用程序都必须提供这些字体或具有相同度量的合适替代字体。
- PDF文件可以按名称引用未嵌入PDF文件中的字体。在这种情况下,如果PDF消费应用程序的环境中存在这些字体,就可以使用它们。但这种方法存在上述提到的不确定性。
- PDF文件为其使用的每种字体都包含一个字体描述符。字体描述符包括字体度量和样式信息,使应用程序在必要时能够选择或合成合适的替代字体。尽管字形的形状与预期不同,但它们的位置是准确的。
字体管理主要关注文本的正确显示效果,即字形的形状和位置。然而,有时PDF应用程序需要提取以某种标准信息编码(如Unicode)表示的文本含义。在某些情况下,可以从PDF文件中表示文本的编码推断出此信息。否则,PDF生成应用程序应通过包含一个特殊对象(ToUnicode CMap)来明确指定映射。
2.2.4 单遍文件生成
由于系统限制和效率方面的考量,应用程序可能有必要或希望以单遍的方式生成PDF文件。例如,程序可能可用内存有限,或者无法打开临时文件。鉴于此,PDF支持单遍生成文件。尽管某些PDF对象必须指定其字节长度,但PDF提供了一种机制,允许对象的长度信息在文件中跟随该对象之后出现。此外,诸如文档页数之类的信息,可以在所有页面生成完毕后再写入文件。
以单遍方式生成的PDF文件,通常在进行高效查看时表现不佳,尤其是在通过网络访问文件内容时。如果生成的PDF文件需要被多次查看,那么进行第二遍处理以优化文件中对象的排列顺序是很有必要的。PDF规定了一种特定的文件组织形式——线性化PDF(Linearized PDF),相关内容在附录F中有详细介绍。此外,还有其他优化方式,例如检测重复的图形对象序列,并将它们合并为一个共享序列,在文件中仅需指定一次。
2.2.5 随机访问
PDF文件应被视为一种扁平化的数据结构表示形式,它由一组对象构成,这些对象之间可以任意相互引用。对象在PDF文件中出现的顺序没有语义意义。一般来说,应用程序应该通过对象间的引用关系来处理PDF文件,而不是按顺序处理对象。这对于交互式文档查看,或者任何需要随机访问PDF文件中的页面或其他对象的应用程序而言,尤为重要。
为了支持对单个对象的随机访问,每个PDF文件都包含一个交叉引用表。借助这个表,无需读取整个文件,就能定位并直接访问文件内的页面和其他重要对象。交叉引用表存储在文件末尾,这使得生成PDF文件的应用程序可以轻松存储它,而读取PDF文件的应用程序也能方便地找到它。通过使用交叉引用表,定位页面或其他对象所需的时间几乎与文档长度无关,这使得包含数百或数千页的PDF文档也能被高效访问。
2.2.6 安全性
PDF具备两种安全特性,可单独或组合应用于任何文档:
- 文档可以进行加密处理,只有授权用户才能访问。文档所有者和其他所有用户有各自独立的授权;并且可以对用户的访问权限进行选择性限制,比如仅允许查看、打印或编辑等操作。
- 文档可以进行数字签名,以证明其真实性。签名形式多种多样,包括用公钥/私钥加密的文档摘要、指纹等生物特征签名等。任何对已签名PDF文件的后续更改都会使签名失效。
2.2.7 增量更新
应用程序通常允许用户修改PDF文档。用户每次保存对文档的修改时,不应需要等待整个文件(可能包含数百页甚至更多内容)被重写。PDF允许将修改内容追加到文件末尾,而原始数据保持不变。文件进行增量更新时添加的附录仅包含实际添加或修改的对象,并且还包括对交叉引用表的更新。增量更新使得应用程序保存对PDF文档的修改所需的时间与修改的大小成正比,而非与文件的整体大小相关。
此外,由于文档的原始内容仍保留在文件中,因此可以通过删除一个或多个附录来撤销已保存的更改。在应用了数字签名且随后需要验证签名的情况下,能够恢复原始文档的确切内容至关重要。
2.2.8 可扩展性
PDF在设计上具有可扩展性。它不仅能够添加新功能,而且基于早期版本PDF开发的应用程序在遇到它们不理解的新功能时,也能保持合理的运行。附录H描述了PDF消费应用程序在这种情况下应有的行为表现。
此外,PDF为应用程序提供了在PDF文件中存储其私有信息的方法。当文件被同一应用程序导入时,这些信息可以被恢复,但其他应用程序会忽略这些信息。因此,PDF既可以作为应用程序的原生文件格式,其文档又能被其他应用程序查看和打印。特定于应用程序的数据既可以作为标记内容注释PDF内容流中的图形对象,也可以作为与PDF内容无关的完全独立的对象进行存储。
2.3 创建PDF
PDF文件既可以由应用程序直接生成,也可以通过从其他文件格式或成像模型转换间接生成。随着PDF文档和处理PDF文档的应用程序越来越普及,人们将发明更多创建和使用PDF的新方法。
许多应用程序能够直接生成PDF文件,有些还可以导入PDF文件。这种直接生成的方式更为可取,因为它使应用程序能够充分利用PDF的全部功能,包括成像模型、交互功能以及文档交换功能。或者,那些无法直接生成PDF的应用程序,也可以间接产生PDF输出。主要有两种间接方法:
- 应用程序通过调用应用程序编程接口(API),如微软Windows系统中的GDI或苹果Mac OS系统中的QuickDraw,来描述其可打印输出。一个称为打印机驱动程序的软件组件会拦截这些调用,并将其解释为PDF格式的输出。
- 应用程序直接以其他文件格式(如PostScript、PCL、HPGL或DVI)生成可打印输出,然后通过单独的转换程序将其转换为PDF格式。
尽管这些间接策略通常是从现有应用程序获得PDF输出的最简便方法,但生成的PDF文件可能无法充分利用高级Adobe成像模型。这是因为应用程序的API调用或中间输出文件中所包含的信息,往往在较低层面描述了预期结果。原始应用程序所维护的任何更高级别的信息都已丢失,打印机驱动程序或转换器无法获取这些信息。
图2.1和图2.2展示了Acrobat产品如何支持这些间接方法。Windows和Mac OS平台上可用的Adobe PDF打印机(图2.1)充当打印机驱动程序,它拦截运行中的应用程序通过操作系统API生成的图形和文本操作。Adobe PDF打印机不会将这些操作直接转换为打印机命令并发送到打印机,而是将它们转换为等效的PDF操作符,并嵌入到PDF文件中。最终生成的是一个平台无关的文件,可以由任何支持的平台(甚至是与原始生成文件的平台不同的平台)上的PDF查看器应用程序(如Acrobat)进行查看和打印。
有些应用程序不通过API调用描述其可打印输出,而是直接生成PostScript页面描述,这可能是由于QuickDraw或GDI成像模型的限制,或者是因为这些应用程序运行在DOS或UNIX等没有系统级打印机驱动程序的平台上。由这类应用程序生成的PostScript文件,可以使用Acrobat Distiller®应用程序转换为PDF文件(见图2.2)。由于PostScript和PDF共享相同的Adobe成像模型,Distiller在转换为PDF时可以保留PostScript文件的精确图形内容。此外,Distiller支持一种名为pdfmark的PostScript语言扩展,它允许生成应用程序在PostScript文件中嵌入指令,以创建超文本链接、逻辑结构以及PDF的其他交互和文档交换功能。同样,生成的PDF文件可以在任何支持的平台上使用查看器应用程序(如Acrobat)进行查看。
2.4 PDF与PostScript语言
PDF中用于设置图形状态和绘制图形对象的操作符,与PostScript语言中的相应操作符类似。然而,与PostScript不同,PDF并非一种完整的编程语言;它牺牲了部分灵活性,以换取更高的效率和可预测性。因此,PDF在以下几个重要方面与PostScript有所不同:
- PDF强制执行严格定义的文件结构,这使得应用程序可以按任意顺序访问文档的各个部分。
- 为简化内容流的处理,PDF不包含常见的编程语言特性,如过程、变量和控制结构。
- PDF文件包含字体度量等信息,以确保查看的准确性。
- PDF文件可能包含与成像模型没有直接关联的额外信息,例如用于交互式查看的超文本链接,以及用于文档交换的逻辑结构信息。
由于这些差异,PDF文件通常无法直接传输到PostScript输出设备进行打印(尽管也有少数PostScript输出设备直接支持PDF)。当应用程序将PDF文档打印到PostScript设备时,必须遵循以下步骤:
- 插入包含PostScript过程定义的过程集,以实现PDF操作符。
- 提取每个页面的内容。每个内容流本质上是传统PostScript程序的脚本部分,使用非常特定的过程,如
m
表示moveto
,l
表示lineto
。 - 根据需要解码压缩的文本、图形和图像数据。PDF中使用的压缩过滤器与PostScript中使用的兼容;它们是否受支持,取决于目标输出设备的语言级别(LanguageLevel)。
- 将任何所需的资源(如字体)插入到PostScript文件中。这些可以是原始字体,也可以是根据PDF文件中的字体度量选择的合适替代字体。字体可能需要转换为PostScript解释器能够识别的格式,如Type 1或Type 42 。
- 将信息按正确的顺序排列。最终得到的是一个传统的PostScript程序,它完整地表示了文档的视觉方面,但不再包含PDF元素,如超文本链接、注释和书签。
- 将PostScript程序传输到输出设备。
本内容为AI生成,请谨慎使用,有不对的地方欢迎指正