当前位置: 首页 > 知识库问答 >
问题:

如何用IText/XFA Worker将XFA xml数据移动到PDF/A-2格式文件中

穆劲
2023-03-14

在Adobe的PDF/a的ISO 32000规范中,它规定XFA数据可以存储在PDF/A-2确认PDF中的一个特殊位置。这是那一节的正文。

将XFA数据集合并到PDF/A-2符合文件中以支持PDF/A-2符合文件,ExtensionLevel3通过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 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文档。

共有1个答案

皇甫飞宇
2023-03-14

请允许我先提出一些慈父般的忠告。在ISO-32000-2(PDF2.0)中将不推荐使用XFA,您将XFA文档转换为PDF/A文档是很好的。然而,为什么你会选择PDF/A-2呢?PDF/A-3与PDF/A-2相同,但有一个例外:在PDF/A-3中,允许嵌入XML文件。您甚至可以指出附加的XML和PDF之间的关系。创建PDF/A-3文件并将原始数据(而不是XFA文件)作为附件附加不是更明智吗?

假如你不理睬这个慈父般的忠告,你能做什么呢?

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

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

您可以将条目添加到此names字典中。例如:假设我想添加一个内容为某些字节的流作为自定义条目,我将使用以下代码:

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

结果如下所示:

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

注意:我提供的关于堆栈溢出的所有代码都可以在堆栈交换网络服务条款中定义的CC-BY-SA下使用。如果您不喜欢CC-BY-SA,我还提供了与iText(更具体地说是AGPL)相同的许可证下的代码。

 类似资料:
  • 问题内容: 我正在尝试使用iText库将.txt文件转换为.pdf文件。我面临的问题如下: 我在txt文件中有清晰的格式,与此类似: 在输出中,格式消失了,看起来像这样: 代码如下: 我还尝试使用IDENTITY_H创建BaseFont,但是它不起作用。我猜这是关于编码或类似的东西。你怎么看?我用完了解决方案… 谢谢 LE:正如艾伦(Alan)以及iText页面上的教程所建议的那样,除了我现有的代

  • 我正在使用iText生成Pdf。但当我试图在pdf中添加图像时, 我mage.get实例(新的URL(timetableResource.getImageUrl()));document.add(学校标志); 但我得到的错误是 HTTP状态500-服务器为URL返回了HTTP响应代码400:http://139.59.72.150:8080/sms/attachments/23/42/school

  • 问题内容: 我想通过iText将Swing JComponent打印到pdf。 不幸的是,PDF文件中未显示任何内容。你知道如何解决这个问题吗? 问题答案: 我已经弄清楚添加addNotify和验证帮助。

  • 我需要将一个通用的PdfObject添加到一个PDF中,而不需要将它放在文档的任何地方。 下面是iText 5中的代码: 下面是我在iText 7中尝试做的事情(没有addPdfObject方法): 但是,在我关闭数组后,它不在PDF中。我记得Bruno在某处提到过iText 7现在删除close上未使用的对象,类似于iText 5中的pdfreader.removeUnusedObjects()

  • 我在实现中适用于简单情况,但不适用于复杂情况。原始 pdf 将显示在中央窗格中。我有一个侧窗格,其中有一些矩形,如“名称”,“签名”,“时间戳”,可以在pdf上拖动。使用 j 查询可拖动 我知道图像以像素为单位,而PDF尺寸以点为单位。因此,我将以像素为单位的图像坐标转换为点(0.75)。还考虑到,对于图像,原点是在左上 角,而在pdf中,原点是左下角,对于图像,y轴是南区,但对于pdf y轴是北

  • 在jasper-report中生成PDF/A包含许多缺陷,并且在某些版本的jasper-report中不受支持。这就是为什么我决定传递这篇问答文章的原因,它指出了将一个带有图形的简单报表导出到PDF/a所必需的步骤和库版本 示例数据(usersrep.csv) 如果将报告导出为pdf,我需要做什么来生成pdf/A-1A?