移植文档格式(英语:Portable Document Format,简称PDF)是一种用独立于
应用程序、
硬件、
操作系统的方式呈现
文档的
文件格式。每个PDF文件包含固定布局的平面文档的完整描述,包括
文本、
字形、图形及其他需要显示的信息。1991年,Adobe Systems共同创始人约翰·沃诺克提出的名为“Camelot”的系统演变成PDF。
历史
PDF文件格式在1990年代早期开发,用于分享包括文本格式和内置视频的文档,能跨平台操作,即使电脑平台完全不同,收件者亦无需适配相关或合用的
应用软件接口。当时与PDF一起竞逐跨平台文件格式的,还包括
DjVu(仍在开发中)、
Envoy、Common Ground Digital Paper、Farallon Replica及
Adobe自己本身的
PostScript(.ps)格式。在
万维网及
HTML文本尚未兴起的当时,PDF在
桌面出版工作流技术当中很受欢迎。PDF以往是由Adobe控制的专有格式,直到2008年7月1日官方作为
开放标准发行,并由
国际标准化组织以ISO 32000-1:2008标准发布,在这段时间规范通过ISO志愿者产业专家委员会控制。2008年,Adobe发布对ISO 32000-1的公共专利许可赋予对所有Adobe拥有的制作、使用、销售及分发兼容PDF的实现所需的专利的
买断式授权的权益。
PDF 1.7包含了一些由Adobe定义的专有技术,如Adobe XML表单结构(XFA)和
JavaScript中对Acrobat的扩展。这些被ISO 32000-1引用作为实现ISO 32000-1规格的应用所规范化和必须的。这些专有技术没有被规范化,而且这类技术的规格只在Adobe网站上发布。其中的大多数没有得到流行的第三方PDF实现的支持。
2017年7月28日,ISO发布ISO 32000-2。ISO 32000-2没有包含任何专有技术作为规范化的参考资料。
技术基础
PDF主要由三项技术组成:
PostScript
PostScript是一种运行于
解释器以生成图像的
页面描述语言,一个需要大量资源的进程。不仅能处理图形,也具有if及loop之类命令的标准
编程语言特性。PDF很大程度上基于PostScript,但做了简化,以移除像这样的流控制特性,还保持着lineto之类的图形命令。
通常,类PostScript的PDF代码产生于PostScript源文件。以PostScript代码输出的图形命令被收集并
标记;其中文档所引用的任何文件图像或字体也被收集,然后每一件都被压缩成单个文件。由此,整个的PostScript领域(字体、输出、计量)得以保持完整。
作为一个文档格式,PDF相比较于PostScript有一些优势:
技术概括
文件结构
对象可以是直接(嵌入其他对象)或非直接的。直接对象以对象号及代号编号。称为xref表的索引表赋予每个对象从文件开头起的字节偏移量。这一设计允许有效的
随机存取到文件中的对象,还允许无需重写整个文件(增量更新)即可做出小的改动。从PDF 1.5版开始,非直接对象也可位于称为“对象流”的字符串流中。这一增加文件大小的技术有大量小的非直接对象,并且对置标PDF特别有用。
PDF文件有两种输出方式:非线性(非“优化”)和线性(“优化”)。非线性PDF文件比线性的占用更小的硬盘空间,即使因为一部分的数据要求文档中的集合页面通过PDF文件分散开而访问更慢。线性PDF文件(也称“优化”或“web优化”PDF文件)以使得网页浏览器插件无需等待下载整个文件来阅读的方式构建,自从它们以线性方式写入硬盘(如同页面顺序)开始。PDF文件可用
Adobe Acrobat软件或QPDF优化。
图像模式
图形在PDF中呈现的基本设计是以非常类似于PostScript中的方式,除了PDF 1.4增添的透明度的使用。
PDF图形使用
设备独立性笛卡儿坐标系来描述页面的外观。一个PDF页面描述可使用
矩阵来
缩放、
旋转或
错切图形元素。PDF中的一个主要概念是图形状态,即是可能会通过页面描述修改、保存或还原的图形参数的集合。PDF有(如在1.6版)24种图形状态属性,其中最重要的有:
矢量图
PDF中的
矢量图如同在PostScript当中一样,是由路径组成的。路径通常由直线和多项的贝兹曲线组成,但也可以从文本的外廓构建。不同于PostScript,PDF不允许带直线和曲线的单一路径去组合文本外廓。路径可被描绘、填充或用于剪取。描绘和填充可用任意图形状态中的色彩集,包括式样。
PDF支持多种调色板类型。最简单的是瓷砖式样,其中艺术作品的一部分被指定以被重复地绘制。这可能是彩色瓷砖式样,带有在式样对象中的指定的颜色,或是延迟色别编码到式样已绘制时候的没有颜色的瓷砖式样。从PDF 1.3开始还有了底纹式样, 连续绘制不同的颜色。七种底纹式样中最简单的是轴向底纹(Type 2)和径向底纹(Type 3)。
位图
PDF中的
位图(称作Image XObjects)由带相关字符串流的字典呈现。字典描述了图像的属性和包含图像数据的流。(少见的是,位图或许会作为一个内嵌图像被直接嵌入于页面描述。)图像通常出于压缩的目的过滤。PDF中支持的图像过滤器包含了常用的过滤器
通常PDF中包含的所有图像嵌入于图像,但PDF允许图像数据通过使用外部字符串流或替代图像存储于外部文件。PDF的标准子集,包括
PDF/A和PDF/X,禁止这些特性。
文本
文本在PDF中以页面内容字符串流中的“文本元素”呈现出来。一个文本元素指定字符应在指定位置描绘。字符用所选字体源的编码指定。
字体
PDF中的字体对象是对数码
字体的描述。可能是字体中的字符的描述,或者是包含嵌入的字体文件。后者叫嵌入字体,前者叫非嵌入字体。所嵌入的字体文件基于广泛使用的标准数码字体文件:
Type 1(及其压缩版变种CFF)、
TrueType和(自PDF 1.6版起)
OpenType。另外PDF支持由PDF图形处理器描述的字体组件中的Type 3变种。
编码
文本字符串中,字符用以编码映射字形于当前字体的字符代码(整数)显示。预定义的编码有多种,包括WinAnsi、MacRoman,以及大量东亚语言编码,而且字体可以有自己的编码。(即使WinAnsi和MacRoman编码取自Windows和
Macintosh操作系统中历史上的专有编码,用这类编码的内容在任何平台上都运行的好。)PDF可以指定可以使用的预定义的编码、字体内置编码,或者提供预定义或内置编码的查询表(不对TrueType字体推荐)。PDF中的编码机制是为Type 1字体设计的,而且应用到
TrueType字体的规则是复合的。
对于大型字体或者带非标准字形的字体,特殊编码Identity-H(用于横写)或Identity-V(用于竖写)被使用。如果关于字符的语义信息被预定义,这类字体有必要提供ToUnicode表。
透明度
PDF的原始图像模型像PostScript的opaque:页面上描绘的每个对象完全替换先前在同一位置标记的任何东西。在PDF 1.4中图像模型被扩展以允许透明度。使用透明度的时候,新对象与先前标记的对象相互作用产生混合的特效。透明度添加到PDF由写到PDF 1.3及早期的规格的产品中被忽略设计的新的扩展方法完成。结果,使用少量透明度的文件在旧的查看器中可能会以被接受地视图查看,但大量用透明度的文件在旧的查看器中会显示不正确而没警告。
透明度扩展基于透明度组、混合模式、形状和alpha的关键概念。这一模式紧密对应
Adobe Illustrator9的特性。混合模式基于当时
Adobe Photoshop所用的。PDF 1.4规格出版的时候,用于计算混合模式的公式被Adobe保密。此后它们被公布。
PDF规格中透明度组的概念独立于Adobe Illustrator之类的应用中已有的“组”或“层”的概念。那些反映对象之上的逻辑关系的分组在编辑那些对象的时候有意义,但不是图像模型的一部分。
交互式元素
PDF文件或许包含注释、表单、视频和Flash动画之类的交互式元素。
富媒体PDF是一个用来描述可以嵌入或链入PDF的交互式内容的术语。这一内容必须用Flash文件格式提供。Adobe收购Macromedia的时候,公司的主业是Flash,而且Flash播放器被嵌入Adobe Acrobat,Adobe Reader,移除了用于Flash、QuickTime或Windows Media之类第三方插件的需。不幸的是,这造成QuickTime视频从PDF被禁这样与苹果公司的裂痕。富媒体专家Robert Connolly相信这一事件引发了苹果与Adobe之间Flash iPhone/iPad争论之上的冲突。富媒体PDF将不在苹果的iPad之类的iOS设备上操作,而且交互性受到限制。
交互式表单是一个添加表单到PDF文件格式的机制。
PDF当前支持用于集成数据和PDF表单的两种不同的办法。两种格式今天并存于PDF规格:
AcroForms
AcroForms于PDF 1.2格式被引入。AcroForms准许使用对象(如
文本框、选择钮等)及一些代码(如
JavaScript)。
在标准PDF动作类型之外,交互式形式(AcroForms)支持提交、重置和导入数据。“提交”动作传送所选表单字段和值的名称给指定的统一资源定为符(URL)。交互式表单字段名称和值或许会被以任意格式提交(取决于输出格式、提交的PDF和XFDF旗标的设置):
AcroForms可以保持表单字段于包含key:value组合的外部的单独的文件。内部的文件可能使用FDF和XFDF文件。使用权(UR)签名定义导入表单数据文件以FDF、XFDF及文本(
CSV/TSV)格式,及以FDF及XFDF格式从数据文件导出文件的权利。
表单数据格式(FDF)
表单数据格式(Forms Data Format,FDF)基于PDF,使用同样的句法和基本上一样的文件结构,但比PDF简单,自从FDF文档的主体由只有一个要求的对象组成开始。表单数据格式定义于PDF规格(自PDF 1.2起)。表单数据格式可在表单数据到服务器、接收响应和组合到交互式表单的时候被使用。还可以被用来导出表单数据到能被导回到相应的PDF交互式表单的单独的文件。从PDF 1.3开始,FDF可被用来定义用于从所应用的PDF文档分开的注释的容器。FDF通常封装
X.509证书之类的信息、要求证书、设置目录、设置
时间戳服务器和为网络传输嵌入PDF文件。FDF使用MIME内容类型application/vnd.fdf、文件扩展名.fdf,并在Mac OS使用文件类型'FDF'。导入和导出独立FDF文件的支持没有被自由或免费PDF软件广泛的实现。例如,Evince、Okular、Poppler、KPDF或Sumatra PDF没有导入/导出的支持,然而,Evince、Okular和Popller填入PDF Acroforms并在PDF中保存已填写数据。导入独立FDF文件的支持在Adobe Reader中得到实现;导入和导出支持(包括在PDF中保存FDF数据)作为示例在Foxit Reader和PDF-XChange Viewer Free中得到实现;PDF文件中FDF数据的保存也被pdftk支持。
Adobe XML表单架构(XFA)
PDF 1.5格式中,Adobe Systems引入了新的、专有的表单格式,名为Adobe XML表单架构(XFA)。XFA 2.02引用在PDF 1.5规格(及以后的版本),但单独描述为《Adobe XML Forms Architecture (XFA) Specification》,有多个版本。XFA规格没有包括在ISO 32000-1 PDF 1.7并仅仅作为由Adobe创建的外部专有规格引用。在ISO 32000-2(PDF 2.0)当中被弃用。
Adobe XFA表单不与AcroForms兼容。Adobe Reader包含使用XFA表单的“禁用特性”,仅在打开只来自Adobe的可行的技术创建的PDF文档时激活。XFA Forms不兼容于Adobe Reader 6以前的版本。
XFA表单可创建或用作PDF文件或作为XDP(XML数据包)文件。PDF中XFA源的格式由XML数据包规格描述。XDP可能作为单独的文档,也可能在PDF文档的内部携带。XDP提供打包周边XML容器内部的表单组件的机制。XDP也可以打包一个PDF文件,伴随XML表单和模板数据。PDF可能包含XFA(在XDP格式中),XFA也可能包含PDF。在用于XFA表单XFA(XML表单架构)语法从一个应用移到另一个应用的时候,它们必须以XML数据包封装。
当PDF和XFA结合在一起,结果是任意页面中的XFA表单覆盖了PDF背景。这一架构有时被提作XFAF(XFA Foreground,XFA前景)。替代方法是直接在XFA(不用PDF,或者只用带有PDF标记的最小构造XFA的容器的“外挂PDF”,或用
静态XFA表单的预渲染描述作为PDF)展开所有表单,包括样板文件。这有时被称为全XFA。
PDF 1.5开始,可变文本字段的文本内容,以及标记注解可能包含格式信息(样式信息)。这些富文本字符串是匹配XML表单架构规格2.02(本身是XHTML 1.0规格的子集)定义的富文本惯例的XML文档,扩展了CSS2样式属性中受限的设置。PDF 1.6中,PDF支持XML表单架构(XFA)规格2.2定义的富文本元素和属性。PDF 1.7中,PDF支持XML表单架构(XFA)规格2.4定义的富文本元素和属性。
多数PDF处理器不处理XFA内容。生成外挂PDF的时候会被建议包含于PDF标记的一个简单的单页PDF图像显示警告(如:“为了查看本文档的全部内容,你需要新版PDF查看器”等。)能渲染XFA内容的PDF处理器应该不现实警示页面图像或者以动态表单内容迅速替换。带有一些XFA渲染功能支持的PDF软件的例子包括Adobe Reader for Windows、Linux、Mac OS X(但不是Adobe Reader Mobile for Android / iOS)或Nuance PDF Reader。
逻辑架构与可读性
“置标”PDF(ISO 32000-1:2008 14.8)包含文档架构和语义信息以可用可靠的文本提取并能访问。从技术上说,置标PDF是创建在逻辑架构的框架上的对格式的程式化的使用,引入到PDF 1.3。置标PDF定义一组标准的结构类型并赋予允许页面内容(文本、图形和图片)被提取并为其他目的再利用的属性。
置标PDF不需要PDF文件仅仅用来打印的情况。自从这一特性可选,而且ISO 32000-1指定的用于置标PDF的规则相对模糊,对置标PDF的支持在消费装置当中,包括辅助技术(AT),是参差不齐的。
开发针对可读性的PDF规格的ISO标准化子集的AIIM计划起于2004年,最终成为PDF/UA。
安全和签名
一份PDF文件可能以用于验证的担保或者数字签名加密。
由Acrobat PDF提供的标准担保以两种不同的方法及两种不同的密码组成,用户密码,加密文件并阻止开启;所有者密码,指定即使文档被解密的时候应该被限制的操作,可以包括:打印、从文档复制文本和图像、修饰文档,或者添加或删除文本注释和AcroForm字段。用户密码(控制开启)加密文件并要求
密码破解以去除,难度取决于密码长度及加密算法——它可能非常安全(假设好的密码及加密算法没有已知的攻击手法)。所有者密码(控制操作)不加密文件,相反取决于客户端软件以遵循这些限制,并且不安全。所有者密码可以被许多通常可用的PDF破解软件移除,包括一些自由的在线服务。由此,文档作者放在PDF文档中的使用限制不安全,而且不能在一旦文件被散布时保证;这一危险在使用Adobe Acrobat软件以创建或编辑PDF文件应用这类限制的时候显现出来。
即使没有移除密码,许多免费或开源PDF阅读器忽略权限“保护”并允许用户打印或者做文本摘要的复制,就像文档没被密码保护限制一样。
一些解决方案像Adobe的LiveCycle Rights Management更强化信息权利管理的方式,不仅能限制谁能打开文档,而且以标准的安全处理程序做不到的方式可靠的执行权限。
使用权
从PDF 1.5起,使用权(UR)签名用来启用在一些PDF查看器应用中不是默认的附加的交互式特性。这一签名用来验证由真实的授权机构赋予的许可。例如,它可以允许用户:
例如,Adobe Systems在Adobe Reader中授权启用附加特性,使用公钥
密码学。Adobe Reader使用从一个Adobe
授权的权威认证的
验证那个签名。PDF 1.5规格宣称其他PDF阅读器应用可以为他们自己的目的自由使用这一相同机制。
文件附件
PDF文件可以有文档级和页面级的文件附件,读者可访问并打开或存储于本地的文件系统。PDF附件可作为示例用pdftk加到已有的PDF文件。Adobe Reader提供对附件的支持,而且基于
Poppler的阅读器如
Evince或Okular也有对文档级附件的支持。
元数据
PDF文件可包含两种类型的元数据。第一种是文档信息字典,一套像作者、标题、主题、创建及更新日期的关键字/值字段。这存储于可选的文件尾部。有一小组字段是有定义的,而且如果有需要,可以用附加的文本字段扩充。
后来在PDF 1.4中,对元数据流的支持被加入,用可扩展元数据平台(XMP)来添加像在其他文件格式那样的基于XML标准的可扩展的元数据。这允许元数据附加到文档中的任何字符串流,诸如关于嵌入式插图的说明,以及整个文档(附加到文档目录),使用可扩展的纲要。