好吧,经过相当长的一段时间玩这个,我想我可能在发布问题后很快就找到了解决方案 . 有点尴尬,但嘿,现在似乎工作 .

我还不想删除这个问题,万一有人想要了解细节 . 基本上,我再次尝试了点(c),但在我放回的XML中,我使用了嵌入式图像 . 所以,似乎我可以使用iText更改XFA模板母版页 . 更多测试要遵循......

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

The problem :将水印应用于PDF XFA(动态与否) . 最后,PDF应该仍然是XFA,并且应该保持其所有安全设置不变 . 我无法控制进入的PDF .

The question :我可以使用iText 5来做到这一点吗?如果是,是通过 PdfStamper.getUnderContent() or via XfaForm.setXfa() 还是别的?前两个对我来说还没有用 .

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

顺便说一句,如果我在更换XML后使用iText生成的PDF,那么 open and save in LC, the watermark shows

谢谢,克里斯蒂安

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

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

我知道这个或类似的问题出现过,但到目前为止我所尝试的并不适合我 . 我也承认我不是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) doing in it LChttps://forums.adobe.com/thread/496558

这很有效 . 如果我尝试在母版页上放置图像,则在从LC保存时,它会在所有页面上显示为水印 .

b) trying to write under using iTexthttps://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替换它(Some pdf file watermark does not show using iText

阅读上面的帖子和 section 8.6 from itext in action 后,似乎这是正确的路径,所以:

  • 我使用LiveCycle创建一个简单的XFA

  • 另存为xfa1.pdf并将xml(使用iText)提取到xfa1.xml

  • 在LC中将图像添加到母版页并保存为xfa2.pdf

  • 打开xfa2.pdf并注意水印存在

  • 从xfa2提取XML到xfa2.xml并与xfa1.xml进行比较 - 注意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将显示水印 .

p,这是一个很长的帖子......抱歉 .

感谢阅读和任何反馈