在 PDF/A 3b 中生成 ZUGFeRD 发票时,我在处理 XMP 元数据时遇到问题。首先我必须说,我以前从未接触过XMP元数据,所以这对我来说确实是一个非常新的主题。 我正在使用 iText 包的 8.0.5 版本、带有 C# 的 .NET Framework 4.7.2。 这是我当前为 PDF/A 文档设置 XMP 元数据的代码,但该代码实际上不起作用,因为我总是遇到错误,
iText.Kernel.XMP.XMPException:'架构命名空间 URI 和前缀 不匹配'
例如这行代码:
xmpMeta.SetStructField(extensionNamespace, schemaArrayItemPath, schemaNamespace, "schema", "Factur-X PDF/A Extension Schema");
我已经有一个工作示例,其中代码没有遇到异常,但是当我使用 veraPDF 验证 PDF/A 文档时,它告诉我很多错误,表明 PDF/A 不合规。 是否没有可用于为 ZUGFeRD 发票设置有效 XMP 元数据的示例?我已经搜索了很多,但没有成功。非常感谢任何帮助。 这是我当前的代码:
byte[] xmpBytes = pdfaDoc.GetXmpMetadata();
XMPMeta xmpMeta;
if (xmpBytes != null && xmpBytes.Length > 0)
{
xmpMeta = XMPMetaFactory.ParseFromBuffer(xmpBytes);
}
else
{
xmpMeta = XMPMetaFactory.Create();
}
XMPMetaFactory.GetSchemaRegistry().RegisterNamespace("http://www.aiim.org/pdfa/ns/extension/", "pdfaExtension");
XMPMetaFactory.GetSchemaRegistry().RegisterNamespace("http://www.aiim.org/pdfa/ns/schema#", "pdfaSchema");
XMPMetaFactory.GetSchemaRegistry().RegisterNamespace("http://www.aiim.org/pdfa/ns/property#", "pdfaProperty");
XMPMetaFactory.GetSchemaRegistry().RegisterNamespace("urn:factur-x:pdfa:CrossIndustryDocument:invoice:1p0#", "fx");
PropertyOptions arrayOptions = new PropertyOptions(PropertyOptions.ARRAY | PropertyOptions.ARRAY_ORDERED);
PropertyOptions structOptions = new PropertyOptions(PropertyOptions.STRUCT);
string extensionNamespace = "http://www.aiim.org/pdfa/ns/extension/";
string schemaNamespace = "http://www.aiim.org/pdfa/ns/schema#";
string propertyNamespace = "http://www.aiim.org/pdfa/ns/property#";
string zugferdNamespace = "urn:factur-x:pdfa:CrossIndustryDocument:invoice:1p0#";
xmpMeta.AppendArrayItem(extensionNamespace, "schemas", arrayOptions, null, null);
string schemaArrayItemPath = extensionNamespace + "schemas[1]";
xmpMeta.SetStructField(extensionNamespace, schemaArrayItemPath, schemaNamespace, "schema", "Factur-X PDF/A Extension Schema");
xmpMeta.SetStructField(extensionNamespace, schemaArrayItemPath, schemaNamespace, "namespaceURI", zugferdNamespace);
xmpMeta.SetStructField(extensionNamespace, schemaArrayItemPath, schemaNamespace, "prefix", "fx");
xmpMeta.SetStructField(extensionNamespace, schemaArrayItemPath, schemaNamespace, "property", null, arrayOptions);
string propertyArrayItemPath = schemaArrayItemPath + "/property[1]";
xmpMeta.AppendArrayItem(propertyNamespace, schemaArrayItemPath + "/property", structOptions, null, null);
xmpMeta.SetStructField(propertyNamespace, propertyArrayItemPath, propertyNamespace, "name", "ConformanceLevel");
xmpMeta.SetStructField(propertyNamespace, propertyArrayItemPath, propertyNamespace, "valueType", "Text");
xmpMeta.SetStructField(propertyNamespace, propertyArrayItemPath, propertyNamespace, "category", "external");
xmpMeta.SetStructField(propertyNamespace, propertyArrayItemPath, propertyNamespace, "description", "Conformance level of the invoice.");
xmpMeta.AppendArrayItem(propertyNamespace, schemaArrayItemPath + "/property", structOptions, null, null);
string secondPropertyPath = schemaArrayItemPath + "/property[2]";
xmpMeta.SetStructField(propertyNamespace, secondPropertyPath, propertyNamespace, "name", "DocumentType");
xmpMeta.SetStructField(propertyNamespace, secondPropertyPath, propertyNamespace, "valueType", "Text");
xmpMeta.SetStructField(propertyNamespace, secondPropertyPath, propertyNamespace, "category", "external");
xmpMeta.SetStructField(propertyNamespace, secondPropertyPath, propertyNamespace, "description", "Type of the document.");
免责声明:我是 Apryse 员工。我们最近发布了一篇关于使用 iText 创建 ZUGFeRD 发票的文章,可能对您有所帮助。本文中包含指向本文中使用的 Java 代码的C# 版本的链接。此示例针对 BASIC 配置文件,但可以轻松适应当前 (2.3) ZUGFeRD 规范中的其他配置文件。
关于您的代码,XMP 异常可能是由于命名空间未正确注册所致。至于 PDF/A 一致性错误,PDF/A 一致性需要它自己的 XMP 元数据,所以可能是您没有正确包含它?
如果您仍然遇到问题,请使用完整的代码和示例 PDF 更新问题,以便我们进一步调查。