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

Validation PdfBox:PDF/A-1A至PDF/A-3A,validation,pdf,pdf-generation,pdfbox,pdfa,Validation,Pdf,Pdf Generation,Pdfbox,Pdfa,我有以下问题: 我想将PDF/a-1A文档转换为PDF/a-3A。 原始文档由Arobat Reader Pro验证,因此我可以确定它符合PDF/A-1A标准 我尝试使用以下代码转换PDF元数据: private PDDocumentCatalog makeA3compliant(PDDocument doc) throws IOException, TransformerException { PDDocumentCatalog cat = doc.getDocumentCatalog();

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

我尝试使用以下代码转换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不完整字体包含未列出的图示符

如果我尝试用这个在线验证器验证文件,它是一个有效的PDF/a-3A

我错过什么了吗

没有人能帮忙吗


编辑:这里是

好的-我想我已经从callas和/或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有效,但尽管该CID集对a-1a没有问题,但它并不包含符合a-3a的所有字符

为了测试这一理论的至少一部分,我通过pdfToolbox处理了您的文件,并使用了一个名为Remove CIDset if complete的修复程序。顾名思义,该更正将从文件中删除CID集,但不会更改任何其他内容。执行此操作后,您的文件将验证为有效的a-3a文件

这就留下了一个问题,为什么pdftools网站声称这是一个有效的PDF/a-3a文件;据我与之交谈的人说,飞行前的结果是正确的,这个文件上应该有一个错误。所以,也许这是你需要和pdftools的家伙们以及他们可能和callas一起讨论的事情,以找出谁最终是对的


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

好的-我想我已经从callas和/或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有效,但尽管该CID集对a-1a没有问题,但它并不包含符合a-3a的所有字符

为了测试这一理论的至少一部分,我通过pdfToolbox处理了您的文件,并使用了一个名为Remove CIDset if complete的修复程序。顾名思义,该更正将从文件中删除CID集,但不会更改任何其他内容。执行此操作后,您的文件将验证为有效的a-3a文件

这就留下了一个问题,为什么pdftools网站声称这是一个有效的PDF/a-3a文件;据我与之交谈的人说,飞行前的结果是正确的,这个文件上应该有一个错误。所以,也许这是你需要和pdftools的家伙们以及他们可能和callas一起讨论的事情,以找出谁最终是对的


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

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

私有void removeCidSetPDDocumentCatalog目录{ COSName cidSet=COSName.getPDFNameCIDSet; //迭代所有pdf页面 对于对象对象:catalog.getAllPages{ 如果对象实例为PDPage{ PDPage=PDPage对象; 映射字体=page.getResources.getFonts; 迭代器迭代器=fonts.keySet.Iterator; //迭代所有字体 而iterator.hasNext{ PDFont PDFont=fonts.getiterator.next; 如果pdFont实例为PDType0Font{ PDType0Font typedFont=PDType0Font pdFont; 如果为PcIDFontType2Font的typedFont.GetDegenantFont实例{ PDCIDFontType2Font f=PDCIDFontType2Font typedFont.getDescendantFont; PDFontDescriptor fontDescriptor=f.getF 描述词; 如果是PDFontDescriptorDictionary的fontDescriptor实例{ PDFontDescriptorDictionary fontDict=PDFontDescriptorDictionary fontDescriptor; fontDict.getCOSDictionary.removeItemcidSet; } } } } } } }
这使我们在CIDset问题上完全符合PDF/A-3:

私有void removeCidSetPDDocumentCatalog目录{ COSName cidSet=COSName.getPDFNameCIDSet; //迭代所有pdf页面 对于对象对象:catalog.getAllPages{ 如果对象实例为PDPage{ PDPage=PDPage对象; 映射字体=page.getResources.getFonts; 迭代器迭代器=fonts.keySet.Iterator; //迭代所有字体 而iterator.hasNext{ PDFont PDFont=fonts.getiterator.next; 如果pdFont实例为PDType0Font{ PDType0Font typedFont=PDType0Font pdFont; 如果为PcIDFontType2Font的typedFont.GetDegenantFont实例{ PDCIDFontType2Font f=PDCIDFontType2Font typedFont.getDescendantFont; PDFontDescriptor fontDescriptor=f.getFontDescriptor; 如果是PDFontDescriptorDictionary的fontDescriptor实例{ PDFontDescriptorDictionary fontDict=PDFontDescriptorDictionary fontDescriptor; fontDict.getCOSDictionary.removeItemcidSet; } } } } } } }
你丢失了PDF文件。如果我们没有PDF文件进行检查,就不可能对你的问题说太多…我添加了一个指向PDF的链接file@TilmanHausherr谢谢你的评论,几天前我添加了生成的pdf,我用callas pdfToolbox查看了你的文件,我与这个工具有关联;这与Acrobat中集成的技术相同。您是对的,PDF/A-1a没有,PDF/A-3a确实给出了一个错误。问题是由字体引起的,两个配置文件之间确实存在差异,这可以解释差异。事实上,我将向callas报告这一情况,看看这是否是软件中的一个缺陷,或者这两种标准之间是否存在可以解释这一点的实际差异。您缺少PDF文件。如果我们没有PDF文件进行检查,就不可能对您的问题说太多……我添加了一个指向PDF的链接file@TilmanHausherr谢谢你的评论,几天前我添加了生成的pdf,我用callas pdfToolbox查看了你的文件,我与这个工具有关联;这与Acrobat中集成的技术相同。您是对的,PDF/A-1a没有,PDF/A-3a确实给出了一个错误。问题是由字体引起的,两个配置文件之间确实存在差异,这可以解释差异。我将向callas报告这一点,看看这是否是软件中的一个缺陷,或者这两种标准之间是否存在实际差异,可以解释这一点。感谢您的回复!这很有帮助!我的问题是,我想生成一个有效的PDF/a-3A。正如您所说,解决步骤是删除不完整的CIDSet。我正试图用PDFBox解决这个问题,但到目前为止还没有成功,如果我找到解决方案,我会写信的。谢谢你的回复!这很有帮助!我的问题是,我想生成一个有效的PDF/a-3A。正如您所说,解决步骤是删除不完整的CIDSet。我正试图用PDFBox解决这个问题,但到目前为止还没有成功,如果我找到了解决方案,我会写。