0

在 Adob​​e 的 PDF/A 的 ISO 32000 规范中,它声明 XFA 数据可以存储在 PDF/A-2 确认 PDF 中的特殊位置。这是该部分的文本。

将 XFA 数据集合并到符合 PDF/A-2 的文件中 为了支持符合 PDF/A-2 的文件,ExtensionLevel 3 通过 XFAResources 名称树添加了对 XML 表单数据(XFA 数据集)的支持,它是文档目录。

(请参阅第 23 页上的“名称字典中的表 3.28 条目”。)虽然在符合 PDF/A-2 的文件中允许使用 Acrobat 表单(和表单数据),但不允许使用 XML 表单。此类 XML 表单被指定为从交互式表单字典引用的 XDP 流。XDP 流可以包含 XFA 数据集。

对于将 PDF 文档转换为 PDF/A-2 的应用程序,XFAResources 名称树支持将 XML 表单数据从 PDF 文档中的 XDP 流重新定位到XFAResources名称树中。

XFAResources名称树由字符串名称和对流的间接引用组成字符串名称是在文档转换为符合 PDF/A-2 的文件时创建的。流包含 XFA 的元素,由元素组成。

除了 XML 表单字段的数据值之外,这些元素还支持存储和检索可能对其他工作流有用的其他类型的信息,包括未绑定到表单字段的数据以及一个或多个 XML 签名。

请参阅参考书目中的 XML 架构、XML 表单架构 (XFA) 规范 2.6 版

我们有一个将 xml 传递给的 XFA 表单,现在需要将该文档转换为 PDF/A-2。

我们目前正在测试 XFA Worker,看看它是否允许我们这样做,我一直无法找到可以为我们执行此操作的 XFA Worker 样本。

我首先尝试使用 XFA Worker 进行扁平化,但这会完全删除数据并且不再能够被提取。

您如何将 XFA xml 数据放入 Adob​​e 说要使用 XFA Worker 放入的位置?

更新:感谢布鲁诺,我的代码不允许我将 XFA 表单转换为 PDF/A-2。这是我使用的代码。

    xfa.fillXfaForm(new ByteArrayInputStream(xmlSchemaStream.toByteArray()));

    stamper.close();
    reader.close();

    try (ByteArrayOutputStream outputStreamDest = new ByteArrayOutputStream()) {
        PdfReader pdfAReader = new PdfReader(output.toByteArray());

        PdfAStamper pdfAStamper = new PdfAStamper(pdfAReader, outputStreamDest, PdfAConformanceLevel.PDF_A_2A);
....

我收到错误 com.itextpdf.text.pdf.PdfAConformanceException: Only PDF/A 文档可以在 PdfAStamper 中打开。

所以我现在假设新的 PdfAStamper 不是转换器,而只是读取 XFA PDF 的字节数组。

4

1 回答 1

0

请允许我从一些父亲般的建议开始。XFA 将在 ISO-32000-2 (PDF 2.0) 中弃用,很高兴您将 XFA 文档转换为 PDF/A 文档。但是,您为什么会选择 PDF/A-2?PDF/A-3PDF/A-2 相同,但有一个例外:在 PDF/A-3 中,您可以嵌入 XML 文件。您甚至可以指出附加的 XML 和 PDF 之间的关系。创建 PDF/A-3 文件并将原始数据(不是 XFA 文件)作为附件附加不是更聪明吗?

假设你不理会这个父亲般的建议,你能做什么?

ISO-19005-2(和-3)的附录 D 告诉您必须在文档目录的名称字典中添加一个条目。不幸的是,iText 5 不允许您在创建文件时将自己的条目添加到此名称字典中,因此您必须对文档进行后处理。

假设您有一个文件位于filePath,那么您可以像这样获取Catalog条目和Names条目的Catalog条目:

PdfReader reader = new PdfReader(filePath);
PdfDictionary catalog = reader.getCatalog();
PdfDictionary names = catalog.getAsDict(PdfName.NAMES);

您可以将条目添加到此names词典。例如:假设我想添加一个包含内容的流some bytes作为自定义条目,我将使用以下代码:

public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
    PdfReader reader = new PdfReader(src);
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
    PdfDictionary catalog = reader.getCatalog();
    PdfDictionary names = catalog.getAsDict(PdfName.NAMES);
    if (names == null) {
        names = new PdfDictionary();
    }
    PdfStream stream = new PdfStream("Some bytes".getBytes());
    PdfIndirectObject objref = stamper.getWriter().addToBody(stream);
    names.put(new PdfName("ITXT_Custom"), objref.getIndirectReference());
    catalog.put(PdfName.NAMES, names);
    stamper.close();
    reader.close();
}

结果将如下所示:

在此处输入图像描述

在您的情况下,您不想输入 named ITXT_Custom。您想添加一个名为的条目XFAResources,该条目的值应该是一个名称树,由字符串名称和对流的间接引用组成。调整我的示例来实现这一点应该相当容易。

注意:我在 Stack Overflow 上提供的所有代码都可以在Stack Exchange Network 服务条款中定义的CC-BY-SA下使用。如果您不喜欢 CC-BY-SA,我还会根据用于 iText 的相同许可提供此代码,更具体地说是AGPL

于 2016-11-04T06:55:43.763 回答