2017-03-16 77 views
1

我想圍繞PDF文件結構包裹我的頭。有一個標題,一個包含對象的主體,一個交叉引用表和一個預告片。在從Adobe官方PDF reference,有關文件尾部部分3.4.4,我們可以讀到:爲什麼應用程序會向後讀取PDF文件?

一個PDF文件的尾部使應用程序讀取文件快速找到交叉引用表及某些特殊對象。應用程序應從其末尾讀取PDF文件。

這對我來說效率很低。在加載整個文件之前,我無法以這種方式向用戶顯示任何內容(甚至不是第一頁)。那麼,準確地說,我可以 - 如果我的文件是線性化的。但是這是可選的,並且在寫入和讀取這樣的文件時意味着額外的開銷。

而不是整個線性化的事情,只需將參考文獻放在主體的前面(其次是第1頁,第2頁,第3頁上的對象...)就會更容易。但是Adobe的人可能有理由在之後把它放到之後。我只是看不到他們。所以...

爲什麼交叉參考表放在之後?

回答

1

我同意前面提到的兩個原因,但不是因爲硬件限制「回到當天」,而是因爲規模。很容易想到一個發票與幾頁的文字可以做得更好不同,但一本書或一張帶有1000張照片的PDF文件呢?

在最後的預告片中,您可以在處理文件時將圖像/文本/字體寫入文件,然後將其從內存中丟棄,同時只保存用於寫入預告片的每個對象的文件偏移量。

如果預告片必須先出現,那麼您必須閱讀(或者甚至在嵌入字體的情況下生成)所有這些對象才能獲得它們的大小,以便您可以寫出預告片,然後將所有對象到文件。所以你要麼閱讀,確定尺寸,丟棄,然後再閱讀,要麼試圖將所有內容都放在內存中,直到可以將它們寫入文件。

當我們在共享硬件上的VM上的碼頭容器中運行時,寫入速度和內存仍然是我們今天要解決的問題。

1

PDF是在硬盤緩慢寫入文件時發明的......真正的S-l-o-w。通過將xref放在最後,您可以通過簡單地將新對象和更新的外部參照附加到文件的末尾而不是重寫整個文件來快速更改文件。

1

不僅驅動器變慢(引起了@ joelgeraci答案中的爭論),而且在典型的計算機中可用的RAM也少得多。因此,在創建PDF文件時,必須儘早將數據寫入文件,比文件早得多的人知道文件的大小或交叉引用的大小。因此,在最後編寫交叉引用是一個自然的結果。

相關問題