PdfBox:PDF / A-1A至PDF / A-3A

时间:2015-07-03 15:17:04

标签: validation pdf pdf-generation pdfbox pdfa

我有以下问题: 我想将PDF / A-1A文档转换为PDF / A-3A。 原始文档由Arobat Reader Pro验证,因此我可以认为它符合PDF / A-1A。

我尝试使用以下代码转换PDF元数据:

-(void)viewWillAppear:(BOOL)animated
{
   [super viewWillAppear:animated];
   self.datePicker.minimumDate = [NSDate dateWithTimeIntervalSinceNow:60];
}

}

如果我再次尝试使用Acrobat验证新文件,则会收到验证错误:

  

子集字体中的CIDset不完整(字体包含未列出的字形)

如果我尝试使用此在线验证器(http://www.pdf-tools.com/pdf/validate-pdfa-online.aspx)验证文件,则它是有效的PDF / A-3A ....

我错过了什么吗?

没人能帮忙吗?

编辑:这是PDF file

2 个答案:

答案 0 :(得分:3)

好的 - 我认为我从卡拉斯和/或Adobe技术的角度对你的问题有了答案(再一次,我加入了callas及其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有效),但是对于A-1a,该CID设置正常,包含所有字符都符合A-3a标准。

为了测试这个理论的至少一部分,我通过pdfToolbox处理了你的文件,其中包含一个标题为“如果不完整则删除CIDset”的修正。该更正(顾名思义)从文件中删除CID集,但不会更改任何其他内容。执行此操作后,您的文件将验证为有效的A-3a文件。

这就留下了一个问题,为什么pdftools网站声称这是一个有效的PDF / A-3a文件;根据我所说过的人,这个文件的预检结果是正确的,这个文件应该有错误。所以也许这就是你需要接受pdftools的人(他们可能用卡拉斯来弄清楚谁最终是对的)。

如果您想进一步讨论,请随时向我发送个人信息 - 有关工具本身的更多讨论可能会成为该公共网站的主题。

答案 1 :(得分:2)

这有助于我们完全符合CIDset问题的PDF / A-3标准:

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);
            }
          }
        }
      }
    }
  }
}