iText7向PDF/A嵌入带F与UF键的ZUGFeRD XML文件遇合规异常
解决PDF/A-3b嵌入ZUGFeRD XML时的合规性异常
问题根源
你创建了包含F和UF键的PdfDictionary,但未将其关联到生成的PdfFileSpec对象上,导致实际写入PDF的文件规范字典缺少这两个PDF/A-3强制要求的键,从而触发PdfAConformanceException。此外,F和UF对应的应该是纯文件名(而非完整文件路径),这才符合PDF规范要求。
修改后的代码方案
方案1:通过CreateEmbeddedFileSpec重载传入自定义字典
static void EmbedFile(PdfADocument pdfDoc, string filePath) { byte[] fileContent = File.ReadAllBytes(filePath); string fileName = Path.GetFileName(filePath); // 提取纯文件名 // 创建包含F和UF键的文件规范字典 PdfDictionary fileSpecDict = new PdfDictionary(); fileSpecDict.Put(PdfName.F, new PdfString(fileName)); fileSpecDict.Put(PdfName.UF, new PdfString(fileName, PdfEncodings.UNICODE_BIG)); // 使用带字典参数的重载创建文件规范 PdfFileSpec fileSpec = PdfFileSpec.CreateEmbeddedFileSpec( pdfDoc, fileContent, "ZUGFeRD XML File", null, PdfName.Alternative, fileSpecDict ); pdfDoc.AddFileAttachment(fileName, fileSpec); }
方案2:直接修改PdfFileSpec的底层字典
static void EmbedFile(PdfADocument pdfDoc, string filePath) { byte[] fileContent = File.ReadAllBytes(filePath); string fileName = Path.GetFileName(filePath); // 创建基础文件规范 PdfFileSpec fileSpec = PdfFileSpec.CreateEmbeddedFileSpec( pdfDoc, fileContent, "ZUGFeRD XML File", PdfName.Alternative ); // 获取文件规范的底层字典,添加F和UF键 PdfDictionary fileSpecDict = fileSpec.GetPdfObject(); fileSpecDict.Put(PdfName.F, new PdfString(fileName)); fileSpecDict.Put(PdfName.UF, new PdfString(fileName, PdfEncodings.UNICODE_BIG)); pdfDoc.AddFileAttachment(fileName, fileSpec); }
补充说明
PDF/A-3标准明确要求,嵌入式文件的文件规范字典必须同时包含:
F:使用PDFDocEncoding编码的文件名UF:使用UTF-16BE编码的Unicode文件名
确保这两个键存在且对应正确的文件名,即可通过合规性检查成功嵌入ZUGFeRD XML文件。
内容的提问来源于stack exchange,提问作者etmcm
相关产品推荐
相关产品推荐

