国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
為什么 PDF 是最好的「文件格式」| 科普

引言

PDF 是我們打交道最多的文件格式之一。提到這個格式,即使是對技術(shù)并不熟悉的用戶,也能說出「通用性好」、「格式不會亂變」這些優(yōu)點。但同時,PDF 也是讓我們感到困惑最多的格式之一,因為與 Word 文檔等其他常見辦公軟件格式相比,PDF 似乎有著太多的「怪癖」,例如復(fù)制文字困難、幾乎沒法編輯等等。PDF 軟件數(shù)量繁多、質(zhì)量良莠不齊的現(xiàn)狀,也進一步讓很多用戶無法正確理解和使用 PDF。

然而,事實并非如此。這些問題大多不是 PDF 格式的「缺陷」,而是因為我們在觀念上把 PDF 當成了和其他辦公文檔格式相近的東西,并因此期待 PDF 也具有和后者相似的功能和特征。

盡管 PDF 格式和 Word 格式在實際用途上有諸多重疊之處,但那只是表面現(xiàn)象。從技術(shù)角度看,兩種格式之間的差異要遠遠大于 Word 文檔和網(wǎng)頁之間的差異,甚至還要大于 Word 文檔和 Excel 表格之間的差異。

但這并不意味著 PDF 就是一種難以理解的格式。恰恰相反,對大多數(shù)用戶來說,PDF 可能是他們接觸到的格式中最「接地氣」、與現(xiàn)實生活最接近的。因為,PDF 與其說是一種數(shù)字文檔,不如說是實體文檔在數(shù)字世界中的影像。對 PDF 的操作,很大程度上可以看成對真實紙張的操作,只是操作環(huán)境從物理世界換到了數(shù)字世界而已。PDF 的創(chuàng)建就是一種虛擬的打印,復(fù)制 PDF 文字的過程更像是一種抄寫,而 PDF 的編輯實質(zhì)上是一種涂改。

一旦接受了這個觀念,PDF 的很多「怪癖」就顯得順理成章了:打印出來的東西當然不會因為位置的變化而改變外觀;抄寫的結(jié)果很可能與原文存在誤差,并且受制于抄寫者對文字的理解;涂改的可行性則取決于原有布局留下了多少改動空間,并且再輕微的涂改也會對紙張造成損傷。

當然,只給出這樣的結(jié)論并不足以令人信服。因此,下文的主要任務(wù)就是通過回答幾個關(guān)于 PDF 格式普遍關(guān)心的問題,結(jié)合 PDF 的結(jié)構(gòu)和語法,解釋為什么「PDF 的本質(zhì)就是數(shù)字化的紙張」,從而深化對 PDF 格式的理解。

為什么 PDF 的外觀非常穩(wěn)定?

在我們?nèi)粘J褂玫奈臋n格式中,PDF 文件的外觀是最穩(wěn)定的。一經(jīng)生成,無論在什么操作系統(tǒng)上、用什么軟件打開,得到的顯示效果幾乎總是一致的。相比之下,Word 所使用 docx 格式的保真性就差得多了:哪怕只是換臺電腦,顯示效果都可能發(fā)生了變化,更不要說用不同版本的 Word 或者第三方軟件打開了。

PDF 的這種保真性讓它廣受青睞,但它究竟是如何做到這一點的?PDF 的穩(wěn)定是絕對的嗎?

「打印」出來的 PDF

如果平時注意觀察,容易發(fā)現(xiàn)各種軟件中涉及 PDF 的操作,用詞都比較特別。其他格式都是被「新建」(new / create)出來或者「保存」(save)下來的,只有 PDF 是被「導(dǎo)出」(export)甚至「打印」(print)出來的。這些詞語并不是隨意選用的,它們本身就說明了 PDF 的重要特征:「導(dǎo)出」暗示著文件編輯已經(jīng)告一段落,而「打印」則更是形象地表明 PDF 的創(chuàng)建是一個「固化」的過程。

為了進一步理解這種區(qū)別,讓我們來對比一組外觀上完全相同的 Word 文檔和 PDF 文檔。下圖中,右側(cè)的 PDF 格式文件是由左側(cè)的 Word 文件導(dǎo)出得到的,兩者的內(nèi)容都只有「Hello world!」一行居中文字。(注:為了避免不必要的復(fù)雜性,我們暫時只以英文文檔為例。)

一對內(nèi)容相同的 Word 文檔和 PDF 文檔

