首页 文章

如何使用iText / XFA Worker将XFA xml数据转换为符合PDF / A-2的文件

提问于
浏览
0

在Adobe的ISO / 32000规范PDF / A中,它声明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版

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

我们目前正在测试XFA Worker,看看是否允许我们这样做,我一直无法找到将为我们这样做的XFA Worker样本 .

我首先尝试使用XFA Worker进行压缩,但是完全删除了数据并且无法再提取数据 .

如何将XFA xml数据放入Adobe所说的将其放入XFA Worker的位置?

更新:感谢Bruno,我的代码不允许我将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:只能在PdfAStamper中打开PDF / A文档 .

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

1 回答

  • 0

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

    假设你忽略了这个父亲的建议,你能做什么?

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

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

    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();
    }
    

    结果如下所示:

    enter image description here

    在您的情况下,您不希望输入名为 ITXT_Custom . 您想要添加名为 XFAResources 的条目,该条目的值应该是名称树,其中包含字符串名称和对流的间接引用 . 应该很容易调整我的例子来实现这一目标 .

    Note: 我在Stack Overflow上提供的所有代码都可以在CC-BY-SA中定义的CC-BY-SA下使用 . 如果您不喜欢CC-BY-SA,我也会使用与iText相同的许可证提供此代码,更具体地说是AGPL .

相关问题