【发布时间】:2016-05-23 11:49:47
【问题描述】:
我有两个表单 pdf,我必须以编程方式合并。这 2 个文档嵌入了 javascript 和用于在三种不同语言(法语、德语、意大利语)之间切换文本的按钮。此外,它们还有很多 AcroForm 表单域。有一个 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);
}
它给了我一个非常有趣的列表,其中包含 fre、ger、ita 等。对于单个原始文档,我使用以下方法测试了“禁用”图层的方法:
layer.On = false;
// or
layer.OnPanel = false;
// and
layer.View = false;
只有第三个给出了结果。 然后我做了以下:
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 要求我分享原始文件:
http://www.filedropper.com/source1
http://www.filedropper.com/source2
(我需要 10 的声望才能发布 2 个以上的链接?您可以在 cmets 中找到合并文档的链接)
我真的希望专家能给我提供进一步研究的方法。 据我了解,这是一个关于文档级别涉及的 OCG 和 JS 的问题。如何检索它们并将它们应用到新的合并文档。
【问题讨论】:
-
您的原始 PDF 可能有可选的内容组 (OCG)。可以分享一下PDF吗?如果没有(如果您无法告诉我们是否涉及 OCG),请不要期待答案。
-
我希望这是合适的。我刚刚搜索了“文件托管”并点击了第一个匹配项。
-
查看示例文件,我看到 OCG 和 JavaScript 的组合。在手头任务的背景下,国际化,前者选择静态文档文本,后者改变表单字段。这两种技术都有在文档级别而不是页面级别定义的元素。因此,据我所知,
Pdf*Copy不会复制这些文档级元素,至少默认情况下不会。尽管如此,@Bruno 可能知道一些方法来做到这一点。 -
在 JavaScript 部分的情况下,还有一个额外的挑战,即两个文档都有 JavaScript 函数的文档级定义,名称相同但内容略有不同。此外,这两个文档都有表单字段,一些具有相同的名称,一些具有不同的名称,其中一些来自上述 JavaScript。
标签: javascript c# merge itextsharp