我有两种形式的pdf,我必须以编程方式合并。这两个文件嵌入了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个链接?您可以在评论中找到合并文档的链接)
我真的希望专家能给我提供进一步观察的方式。 据我所知,这是一个关于OCG和JS涉及文档级别的问题。如何检索并将它们应用于新的合并文档。
答案 0 :(得分:-1)
可能值得查看以下库: http://www.nrecosite.com/pdf_generator_net.aspx
它是免费的,它支持JS和HTML5,您可以将pdfs批量组合成一个文件。我过去曾用它来隐藏JS中的某些元素用于打印目的。