2013-10-01 51 views
0

我一直在嘗試在PDF中嵌入所有丟失的字體,以避免在因字體替換而打印或渲染時出現「驚喜」。pdf嵌入字體被pdftops忽略

所以我用BergamoStd字體創建了一個包含「Bergamo Std」文本的文檔。 之後,使用PDF Creator生成沒有嵌入字體的pdf:BergamoStd.pdf

使用C#/ iText我將字體嵌入到pdf中。 (BergamoStd-embedded.pdf) 我可以正確渲染嵌入式pdf,不管字體是否存在於系統中。 Adob​​e閱讀器,qpdfview,evince渲染pdf沒有問題,acrobat閱讀器告訴字體嵌入以及pdffonts。

qpdf沒有報告這個pdf有什麼不好。

如果我使用ghostscript(9.07)從嵌入式pdf生成ps文件,我得到一個可以渲染和打印的ps,並且該字體也嵌入在該ps文件中。 pdf2ps當然會獲得與ghostscript相同的資源。 即使xpdf在Windows中也會生成一個有效的ps文件,並且嵌入字體。

但如果我使用poppler-utils(v0.24)中的pdftops來生成ps文件,我會得到一個沒有嵌入字體的小ps文件。

更進一步;即使系統中存在bergamoStd.ttf文件,pdftops也無法在.ps中嵌入字體,無論輸入pdf是否嵌入字體。

任何人都可以解釋爲什麼pdftops不能嵌入這種字體? 我錯過了什麼?

我的測試文件可用here如果您不想按照之前描述的步驟生成自己的文件。

TIA。

+0

你究竟事後嵌入使用iTextSharp的字體? – mkl

+0

我跟着你提到的相同的itext示例(使用itextSharp),因爲字體不是TrueType,而是使用PdfName.FONTFILE3。所以我需要指定所需的子類型,因爲我遵循[this iText post](http://itext-general.2136553.n4.nabble.com/OTF-and-PFM-fonts-not-embedding-in-existing- PDF-td2167028.html)。通過這種方式,pdf足夠接近正確性,許多工具報告沒有什麼不好,但是pdftops可以,而@VadimR解釋了原因。 – Nomada

回答

1

存在文件問題Bergamo Std-embeded.pdf。嵌入字體在字體字典的FontDescriptor> FontFile3>子類型條目中標記爲「Type1C」(Type1 Compact或CFF)。並且它通過例如pdffonts(poppler-utils)或mutool(MuPDF)。但實際上,它原來的OpenType格式沒有改變。您可以使用例如PDF從PDF中提取它。 mutool,並與BergamoStd-Regular.otf進行比較 - 相同的文件。如果C#/ iText應該完成這些工作(或者你,如果它是開發人員對這個庫的責任),要麼將嵌入的FontFile的子類型顯式地標記爲OpenType(PDF 1.6功能),要麼將BergamoStd-Regular.otf轉換爲pfb(或進一步cff,也許 - 如果一切都是手動控制)嵌入之前。

我在你貝加莫STD-embeded.pdf(使用Enfocus的PDF瀏覽器,但PoDoFo或PDFEdit應該做的工作,太),然後pdftops創建正確的(即字體改爲「Type1C」字符串「OpenType字體」嵌入式)postscript從固定pdf。我認爲(但沒有檢查)將otf文件轉換爲cff並將其嵌入到原處也將修復原始pdf。

看起來你提到的所有實用程序都非常容許有關輕微的PDF語法違規,但pdftops不是。

+0

實際上,iTextSharp並沒有將事後嵌入字體(即現有文檔中的現有非嵌入字體)作爲其高級API的一部分;它有一個公開的低級API,但它可以用於幾乎任何類型的操作,而且確實有一個[示例](http://itextpdf.com/examples/iia.php?id=288)如何使用這個低級別的API來完成這種事後字體嵌入。使用低級API當然要求你知道你在做什麼,並允許你以多種方式拍攝自己的腳......;)我假設@Nomada在這裏使用了C#掛件。 – mkl

+0

@VadimR,只是一個鬆散的結局。我已經生成了一個1.6版的PDF格式的貝加莫Stf.pdf克隆(無嵌入字體),以防萬一pdftops忽略1.4文件的1.6功能。 Bergamo.otf安裝在我的系統上,但在這種情況下,pdftops沒有嵌入字體。它可以完美地將它與您的解決方案結合在一起,以便它可以處理字體... – Nomada

+1

這可能與此實用程序無關 - 這是另一個問題。上面的解決方案(解釋)是關於嵌入字體,當FontFile子類型錯誤時(儘管**不是pdftops的問題,而是PDF文件的創建者)。現在,如果字體沒有嵌入,pdftops會在系統字體中查找它們,但並不總是成功。看起來它失敗了,如果字體是Type1,或者是帶有postscript輪廓的OTF(作爲你的字體) - 我檢查過的任何字體都是這樣,而不是BergamoStd-Regular.otf。但是,如果字體是TTF或OTF「具有真實類型輪廓」,則它被成功找到並嵌入到PS中。 – user2846289