我可以使用iText(商业或非商业)为XFA PDF添加水印吗?

我可以使用iText(商业或非商业)为XFA PDF添加水印吗?,pdf,itext,livecycle-designer,xfa,Pdf,Itext,Livecycle Designer,Xfa,好吧,在花了相当长的时间来处理这个问题之后,我想我可能在发布这个问题后不久就找到了一个解决方案。有点尴尬,不过,嘿,现在好像有用了 我还不想删除这个问题,以防有人想知道细节。基本上,我再次尝试了第(c)点,但在我放回的XML中,我使用了一个嵌入的图像。因此,我似乎可以使用iText更改XFA模板母版页。接下来还有更多的测试 ========================= 问题:将水印应用于PDF XFA(动态或非动态)。最后,PDF仍然应该是XFA,并且应该保持其所有安全设置不变。我无法控制

好吧,在花了相当长的时间来处理这个问题之后,我想我可能在发布这个问题后不久就找到了一个解决方案。有点尴尬,不过,嘿,现在好像有用了

我还不想删除这个问题,以防有人想知道细节。基本上,我再次尝试了第(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的书,浏览了说明书,还没有运气

PDF输入没有常规使用权限,没有安全性。在Acrobat中打开时,它将显示更改文档/文档汇编/添加模板的限制,但我感觉所有XFA都有这些限制。没有任何东西会从下面返回

    System.out.println(" permissions " + reader.getPermissions());
    System.out.println(" usage rights " + reader.hasUsageRights());
    System.out.println(" viewer pref" + reader.getSimpleViewerPreferences());
以下是我经历的一些事情:

a) 在it LC中做

这很有效。如果我试图在母版页上放置图像,那么从LC保存时,它将在所有页面上显示为水印

b) 正在尝试使用iText进行写操作()

我发现一篇2007年的帖子建议使用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()替换它

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

  • 我使用LiveCycle创建了一个简单的XFA
  • 另存为xfa1.pdf并将xml(使用iText)提取到xfa1.xml
  • 在LC中,将图像添加到母版页并另存为xfa2.pdf
  • 打开xfa2.pdf,注意水印已经存在
  • 将XML从xfa2提取到xfa2.XML并与xfa1.XML进行比较-注意image元素
  • 要么将image元素放在原始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会显示水印

    唷,那是一篇很长的帖子。。。对不起


    感谢您的阅读和任何反馈

    请注意,对于XFA PDF,PDF只是XFA XML的载体格式。另一方面,iText专注于处理实际的PDF功能,并且只提供一些最小的XFA支持。因此,不要期望在iText中为您的任务使用高级方法。也就是说,由于您可以使用iText提取XFA、更改XFA并重新插入更改后的XFA,因此您应该能够通过更改XFA XML来实现您的任务。