簡體   English   中英

使用itext 7重新嵌入pdf中的子集字體

[英]re-embed subset font in pdf with itext 7

我有一些輸入PDF都帶有全套字體,我想“縮小”它們所有創建字體的子集。 我知道有解嵌字體嵌入子集字體的方法 ,但是問題是我沒有字體的源文件。 我只是在源PDF中嵌入了字體。

有人可以幫助我解決此問題嗎?

ENV:java8,itext7.1.5

這是一個類似問題的話題(盡管有OP的問題,但關於嵌入而不是子集): 如何將字體子集到現有的PDF文件中 以下聲明是相關的:

如果要對其進行子集化,則需要解析PDF中的所有內容流,以找出使用了哪些字形。 這不是一件容易的事。

除非確實必要,否則我建議您不要在iText中嘗試此操作。 除非您對PDF規范有非常全面的了解,否則它可能最終會成為越野車。 可能有必要尋求其他途徑,例如更改PDF的創建方式,或使用Distiller之類的工具為您完成此任務。

如果您確實想在iText中執行此操作,恐怕您可能必須使用PdfCanvasProcessor和一些自定義運算符處理程序。 您將需要找到所有文本字段,確定它們使用的字體,使用適用的字形構建新的子集字體,並用新的子集副本替換字體。 這是您創建完整字體的副本以准備子集的方法(假設您沒有字體文件的副本):

String encoding = PdfEncodings.WINANSI; // or another encoding if needed for more glyph support
PdfFont completeFont = ...; // get complete font from font dictionary
PdfFont subsetFont = PdfFontFactory.createFont(completeFont.getFontProgram(), encoding, true);
subsetFont.setSubset(true);

當您遇到字體更改運算符( Tf )時,您需要在字體字典中查找該字體並創建該字體的新(或查找已創建的)子集副本,以為即將到來的文本字段做准備。 別忘了將字體保留在堆棧中,這樣您就可以彈出回到先前的字體(查找q和Q運算符)。 並且,如果當前的XObject或頁面資源字典中不存在字體,請不要忘記檢查父表單和頁面組中的字體。

當遇到文本( TjTJ'"運算符)時,您需要使用完整的字體對文本進行解碼,然后將其重新編碼為新的子集字體的編碼(除非您確定所有源字體是ASCII兼容的)。將該文本的字符添加到子集中,如下所示:

subsetFont.addSubsetRange(new int[]{character});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM