【问题标题】:Merging PDF's with iTextSharp: javascript lost将 PDF 与 iTextSharp 合并:javascript 丢失
【发布时间】: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


【解决方案1】:

可能值得查看以下库: http://www.nrecosite.com/pdf_generator_net.aspx

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

【讨论】:

  • 就您链接的页面而言,该库支持 HTML 中的 JS 转换为 PDF,但不支持 PDF 中的 JS 进行合并。
  • 你说得对,对不起,我误读了这一点,并假设页面本质上是 HTML。重新阅读后,我提供的链接实际上对 OP 没有任何好处。
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-22
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
相关资源
最近更新 更多