先來看 Word 是如何實現(xiàn)這一版式效果的。用任意解壓工具將該文檔解開(docx 文件 實質(zhì)上 就是一個壓縮包),找到其中的 /word/_rels/document.xml 并打開。其中的關(guān)鍵部分如下(代碼經(jīng)過整理):

w:pPr>    w:jc w:val='center'/>    w:rPr>w:rFonts w:ascii='Times' w:hAnsi='Times'/>w:lang w:val='en-US'/>w:rPr>w:pPr>w:r w:rsidRPr='003C75CF'>    w:rPr>w:rFonts w:ascii='Times' w:hAnsi='Times'/>w:rPr>    w:t>Hello world!w:t>w:r>

不必恐懼這些陌生的代碼,它們的意義很容易從文檔內(nèi)容本身反推出來。先看倒數(shù)第二行,這里記錄了整個文檔最重要的信息——「Hello world!」這串文字。在它的上面一行,w:rFonts 屬性將字體設(shè)置為 Times。那么前四行是做什么的呢?從第二行的 center 字樣不難猜出,它們控制的是文字所在段落的樣式,包括居中對齊等等。

這就是 docx 格式這類 標記語言 (Markup Language)文檔的特征:在純文本上包裹各種「標簽」(tag)來描述文本的樣式(顏色、位置、字體等等),從而獲得格式豐富多變的文檔。常見的網(wǎng)頁(HTML)、Evernote 筆記( ENML )所用的語法本質(zhì)上都是標記語言,區(qū)別只在于支持的標簽各不相同、因此能實現(xiàn)的格式有多有少罷了。

PDF 又是怎么做的呢?我們用純文本編輯器打開上圖中的 PDF 文件(是的,PDF 可以用文本編輯器打開查看源碼),其中的關(guān)鍵部分如下(經(jīng)過處理):

BT    1 0 0 1 1036 572 Tm    /TT1 12 Tf    [ (He) 24 (l) -48 (l) -48 (o) ] TJETBT    1 0 0 1 1147 572 Tm    /TT1 12 Tf    ( ) TjETBT    1 0 0 1 1160 572 Tm    /TT1 12 Tf    [ (w) 24 (or) -84 (l) -24 (d) ] TJET

即使你被這些凌亂的數(shù)字和代號弄得一頭霧水,大概也能看出它與 docx 格式有著截然不同的畫風。如果我們粗略地把這些語句翻譯成「人話」:

【文字開始】    縮放比例1倍 坐標(1036,572) 【文字定位】    /TT1 12磅 【選擇字體】    [ (He) 間距24 (l) 間距-48 (l) 間距-48 (o) ] 【繪制文字】【文字結(jié)束】【文字開始】    縮放比例1倍 坐標(1147,572) 【文字定位】    /TT1 12磅 【選擇字體】    (空格) 【繪制文字】【文字結(jié)束】【文字開始】    縮放比例1倍 坐標(1060,572) 【文字定位】    /TT1 12磅 【選擇字體】    [ (w) 間距24 (or) 間距-84 (l) 間距-24 (d) ] 【繪制文字】【文字結(jié)束】

請在頭腦中想象一下這個過程——是不是有一種強烈的「機械感」?如果說 Word 文檔使用的標記語言很像是給人下命令(「這里有一段話,把它用 Times 字體寫出來,位置上居中對齊……」),那么 PDF 的語言則更像是在控制機器,定位、調(diào)整、落筆、抬起,移動到下一行;如此重復(fù)。聯(lián)想一下,鉛字排版和打印機的工作機制不也是類似的嗎?可見,用「打印」一詞來搭配 PDF 是十分恰當?shù)摹?/span>

如此對比之下,PDF 顯示效果的保真性就容易解釋了。雖然 Word 格式使用的語法明顯更容易理解,但問題在于不同「人」——不同軟件環(huán)境——聽到同樣一段指令,頭腦中的反應(yīng)未必是相同的?!赣?Times 字體顯示」——哪個是 Times 字體?沒有安裝這個字體怎么辦?「居中對齊」——以什么為參照物居中?怎么計算居中?Word 文檔對此笑而不語,把問題留給了軟件去思考。正是這種自由裁量的空間為顯示效果的差異留下了隱患。

用 Pages 打開 Word 文檔出現(xiàn)的字體缺失問題

