我有以下问题: 我想将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
答案 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);
}
}
}
}
}
}
}