3

好吧,在花了很长时间玩这个之后,我想我可能在发布问题后不久就找到了解决方案。有点尴尬,但是嘿,它现在似乎工作了。

我还不想删除问题,以防有人想要详细信息。基本上,我再次尝试了点 (c),但在我放回的 XML 中,我使用了嵌入的图像。因此,看来我可以使用 iText 更改 XFA 模板母版页。更多测试要遵循...

==========================

问题:将水印应用于 PDF XFA(动态或非动态)。最后,PDF 应该仍然是 XFA,并且所有安全设置都应该完好无损。我无法控制传入的 PDF。

问题:我可以使用 iText 5 来​​做到这一点吗?如果是,是通过PdfStamper.getUnderContent() 还是通过 XfaForm.setXfa()或其他方式?前两个对我来说还没有用。

我想知道我是否遗漏了一些 XFA 细节(即当我尝试替换 XML 时),不确定 XFA 是如何实际保护免受更改的。我是否需要生成一些 UUID,加密一些东西,一些关于签名的东西......

顺便说一句,如果我在替换XML后取iText生成的PDF,然后在LC中打开并保存,水印显示

谢谢,克里斯蒂安

=========================

无论如何,这是我的问题的简短版本。如果您认为您可以提供帮助和/或对更多细节感兴趣...

我知道以前出现过这个或类似的问题,但到目前为止我尝试过的方法对我不起作用。我也承认我不是 IText、XFA 或 PDF 标准专家。我浏览了一些论坛帖子,Itext book,浏览了规格,还没有运气。

PDF 输入没有常规使用权限,没有安全性。在 Acrobat 中打开时,它会显示更改文档/文档组合/添加模板的限制,但我感觉所有 XFA 都有。以下没有任何结果......

    System.out.println(" permissions " + reader.getPermissions());
    System.out.println(" usage rights " + reader.hasUsageRights());
    System.out.println(" viewer pref" + reader.getSimpleViewerPreferences());

以下是我经历过的一些事情:

a)在 LC 中进行( https://forums.adobe.com/thread/496558 )

这行得通。如果我尝试在母版页上放置图像,那么当从 LC 保存时,它会在所有页面上显示为水印。

b)尝试使用 iText ( https://sourceforge.net/p/itext/mailman/message/17225398/ )编写

我发现 07 年的一篇帖子建议使用 pdfStamper.getUnderContent()。该线程似乎没有得出结论,如果它最终对询问的人有效

对我来说,代码适用于简单的 PDF,但不适用于 XFA

PdfContentByte under = pdfStamper.getUnderContent(1);
under.beginText();
BaseFont FONT = BaseFont.createFont("c:/windows/fonts/times.ttf", BaseFont.WINANSI, BaseFont.EMBEDDED);
under.setFontAndSize(FONT, 40);
under.showTextAligned(Element.ALIGN_CENTER, "TEST_TEXT", 200, 600, 45);
under.endText();

c) 生成 XML 并使用 iText 替换它(某些 pdf 文件水印不使用 iText 显示

在阅读了上面的帖子和itext in action 中的第 8.6 节之后,这似乎是正确的路径,所以:

  1. 我使用 LiveCycle 创建了一个简单的 XFA
  2. 另存为 xfa1.pdf 并将 xml(使用 iText)提取到 xfa1.xml
  3. 在 LC 中将图像添加到母版页并另存为 xfa2.pdf
  4. 打开 xfa2.pdf 并注意水印存在
  5. 从 xfa2 提取 XML 到 xfa2.xml 并与 xfa1.xml 进行比较 - 注意图像元素
  6. 要么将图像元素放在原始 XML 中,要么使用 xfa2.xml 并使用 iText 替换原始 xfa1.pdf 中的 XFA,我们称之为 xfa3_itext;

相关代码:

XfaForm xfa = new XfaForm(reader);
DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();
fact.setNamespaceAware(true);
DocumentBuilder db = fact.newDocumentBuilder();
Document doc = db.parse(new FileInputStream(xml));
xfa.setDomDocument(doc);
xfa.setChanged(true);
XfaForm.setXfa(xfa, stamper.getReader(), stamper.getWriter());

我尝试使用客户提供的示例 PDF 以及在 LiveCycle Designer 中创建的简单 XFA 表单,但没有成功。如果我在 LiveCycle 中打开 xfa3_itext,它会生成水印,如果我再次从 LiveCycle 将它保存为动态 XFA PDF,新的 PDF 会显示水印。

唷,这是一个很长的帖子......对不起。

感谢阅读和任何反馈

4

0 回答 0