在 PDF 中,這樣的問題就很難出現(xiàn)。與標記語言那種相對的、描述式的標簽不同,PDF 語言幾乎都是絕對的、指令式的。例如,上面的 PDF 中,文字明顯是居中的,但代碼中從頭到尾沒有半個字提到「居中」;相反,它直接指明了文字的坐標。因此,無論什么閱讀器讀到這份文件,只要根據(jù)坐標「照葫蘆畫瓢」地繪制,一定能得到相同的顯示效果。

類似地,下面這段代碼的作用是繪制出一個點狀的「L」形,很難想象它會給軟件留下什么「自由發(fā)揮」的空間:

8 w 1 J [20] 0 d【設(shè)置畫筆為 8pt 寬、末端圓角、20pt 點狀線】200 200 m 200 100 l 250 100 l 【移動到(200,200) 畫直線到(200,100) 畫直線到(250,100) 】S 【確認繪制】

PDF 外觀穩(wěn)定性的另一個原因是它嵌入了各種需要用到的外部資源。我們注意到,上面的 PDF 在設(shè)置字體時,沒有像 docx 文件那樣直接指定字體名稱,而是引用了一個代號般的 /TT1。實際上,/TT1 指向的是一個內(nèi)嵌的字體,存儲在 PDF 內(nèi)部的偏后位置。顯示時,閱讀器將根據(jù)這個代號找到字體,按照其中記載的形狀、寬度等信息,將字符「書寫」在指定的坐標上——就好比活字排版工按指示從字盤中取出字模,并放在母版上的特定位置一樣。相反,Word 文檔默認是不嵌入字體的;只要另一臺電腦上沒有安裝用到的字體,或者安裝了不同版本的字體,就會導(dǎo)致顯示效果的差異。

活字

保真性的例外

不過,PDF 的這種保真性也不是絕對的。盡管 PDF 語句已經(jīng)非常精確,也不能排除存在不同解讀方式的可能。特別是在 PDF 文件本身有瑕疵(例如語法不合規(guī)范、資源文件缺損等)時,閱讀器就必須「猜測」文件原本的意圖,誤差也就因此產(chǎn)生了。

例如,下面這份 PDF 格式論文是從中國知網(wǎng)下載的。在用 Adobe 的官方 PDF 工具 Acrobat 打開時,文件基本顯示正常。而在用 macOS 自帶的預(yù)覽 app 或 PDF Expert 打開時,就能明顯看出顯示效果是有問題的——所有的中文都變成了黑體,而不是應(yīng)有的宋體。(你可能注意到從知網(wǎng)下載的 PDF 經(jīng)常存在字體顯示問題。這是因為它們并非由排版軟件直接導(dǎo)出的「一手」版本,而是從私有的 CAJ 格式轉(zhuǎn)制而來的,存在很多兼容性問題。)

存在字體顯示問題的知網(wǎng) PDF

為什么會出現(xiàn)這樣的問題呢?用 Acrobat 附帶的 Preflight 工具檢查文件,可以發(fā)現(xiàn)它引用了包含 STSong-Light (即華文宋體細版)在內(nèi)的數(shù)個字體,但卻沒有嵌入對應(yīng)的字體文件。顯然,這種空頭支票式的做法會引起閱讀器的困惑,它們將只能「猜測」該用什么來代替 STSong-Light,不同的猜測結(jié)論將引發(fā)不同的顯示結(jié)果。

檢查發(fā)現(xiàn)問題 PDF 沒有嵌入應(yīng)有的中文字體

其中,Acrobat 是一個非常「仁慈」的閱讀器,會盡可能做一些合理推測來修復(fù)文件本身的瑕疵??梢钥闯?,它選擇了一個類似的字體——同屬宋體的 Adobe Song Std Light——來代替這個不存在的 STSong-Light。相反,自帶的預(yù)覽 app 就沒有那么多考慮了,它選擇直接回退到系統(tǒng)界面的默認字體—— 蘋方 來顯示,于是我們就只能和一片黑糊糊的黑體大眼瞪小眼。而如果用 Acrobat 的修復(fù)功能將缺失的字體文件補充進 PDF 后,將會發(fā)現(xiàn)預(yù)覽 app 也能正確顯示中文字體了,這印證了我們對問題成因的分析。

為什么 PDF 中的文字經(jīng)常難以復(fù)制?

