2015-07-03 22 views
1

我有以下問題: 我想將PDF/A-1A文檔轉換爲PDF/A-3A。 原始文件由Arobat Reader Pro驗證,所以我可以推測它是符合PDF/A-1A的。PdfBox:PDF/A-1A到PDF/A-3A

我嘗試將PDF元數據轉換與下面的代碼:

private PDDocumentCatalog makeA3compliant(PDDocument doc) throws IOException, TransformerException { 
PDDocumentCatalog cat = doc.getDocumentCatalog(); 
PDMetadata metadata = new PDMetadata(doc); 
cat.setMetadata(metadata); 

XMPMetadata xmp = new XMPMetadata(); 
XMPSchemaPDFAId pdfaid = new XMPSchemaPDFAId(xmp); 
xmp.addSchema(pdfaid); 

XMPSchemaDublinCore dc = xmp.addDublinCoreSchema(); 
String creator = "TestCr"; 
String producer = "testPr"; 
dc.addCreator(creator); 
dc.setAbout(""); 

XMPSchemaBasic xsb = xmp.addBasicSchema(); 
xsb.setAbout(""); 
xsb.setCreatorTool(creator); 
xsb.setCreateDate(GregorianCalendar.getInstance()); 

PDDocumentInformation pdi = new PDDocumentInformation(); 
pdi.setProducer(producer); 
pdi.setAuthor(creator); 
doc.setDocumentInformation(pdi); 

XMPSchemaPDF pdf = xmp.addPDFSchema(); 
pdf.setProducer(producer); 
pdf.setAbout(""); 

PDMarkInfo markinfo = new PDMarkInfo(); 
markinfo.setMarked(true); 
doc.getDocumentCatalog().setMarkInfo(markinfo); 

pdfaid.setPart(3); 
pdfaid.setConformance("A"); 
pdfaid.setAbout(""); 

metadata.importXMPMetadata(xmp); 

return cat; 

}

如果我嘗試再次驗證與Acrobat新的文件,我得到驗證錯誤:

CIDset in subset font is incomplete (font contains glyphs that are not listed)

如果我嘗試使用此在線驗證程序驗證文件(http://www.pdf-tools.com/pdf/validate-pdfa-online.aspx)它是有效的PDF/A-3A ....

我錯過了什麼?

沒人能幫忙嗎?

編輯:這裏是PDF file

+2

你錯過的PDF文件。 –

+3

如果我們沒有PDF文件來檢查,就不可能多說你的問題... –

+0

我添加了一個PDF文件的鏈接 – Paundl

回答

2

這個工作對我們是完全PDF/A-3關於CIDset問題兼容:

private void removeCidSet(PDDocumentCatalog catalog) { 

    COSName cidSet = COSName.getPDFName("CIDSet"); 

    // iterate over all pdf pages 
    for (Object object : catalog.getAllPages()) { 
    if (object instanceof PDPage) { 

     PDPage page = (PDPage) object; 
     Map<String, PDFont> fonts = page.getResources().getFonts(); 
     Iterator<String> iterator = fonts.keySet().iterator(); 

     // iterate over all fonts 
     while (iterator.hasNext()) { 
     PDFont pdFont = fonts.get(iterator.next()); 

     if (pdFont instanceof PDType0Font) { 
      PDType0Font typedFont = (PDType0Font) pdFont; 

      if (typedFont.getDescendantFont() instanceof PDCIDFontType2Font) { 
      PDCIDFontType2Font f = (PDCIDFontType2Font) typedFont.getDescendantFont(); 
      PDFontDescriptor fontDescriptor = f.getFontDescriptor(); 

      if (fontDescriptor instanceof PDFontDescriptorDictionary) { 
       PDFontDescriptorDictionary fontDict = (PDFontDescriptorDictionary) fontDescriptor; 
       fontDict.getCOSDictionary().removeItem(cidSet); 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+0

已經檢查出來,工作完全正常:) thx很多! – Paundl

3

行 - 我想我有從卡拉斯和/或Adobe技術的角度來看你的問題的答案(和一次,我參加與卡拉斯及其pdfToolbox技術也在Acrobat中使用)

根據我的研究和我諮詢的人,您的示例PDF文檔包含CID字符集不完整的字體。爲什麼pdfToolbox或Acrobat會說它是一個有效的PDF/A-1a文件,但不是有效的PDF/A-3a文件?有趣的問題:

1)在PDF/A-1a和PDF/A-3a之間,不完整CID集合的規則更改爲。在PDF/A-3a中它們是嚴格的

2)但是,在PDF/A-1a中,一個CID集總是必須在那裏,在PDF/A-3a中,您可以擁有一個有效的兼容文件,而不需要這樣的CID集。因此,您的PDF文件包含一個CID集合(這使其對PDF/A-1a和A-3a有效),但是當該CID集合適用於A-1a時,它不包含包含要生成的所有字符符合A-3a。

爲了測試這個理論的至少一部分,我通過一個名爲「Remove CIDset if incomplete」的修復程序通過pdfToolbox處理文件。該更正(顧名思義)將從文件中刪除CID集,但不會更改任何其他內容。完成後,您的文件將被驗證爲有效的A-3a文件。

這留下了爲什麼pdftools網站聲稱這是一個有效的PDF/A-3a文件的問題;根據我所說的人,這個文件的預檢結果是正確的,這個文件應該有錯誤。所以也許這就是你需要用pdftools傢伙來解決的問題(他們可能會用卡拉斯來弄清楚誰最終是正確的)。

如果您想進一步討論這個問題,請隨時給我發送個人信息 - 關於這些工具本身的更多討論可能會成爲這個公共站點的焦點話題。

+0

感謝您的回覆!這非常有幫助! 我的問題是,我想生成一個有效的PDF/A-3A。 就像你說的那樣,解決步驟是去除不完整的CIDset。 我試圖用PDFBox,直到現在沒有成功,我會寫,如果我找到一個解決方案。 – Paundl