歷史,技術基礎,PostScript,技術概括,檔案結構,圖像模式,矢量圖,點陣圖,文本,字型,編碼,透明度,互動式元素,AcroForms,表單數據格式(FDF),Adobe XML表單架構(XFA),邏輯架構與可讀性,安全和簽名,使用權,檔案附屬檔案,元數據,
歷史
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有一些優勢:
PDF包含已標記和解析的PostScript原始碼,以在修改PDF頁面描述中的項與修改所產生的頁面造型之間直接保持一致。
PDF(自1.4版)支持真圖形透明度;PostScript不支持。
PostScript是一種帶有隱形全局狀態的直譯程式語言,因此伴隨著一頁的指令能任何後續頁面的表現。因此,PostScript文檔中所有先前的頁面必須經過處理以決定所給出的頁面的正確的表現,而PDF文檔中的每一頁不受其他因素的影響。結果PDF查看器允許用戶迅速跳轉到長文檔的最後一頁,而一個PostScript查看器需要在能夠顯示目標頁面之前繼續地處理所有的頁面(除可選PostScript文檔結構規範已被周密地遵守外)。
技術概括
檔案結構
PDF檔案是COS("Carousel" Object Structure,Carousel對象結構)格式的子集。COS也伴隨著FDF檔案。COS樹檔案主要由對象組成,其中有八種類型:
對象可以是直接(嵌入其他對象)或非直接的。直接對象以對象號及代號編號。稱為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種圖形狀態屬性,其中最重要的有:
當前變換矩陣(CTM),決定坐標系
剪下路徑
阿爾法複合,透明度的關鍵部分
矢量圖
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及早期的規格的產品中被忽略設計的新的擴展方法完成。結果,使用少量透明度的檔案在舊的查看器中可能會以被接受地視圖查看,但大量用透明度的檔案在舊的查看器中會顯示不正確而沒警告。
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旗標的設定):
HTML表單格式(自PDF 1.5起用HTML 4.01規格;1.2起用HTML 2.0)
表單數據格式(Forms Data Format,FDF)
XML表單數據格式(XML Forms Data Format,XFDF)(擴展XFDF規格,2.0版;自PDF 1.5起被支持;在PDF 1.4中替換XML表單提交格式定義)
PDF(整個文檔可以被提交,而不是單獨的欄位和值)。(PDF 1.4中定義)
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標準的可擴展的元數據。這允許元數據附加到文檔中的任何字元串流,諸如關於嵌入式插圖的說明,以及整個文檔(附加到文檔目錄),使用可擴展的綱要。