如果說 PDF 顯示效果的穩(wěn)定是它吸引人們使用的主要優(yōu)勢,那么「文字難復(fù)制」一定是它讓很多人敬而遠之的原因之首。確實,從網(wǎng)頁上復(fù)制文字的那種方便靈活在 PDF 這里幾乎是一種奢望。很多時候,就連第一關(guān)——準確選中要復(fù)制的文字,都是難以跨越的障礙。

PDF 為什么對復(fù)制操作這么不友好呢?換種問法,滿足什么條件的 PDF 才能正確復(fù)制出文字呢?答案是,PDF 文件的內(nèi)容、文本的排列方式,以及文本和字體的編碼都會影響到文本的復(fù)制。另外,閱讀器對于復(fù)制操作的優(yōu)化也是不可忽視的。

從掃描版 PDF 復(fù)制文本

要把文字復(fù)制出來,一個前提是 PDF 中必須真的包含文字。這聽起來好像是一句廢話,但實踐中大多數(shù)「文字復(fù)制不出來」的問題,原因都是目標 PDF 中根本沒有文本。這尤其多見于那些掃描而來的電子書和電子文檔;如果不經(jīng)處理,它們的每一頁不過是原始文件的一張「照片」而已,顯然無法復(fù)制出文字。

當然,掃描版 PDF 是完全可能支持復(fù)制的。OCR(光學(xué)字符識別)工具可以識別出圖像中的文本,并將其寫入 PDF 中,使其支持選中和復(fù)制;這也是很多收費 PDF 軟件主要宣傳的功能點。需要避免的一個認識誤區(qū)是,即使經(jīng)過 OCR 處理的 PDF,其中的文本也并不是「附身」在原來的圖片上的。相反,它們通常被存儲在一個單獨的文本對象中,與圖片中的文字位置一一對齊。只不過由于 PDF 中的文本可以被設(shè)置為隱藏,當用戶試圖選中和復(fù)制這些隱藏文本時,看起來就好像是直接在圖片上選中和復(fù)制文字一樣。

經(jīng)過 OCR 處理的掃描版 PDF 同樣可以選中和復(fù)制

這就解釋了為什么在一些掃描版 PDF 中,文字選中效果看起來是「歪」的;而在另一些 PDF 中,選中和復(fù)制操作總是不連續(xù)或不完整。前者是因為加入的隱藏文本圖層沒有與圖片上的文字位置對齊,后者則是因為 OCR 識別不全,或者將連續(xù)的文本識別成了孤立的文字。

跨行和跨段復(fù)制文本

麻煩還遠沒有結(jié)束。即使確認了 PDF 中包含文本,也并不意味著就能把它們原封不動地復(fù)制出來。在復(fù)制跨越數(shù)行乃至數(shù)段的大片文本時,我們往往不能得到所預(yù)期的完整段落,而是多了一些無用的空白或者換行。例如,在下圖所示的復(fù)制結(jié)果中,PDF 似乎把頁面上的換行和連字符照單全收了,即使它們顯然不是原文的一部分。同樣的問題也會影響到文本搜索,很多 PDF 中,斷成兩行的詞是無法正常搜索的。

復(fù)制操作容易把不需要的內(nèi)容也一并復(fù)制出來

這類現(xiàn)象仍然可以從「紙」的比喻中得到解釋。和紙質(zhì)文件一樣,PDF 只負責記載形態(tài)而不記載含義。一個可能違反直覺的事實是,PDF 對于「段落」是沒有概念的。在其他格式中復(fù)制跨越兩行的文本,之所以能得到連續(xù)的結(jié)果,是因為軟件知道這串文字屬于同一個段落,顯示成兩行只是因為文檔寬度的限制。類似地,如果一個長單詞被拆成兩行顯示,其他格式在復(fù)制時是不會帶上連字符的,因為軟件知道那不是單詞的一部分

在 PDF 中,這些結(jié)論都不適用。還是以上面那份 PDF 為例。觀察它的第一段第二行到第二段第一行:這三行涉及了分詞(行尾連字符)和分段兩個排版要素。這一部分在 PDF 代碼中的反映是:

