2016-10-03 83 views
0

我想將PDF轉換爲PDFA-2B。而1 of my test files包含Type1字體沒有字體描述:如何嵌入沒有字體描述符的字體?

enter image description here

我需要嵌入這些字體。

我該如何嵌入這些字體?

我試圖創建一個字體描述符,但我沒有成功。

private static PdfDictionary addFontDesc(PdfDictionary font){ 
     PdfDictionary fontDescriptor; 
     fontDescriptor = new PdfDictionary(PdfName.FONTDESCRIPTOR); 
     PRIndirectReference fd = fontDescriptor.getIndRef(); 

     if (fd != null){ 
      font.put(PdfName.FONTDESCRIPTOR, fd); 
      System.out.println("fontDescriptor was added to font " + font.getAsName(PdfName.BASEFONT).toString()); 
     }else { 
      System.out.println("Error while trying to add fontDescriptor to " + font.getAsName(PdfName.BASEFONT).toString()); 
     } 
     return font; 
} 

我總是得到一個NullPointerException

+1

正如解釋@mkl在他的評論[iTextSharp嵌入子集字體在現有的PDF](http://stackoverflow.com/questions/3974 7620/itextsharp-embed-subset-fonts-in-existing-pdf),你正在問一些Stack Overflow帖子中無法回答的問題。你需要聘請專家來實現你想要的。我投票結束這個問題,因爲**太寬泛**。您需要提供字體程序,您需要檢查內容流,選擇正確的編碼等等。向我們展示您的開發過程中的進展,我們可以提供幫助。問我們「爲我做這件事」,我們會結束你的問題。 –

+2

基本字體不需要嵌入,PDF查看器應該提供它們或其適當的替代品。 參見PDF規範標準Type 1字體(標準14字體)的第9.6.2.2節。類型1字體,被稱爲標準14字體,如下所示:Times-Roman,Helvetica,Courier,Symbol,Times-Bold,Helvetica-Bold,Courier-Bold,ZapfDingbats,Times-Italic,Helvetica-Oblique,Courier -Oblique,Times-BoldItalic,Helvetica-BoldOblique,Courier-BoldOblique 這些字體或其字體指標和合適的替代字體應可用於符合標準的讀者。 – joelgeraci

+0

@JoelGeraci就PDF標準而言,不需要嵌入標準的14種字體。事實上,就標準而言,不需要嵌入任何字體(Type 3字體是特殊的,因爲沒有*嵌入*的字體程序)。但是OP要生成PDF/A文件,這裏的規則是:「用於在符合文件中渲染的所有字體的字體程序應該嵌入該文件的 內。」 – mkl

回答

0

正如@布魯諾在評論中已經說過,你現在的狀態問題太廣泛了。因此,這個答案僅僅關注你提出的有形問題部分:

總是得到一個NullPointerException。

你似乎假設getIndRef

PRIndirectReference fd = fontDescriptor.getIndRef(); 

使得fontDescriptor間接賓語(因爲只有間接的對象可以有間接引用),如果它不是已經是一個。

這個假設是錯誤的。如果您對尚未間接訪問的對象調用getIndRef,則您會看到null


你可以做任何PdfObject使用PdfWriter方法addToBody它返回一個PdfIndirectObject,您可以查詢使用getIndirectReference其間接引用間接,

public PdfIndirectObject addToBody(final PdfObject object) throws IOException 

public PdfIndirectObject addToBody(final PdfObject object, final boolean inObjStm) throws IOException