【发布时间】:2019-06-27 12:50:45
【问题描述】:
Preflight(2.0.15 版)工具已正确验证生成的 pdf(使用 pdfbox 2.0.15 版创建)文件,但在线 pdf-tools(例如https://www.pdf-online.com/osa/validate.aspx)无法正确验证它。我收到以下错误:
符合 pdfa-1b 结果文档不符合 PDF/A。 细节 验证文件“file.pdf”的一致性级别 pdfa-1b
XMP 元数据中不允许使用匿名 RDF 资源(rdf:Description without rdf:about 属性)。
外观字典不包含条目。
外观字典不包含条目。
外观字典不包含条目。
外观字典不包含条目。
外观字典不包含条目。
文档不符合要求的标准。
该文档包含具有模棱两可或没有适当外观的注释或表单域。
文档的元数据丢失、不一致或损坏。 该文档不符合 PDF/A-1b 标准。
完成。
为了生成元数据,我使用以下代码:
private void addMetadata(PDDocument pdDocument,final String zzz,final String yyy) {
PDDocumentCatalog catalog = pdDocument.getDocumentCatalog();
PDDocumentInformation info = pdDocument.getDocumentInformation();
info.setCreationDate(Calendar.getInstance());
info.setModificationDate(Calendar.getInstance());
info.setAuthor(metadataAuthor);
info.setProducer(metadataProducer);
info.setTitle(zzz + "_" + yyy);
info.setKeywords("aaa");
info.setCreator("aaa");
info.setSubject("aaa");
PDMarkInfo markInfo = new PDMarkInfo();
markInfo.setMarked(true);
catalog.setMarkInfo(markInfo);
try {
PDMetadata metadataStream = new PDMetadata(pdDocument);
catalog.setMetadata( metadataStream );
XMPMetadata xmp = new XMPMetadata();
XMPSchemaPDFAId pdfaid = new XMPSchemaPDFAId(xmp);
xmp.addSchema(pdfaid);
pdfaid.setConformance("B");
pdfaid.setPart(1);
pdfaid.setAbout("");
XMPSchemaDublinCore dcSchema = xmp.addDublinCoreSchema();
dcSchema.setTitle( info.getTitle() );
dcSchema.addCreator("aaa");
dcSchema.setDescription( info.getSubject() );
XMPSchemaPDF pdfSchema = xmp.addPDFSchema();
pdfSchema.setKeywords( info.getKeywords() );
pdfSchema.setProducer( info.getProducer() );
XMPSchemaBasic basicSchema = xmp.addBasicSchema();
basicSchema.setModifyDate( info.getModificationDate() );
basicSchema.setCreateDate( info.getCreationDate() );
basicSchema.setCreatorTool( info.getCreator() );
metadataStream.importXMPMetadata(xmp.asByteArray());
InputStream colorProfile = getClass().getClassLoader().getResourceAsStream("icm/sRGB Color Space Profile.icm");
// create output intent
PDOutputIntent oi = new PDOutputIntent(pdDocument, colorProfile);
String value = "sRGB IEC61966-2.1";
oi.setInfo(value);
oi.setOutputCondition(value);
oi.setOutputConditionIdentifier(value);
oi.setRegistryName("http://www.color.org");
catalog.addOutputIntent(oi);
} catch (Exception e) {
e.printStackTrace()
}
}
有什么建议吗?
【问题讨论】:
-
现在我们真的需要 PDF。因为如果 PDFBox 验证并且 PDF-Tools 没有验证,那么它可能是 PDFBox 中的一个错误 :-( 我们还需要用于生成 PDF 的代码。
-
这是 PDFBox 预检中的一个错误,我会尽快修复它。 pdfa.org/wp-content/uploads/2017/07/TechNote0010.pdf “ISO 19005-1 验证器将失败,否则在其中小部件注释缺少外观字典的符合文件。”所以你应该注意每个字段都有一个值,因此是一个外观流。试试看,然后再检查一次。 VeraPDF 不会抱怨元数据。我可以在那里创建一个问题,但我希望你的文件修复其他问题。
-
缺少的“关于”在某种程度上与您对都柏林核心模式的使用有关。请出示代码。如果您使用
metadata.createAndAddDublinCoreSchema()就不会发生这种情况,因为它设置了“关于”的东西。 -
Re xmp:
xmp.addDublinCoreSchema()是 PDFBox 1.8。您可以尝试拨打dcSchema.setAbout("");。重新字段:尝试为每个字段调用 setValue(something) 。这设置了外观流,至少在 2.0.16 中。不确定 1.8。