q 1 0 0 1 57 755 cm BT 【定位到(57,755)】    13 0 0 13 0 0 Tm /Tc1 1 Tf 【設(shè)定字體】    [(…略去之前部分…) -141.7 (indepen) ] TJ 【繪制第一段第二行】ET Qq 1 0 0 1 533 755 cm BT 【定位到(533,755)】    13 0 0 13 0 0 Tm /Tc1 1 Tf 【設(shè)定字體】    (-) Tj 【繪制行尾的連字符】ET Qq 1 0 0 1 57 738 cm BT 【定位到(57,738)】    13 0 0 13 0 0 Tm /Tc1 1 Tf 【設(shè)定字體】    [ (dent o) 6 (…略去中間部分…) (ems) 5 (. ) ] TJ 【繪制第一段第三行】ET Qq 1 0 0 1 57 715 cm BT 【定位到(57,715)】    13 0 0 13 0 0 Tm /Tc1 1 Tf 【設(shè)定字體】    [ (Based ) (…略去之后部分…)] TJ 【繪制第二段第一行】ET Q

這里,我們需要關(guān)注的只有兩點:第一,代碼中的 Tj 或 TJ(繪制文字)命令每次處理的文字都不超過一行。實際上,PDF 實現(xiàn)換行和分段的方法,只不過是把那個「想象中的筆尖」移動到下一行或下一段的起始坐標處罷了。換句話說,除了筆尖移動幅度更大(以反映段間距),分段和普通分行在 PDF 中沒有任何區(qū)別。

第二,原文第二行行尾的連字符出現(xiàn)在了 PDF 代碼中。在同一份文檔的 Word 版本代碼中,這個連字符是不存在的,因為它并不是輸入內(nèi)容的一部分。換句話說,其他格式不在文件中記錄,只在打開時才根據(jù)需要顯示的排版特性,制成 PDF 后卻被「固化」下來了。

既然 PDF 不記錄段落信息,而換行和連字符又明明白白地寫在文件中,它們會出現(xiàn)在復(fù)制結(jié)果里也就并不奇怪了。

當然,閱讀器可以根據(jù)文本的內(nèi)容和布局等特征進行推斷,提供更為合理的復(fù)制效果。例如打開上面的 PDF 時,PDF Expert 和 Chrome 瀏覽器內(nèi)建的閱讀器都會對行尾的連字符作特殊處理,復(fù)制的結(jié)果是一個完整的單詞,搜索中間斷開的「independent」整詞也能定位到結(jié)果;相反,用 macOS 自帶的預(yù)覽 app 和 Firefox 內(nèi)建的閱讀器打開時,復(fù)制操作會把連字符當作單詞的一部分,搜索整詞也得不到結(jié)果。

可能有人會問:PDF 為什么連如此基礎(chǔ)的段落功能都不支持呢?這實際上是一種有意為之的選擇。PDF 是作為一種電子化的打印被 發(fā)明 出來的,而打印意味著編輯工作的終點。因此,PDF 完全可以不考慮宏觀層面的排版功能(因為用來創(chuàng)建它的字處理和制版軟件在這方面更專業(yè)),而只保留對少數(shù)局部版式(例如文字間距/Kerning)的支持。這不僅有利于節(jié)省文件空間,也進一步強化了 PDF 跨平臺顯示的穩(wěn)定性。

復(fù)制 PDF 文本的亂碼問題

確認了 PDF 里有文字,文本的排列也很整齊,是不是就能皆大歡喜了呢?很遺憾,對于中文用戶來說,從 PDF 中復(fù)制文字經(jīng)常還會遇到一道坎:亂碼。

亂碼問題雖然在其他場合(例如網(wǎng)頁、游戲等)也存在,但那基本都是發(fā)生在文字的顯示階段。既然 PDF 都正確顯示了文字,為什么一經(jīng)復(fù)制卻變得不是那回事了呢?

如上所述,PDF 的生成本質(zhì)上就是一個「虛擬打印」的過程。這個比喻的言外之意——打印機是不識字的。它的全部使命,就是在紙張上按照坐標和字體記載的形狀,照葫蘆畫瓢地排列出指定的文字;整個過程完全不涉及「這是什么字」之類的問題。類似地,PDF 繪制文本的流程,也不過是從字體資源文件中取出特定碼位上的字符(glyph),放置在某個坐標位置上。至于取出來的到底是什么字,PDF 根本不關(guān)心。

可如果 PDF 是一個「文盲」,它在復(fù)制操作中又是靠什么給出我們需要的文本的呢?

我們知道,計算機中的文字是通過編碼來區(qū)分和調(diào)用的。目前,最通用和常見的編碼方案是 Unicode。另一方面,在 PDF 內(nèi)部嵌入的字體文件中,每個字符也有一個編碼;繪制文字時,Tj/TJ 命令可以通過這個編碼向字體文件索取需要的字符。

上述兩套編碼可以是(并且在非英文環(huán)境下往往是)不同的,它們之間的「橋梁」,就是字體所附帶的 ToUnicode 屬性。ToUnicode 的值是一張映射關(guān)系表(稱作 character map / CMap),它給出了字體文件中每個碼位上的字符與 Unicode 編碼的對應(yīng)關(guān)系。在復(fù)制、搜索等操作中,PDF 就是靠 CMap 這張表得知每個字符到底是什么「字」的。

PDF 涉及的兩套編碼

問題是:如果這張表弄丟了呢?或者雖然沒有丟,但是缺損了一塊?或者被人惡意篡改了?

讓我們來做一個「指鹿為馬」的實驗。下圖是一個非常簡單的 PDF 文件,上面只有一個「鹿」字。

示例 PDF 和它的 CMap 片段

用文本編輯器打開 PDF,可以看到  Tj 這一語句。不難猜出,該語句的作用是繪制字體文件中編碼為 0xBA6F 的字符。根據(jù) PDF 對象的交叉引用關(guān)系(后文會介紹)找到 CMap,其關(guān)鍵部分為:

w:pPr>    w:jc w:val='center'/>    w:rPr>w:rFonts w:ascii='Times' w:hAnsi='Times'/>w:lang w:val='en-US'/>w:rPr>w:pPr>w:r w:rsidRPr='003C75CF'>    w:rPr>w:rFonts w:ascii='Times' w:hAnsi='Times'/>w:rPr>    w:t>Hello world!w:t>w:r>

不難看出,這個 CMap 告訴閱讀器:字體文件中編碼為 0x6ABF 的字符對應(yīng) Unicode 中的 U+2FC5。查 Unicode 碼表可知,U+2FC5 正是漢字「鹿」。

現(xiàn)在,我們將上面代碼中的 2FC5 改成 9A6C,然后重新打開 PDF 文件。外觀上,文件似乎并沒有任何變化。但如果你試著把這個字復(fù)制出來,會發(fā)現(xiàn)得到的結(jié)果是「馬」。

「指鹿為馬」

這并不是什么靈異事件,因為「馬」在 Unicode 中正是 U+9A6C。

上述實驗表明,PDF 中的「所見」未必就是「所得」。只要 /ToUnicode 的內(nèi)容(較舊的或者英文的 PDF 也可能是 /Encoding 屬性)發(fā)生丟失或者錯誤,文字復(fù)制就會出現(xiàn)亂碼。與此同時,PDF 的顯示卻不會受到任何影響(因為文字繪制是由與編碼完全無關(guān)的語句控制的)。反過來思考,利用亂碼故障的原理,也可以通過故意破壞或者修改 CMap,制造出表面正常但完全無法復(fù)制和搜索的文件,間接達到加密的效果。

為什么 PDF 很難編輯?

除了顯示、復(fù)制上的問題,PDF 難以編輯的特性也經(jīng)常引發(fā)用戶的疑問。不僅大多數(shù)可以免費獲得的 PDF 工具都只有閱讀功能,即使是那些具有編輯功能的軟件,編輯效果也往往達不到預(yù)期,甚至反而影響其他部分的格式。

如何解釋 PDF 的這一特征呢?還是回到本文一以貫之的思路:把 PDF 看作真實的紙張來理解。

試想你手上有一份紙質(zhì)筆記或者文件需要臨時涂改。生活經(jīng)驗告訴我們下面幾點事實:第一,涂改操作只可能是小范圍的、逐字逐詞的。即使真的不得不修改一大段內(nèi)容,你也只能慢慢用涂改液或者膠帶把它們抹去。第二,紙上原有的內(nèi)容越多、格式越復(fù)雜,涂改起來就越困難。在增刪文字時必須要考慮到前后文的限制;原來的內(nèi)容越密集,留下的修改余地就越小。第三,很難實現(xiàn)完全不留痕跡的涂改。任何涂改操作都會對紙張造成損傷;對文字的修正,從紙張的角度看反而是一種「污染」。

這些描述幾乎完全適用于 PDF 文件的編輯,而原因還是要從內(nèi)部結(jié)構(gòu)來分析。前文中,我們已經(jīng)了解了 PDF 語句如何在局部層面繪制出文本和圖形,這里再從宏觀角度簡單介紹一下 PDF 的構(gòu)造。

