将PDF与iTextSharp合并:javascript丢失

将PDF与iTextSharp合并:javascript丢失,javascript,c#,merge,itextsharp,Javascript,C#,Merge,Itextsharp,我有两个pdf表单,我必须以编程方式合并它们。这两个文档嵌入了javascript和按钮,用于在三种不同语言(法语、德语、意大利语)之间切换文本。此外,它们还有大量的表单字段。有一个javascript函数可以检测应用程序语言并以通用用户界面语言显示文档 当我使用pdfSmartCopy合并时,结果是一个同时显示三种语言的pdf文档。我已经看到合并文档中不再有javascript了。我尝试手动添加Javascript: Document doc = new Document(); PdfCopy

我有两个pdf表单,我必须以编程方式合并它们。这两个文档嵌入了javascript和按钮,用于在三种不同语言(法语、德语、意大利语)之间切换文本。此外,它们还有大量的表单字段。有一个javascript函数可以检测应用程序语言并以通用用户界面语言显示文档

当我使用pdfSmartCopy合并时,结果是一个同时显示三种语言的pdf文档。我已经看到合并文档中不再有javascript了。我尝试手动添加Javascript:

Document doc = new Document();
PdfCopy copy = new PdfSmartCopy(doc, new FileStream(destFileName, FileMode.Create));
copy.SetMergeFields();
doc.Open();
foreach (PdfReader r in listPdfSource)
{
    copy.AddDocument(r);
    PdfAction action = PdfAction.JavaScript(r.JavaScript, copy);
    copy.AddJavaScript(action);
}
doc.Close();
但是文档仍然显示这三种语言,并且按钮不起作用。 我试图寻找XFA部件,但没有。 有没有办法保持原始文档的js功能性并将它们注入合并结果中

编辑

谢谢你的OCG提示。 我尝试了以下方法:

Dictionary<string, PdfLayer> layers = stamper.GetPdfLayers();
foreach (KeyValuePair<string, PdfLayer> layer in layers)
{
    Console.WriteLine(layer.Key);
}
只有第三个给出了结果。 然后我做了以下几点:

Document doc = new Document();
PdfCopy copy = new PdfSmartCopy(doc, new FileStream(tempFileName, FileMode.Create));
copy.SetMergeFields();
doc.Open();
foreach (PdfReader r in listPdfSource)
{
    copy.AddDocument(r);
    PdfAction action = PdfAction.JavaScript(r.JavaScript, copy);
    copy.AddJavaScript(action);
}
doc.Close();
//re-open the document and create a stamper for getting the layers
PdfReader reader = new PdfReader(tempFileName);
PdfStamper stamper = new PdfStamper(reader, new FileStream(destFileName, FileMode.Create));
stamper.GetPdfLayers()["ger"].View = false;
stamper.GetPdfLayers()["ita"].View = false;
stamper.Close();
但当然,它不起作用,因为新文档的层列表是空的! 它适用于单个原始文档。然后我尝试分别对每个原始文档进行此操作,并在之后合并它们。但它仍然同时显示这三种语言

编辑2

@Bruno Lowagie要求我分享原始文件:

我需要一个10的声誉张贴超过2个链接?您可以在注释中找到合并文档的链接

我真的希望一位专家能给我提供进一步研究的途径。
据我所知,这是一个涉及文档级别的OCG和JS的问题。如何检索并将其应用于新的合并文档。

可能值得查看以下库:


它是免费的,支持JS和HTML5,您可以将PDF批量合并到一个文件中。我过去使用它来隐藏JS中的某些元素,以便打印。

您的原始PDF可能有可选的内容组OCG。你能分享PDF吗?如果没有,如果你不能告诉我们是否涉及OCG,请不要期待答案。第一个文件:,第二个文件:我希望这是合适的。我刚刚在Google上搜索了文件托管并点击了第一个匹配项。查看示例文件,我发现有OCGs和JavaScript的组合。在手头任务的国际化上下文中,前者选择静态文档文本,后者更改表单字段。这两种技术都在文档级别而不是页面级别定义了元素。因此,据我所知,Pdf*Copy不会复制这些文档级元素,至少在默认情况下不会。尽管如此,@Bruno可能知道一些方法来实现这一点。对于JavaScript部分,还有一个额外的挑战,即两个文档都具有相同名称但内容有所不同的JavaScript函数的文档级定义。此外,两个文档都有表单字段,一些名称相同,一些名称不同,其中一些引用了上述JavaScript。就您链接的页面而言,该库支持HTML中的JS转换为PDF,但不支持PDF中的JS合并。您完全正确,很抱歉,我误读了这一点,并假设页面本质上是HTML。重新阅读后,我提供的链接实际上对OP毫无益处。
Document doc = new Document();
PdfCopy copy = new PdfSmartCopy(doc, new FileStream(tempFileName, FileMode.Create));
copy.SetMergeFields();
doc.Open();
foreach (PdfReader r in listPdfSource)
{
    copy.AddDocument(r);
    PdfAction action = PdfAction.JavaScript(r.JavaScript, copy);
    copy.AddJavaScript(action);
}
doc.Close();
//re-open the document and create a stamper for getting the layers
PdfReader reader = new PdfReader(tempFileName);
PdfStamper stamper = new PdfStamper(reader, new FileStream(destFileName, FileMode.Create));
stamper.GetPdfLayers()["ger"].View = false;
stamper.GetPdfLayers()["ita"].View = false;
stamper.Close();