一個 PDF 文件主要由四個部分構(gòu)成,依次是文件頭(Header)、主體(Body)、交叉引用表(Cross-Reference Table)和文件尾(Trailer)。在其中最重要的主體部分,頁面、文本等元素和字體、圖片等資源存儲在稱為「對象」(object)的單元中。每個對象都有唯一的編號,并且可以無盡地相互包含和引用。例如,一個編號為 2 的頁面對象可以包含一個編號為 3 的子對象來描述頁面尺寸,又包含一個編號為 4 的子對象來存儲該頁上的文本;后者在指定字體時,又可以引用一個編號為 20 的字體對象,而這個字體對象的大小、字符寬度、曲線輪廓等信息也是分別存儲在其他對象中的;等等。

一個可能的 PDF 的構(gòu)造

讀取 PDF 時,閱讀器首先從文件頭確定文件類型和版本號,旋即跳轉(zhuǎn)到文件尾,獲取交叉引用表的位置(以字節(jié)位置表示),它進而列出了 PDF 中所有對象的位置。憑借這張表,閱讀器就能找到每個對象,解析它們之間的包含和引用關(guān)系,并按照其中的命令將文件的全貌繪制出來。

這樣的構(gòu)造對 PDF 的編輯有什么潛在影響呢?可以看出,PDF 的結(jié)構(gòu)是高度固化并且相互依賴的。它就像是一個積木堆,其中的每一塊「積木」——PDF 中的一個對象——都不是獨立的,而是與四周的其他積木相互支撐。編輯 PDF 文件就如同試圖改變一個成型的積木堆:移去或挪動一塊積木(對象),周圍的木塊不僅不會自動補上空白,反而可能因為失去支撐(對象的交叉引用關(guān)系)而變形。比如,從 PDF 中刪去一段,后面的文本并不會自動調(diào)整位置;相反,如果繪制它們的語句引用了被刪除部分的樣式,這些樣式也可能隨著刪除操作而丟失。

用 PDF Expert 刪除一段文字,后面的段落無法自動補齊空隙

而如果要往積木堆上增加一塊——往 PDF 中增加內(nèi)容,面臨的風險同樣很大。且不論現(xiàn)有的空隙是否允許這么做,你也無法預(yù)知剩余的積木塊中是否有自己需要的。例如,出于節(jié)省體積的考慮,PDF 中嵌入的字體文件往往都是高度「子集化」的,只包含文件中用上的那部分字符。如果準備追加的字恰好不在其列,就很可能引發(fā)顯示問題。

退一步說,即使編輯操作幸運地沒有引發(fā)任何問題,它的成本也是很高的。哪怕只是插入一個字母的「微量」編輯,也會導(dǎo)致排在它之后所有內(nèi)容的地址向后偏移 1 字節(jié),于是依靠字節(jié)計數(shù)來定位的交叉引用表必須整個重寫。假如你的改動幅度更大(例如用了新的字體),就需要靠新增對象來實現(xiàn),于是其他對象也必須相應(yīng)更新以反映對象編號的變化。另一方面,從 PDF 中刪去內(nèi)容時,編輯器未必能聰明到把不再有用的對象一并刪去。很多時候,這些成為空殼的對象就被「拋棄」在原地,白白占用空間,并且增加閱讀器解析文件時的計算成本。

作為對比,Word 格式那種標記語言的特性——在純文本上包裹標簽來記載格式信息——決定了它對于編輯操作是十分友好的。由于文本的內(nèi)容和格式相互獨立,修改文本內(nèi)容并不會對格式造成影響,反之亦然。這就好比把水倒在有造型的容器中,換掉一部分水,剩下的水依然服從于容器的形狀;換一個容器,水的形狀隨之變化,但還是原來那些水。

需要加以區(qū)分的是,對 PDF 的標注(annotation)操作——包括高亮、下劃線、筆記等——不屬于「編輯」的范疇。在實現(xiàn)層面,PDF 中的標注是附屬于所在頁面的子對象,其中記載了標注的類型、位置、形狀(如果有)、文本(如果有)等,與存儲文件內(nèi)容的對象相互獨立。它們就像是紙上的便利貼,可以隨時移除而不留下痕跡。

那作為用戶,如果確實遇到編輯 PDF 的需求,應(yīng)當如何解決呢?

首先,應(yīng)當考慮是不是真的需要修改 PDF 文件本身。假如你將一份文件打印出來以后發(fā)現(xiàn)了錯別字,第一反應(yīng)恐怕是回到電腦上修改、然后重新打印那一頁,而不是用膠帶粘去錯字然后手寫。類似地,既然 PDF 文件的本質(zhì)就是「電子紙張」,如果發(fā)現(xiàn)錯誤,最正確和簡捷的做法應(yīng)該是改動用于生成這個 PDF 的原始文檔,然后重新導(dǎo)出一遍,而不是考慮怎么修改 PDF 本身。

即使手上沒有生成 PDF 的原始文檔,在直接修改 PDF 時也應(yīng)該盡量控制編輯幅度。因為修改越多,對文件的「污染」就越大,也就越有可能造成格式混亂、體積膨脹等結(jié)果。如果要修改的內(nèi)容確實很多,甚至可以考慮轉(zhuǎn)換/ OCR 為其他格式—編輯文字—導(dǎo)出為 PDF 這樣的路徑,或許效果反而比直接編輯好得多。

最后,盡管 PDF 對編輯操作非常不友好,但畢竟「事在人為」,不同軟件的編輯能力有很大差別。例如,來自第一方的 Acrobat Pro 就明顯高于平均水平。根據(jù)測試,它不僅能從 PDF 的布局中判斷出段落并以此為單位編輯(而不是孤立的文本塊),還能在編輯中一定程度上維持原有的對齊方式、段間距等設(shè)置。更為「黑科技」的是 Acrobat 的 OCR 功能,它甚至可以做到在識別文字的同時,將文本矢量化后、分離到與背景獨立的圖層中,從而能增刪掃描版 PDF 中的文字。

Acrobat 可以將掃面版 PDF 中的文字矢量化后實現(xiàn)編輯

結(jié)語

任何文件格式都有自己最擅長的用途。對 PDF 來說,它擅長的領(lǐng)域就是跨平臺交換和文件歸檔,而那些需要頻繁編輯文本內(nèi)容和版式的應(yīng)用場景,則是其不能勝任的。只是在日常使用中,我們常常被 PDF 和其他文檔格式在外觀上的相似所誤導(dǎo),把它用在了不擅長的領(lǐng)域,然后反過來抱怨這種格式在編輯和復(fù)制中的「笨拙」。這多少是錯怪了 PDF。本文之所以一再將 PDF 類比為實體文檔,一方面是為了便于解釋技術(shù)原理,另一方面也是為了提供一種選用 PDF 格式的標準:適合打印出來的內(nèi)容,一般也才適合「打印」成 PDF。

理解 PDF 的原理也有助于挑選合適的閱讀/編輯工具。如上所述,軟件對瑕疵 PDF 的寬容度和修復(fù)能力,對文本搜索、復(fù)制的識別、優(yōu)化能力等細節(jié),是最值得重點考察的;這些看似不起眼的功能點對使用體驗和工作效率有極大影響。相反,那些頻繁被當作營銷「亮點」的功能,特別是 PDF 編輯、格式轉(zhuǎn)換等,反而不那么重要。因為 PDF 從結(jié)構(gòu)上就不適合修改,這些所謂的編輯功能很難達到用戶的預(yù)期,何況還有大量類似于 SmallPDF 的免費工具可以滿足臨時的、精度不高的編輯需求。至于嚴肅、專業(yè)的 PDF 編輯,Acrobat 可能是唯一的選擇。

最后需要說明的是,PDF 涉及的技術(shù)非常復(fù)雜,這篇文章只是從日常使用的角度做了最粗淺的介紹。文中很多地方為了便于理解,采用的解釋和比喻是過度簡化的。如果對 PDF 格式的原理有進一步的興趣,建議直接閱讀 PDF 的 標準文件。這份標準雖然十分冗長,但并不難讀。哪怕只是挑選幾個關(guān)心的主題來瀏覽,相信都會對理解 PDF 格式以至排版技術(shù)有很大的啟發(fā)。


本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
導(dǎo)出PDF文件中的圖片,只需要一招!
用CAJViewer閱讀器打開pdf識別文字并轉(zhuǎn)換為doc
免費了12年的神器開源了,你可能不知道它有多強大
PDF論文轉(zhuǎn)換利器助力kindle學(xué)術(shù)閱讀,文末附贈獲取方式
編輯、修改PDF文檔的技巧
簡單PDF文件打開軟件 1.3 解決PDF文件怎么打開
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服