首页 文章

如何以编程方式修改PDF文件中的javascript事件?

提问于
浏览
1

我的PDF文件有一个附加到按钮的事件 . 我需要能够以编程方式修改该事件 . 我试过这种方式使用iTextSharp,但它没有改变新文件中的javascript:

var pdfReader = new PdfReader(originalPdfDocumentPath);

pdfReader.RemoveUsageRights();

var pdfStamper = new PdfStamper(pdfReader,new FileStream(newPdfDocumentPath,FileMode.Create,FileAccess.Write,FileShare.None),'\ 0',true);

var originalXml = pdfReader.AcroFields.Xfa.DomDocument.InnerXml;

var newXml = originalXml.Replace(“Table2.Row1.instanceManager.removeInstance(1)”,“Table2._Row1.removeInstance(this.parent.parent.index)”);

pdfStamper.AcroFields.Xfa.DomDocument.InnerXml = newXml; //不幸的是,这条线什么也没做 .

pdfStamper.Close();

pdfReader.Close();

任何帮助将不胜感激 .

1 回答

  • 0

    我发现,如果不是直接更改XML,而是更改DomDocument并将XFA标记为已更改,则可以使用它 . 以下是更正后的代码:

    var pdfReader = new PdfReader(originalPdfDocumentPath);
    
    pdfReader.RemoveUsageRights();
    
    var pdfStamper = new PdfStamper(pdfReader, new FileStream(newPdfDocumentPath, FileMode.Create, FileAccess.Write, FileShare.None), '\0', true);
    
    var originalXml = pdfReader.AcroFields.Xfa.DomDocument.InnerXml;
    
    var newXml = originalXml.Replace("Table2.Row1.instanceManager.removeInstance(1)", "Table2._Row1.removeInstance(this.parent.parent.index)");
    
    /* New Code */
    var doc = new XmlDocument();
    doc.LoadXml(newXml);
    
    pdfStamper.AcroFields.Xfa.DomDocument = doc;
    pdfStamper.AcroFields.Xfa.Changed = true;
    /* End of New Code */
    
    pdfStamper.Close();
    
    pdfReader.Close();
    

    我应该注意,即使此代码更改了PDF文件中的javascript,它也会禁用Adobe Acrobat Reader中的扩展功能 . 你可以在这里找到更多相关信息:

    http://developers.itextpdf.com/question/why-do-i-get-error-saying-use-extended-features-no-longer-available

    “问题与您的文档是否启用阅读器有关 . 阅读器启用只能使用Adobe软件完成 . 这是一个需要使用Adobe私钥进行数字签名的过程 . 当存在有效签名时,特定功能(在签名时的使用权限中定义)在Adobe Reader中解锁 . 您可以更改此类PDF的内容,从而打破签名 . “

相关问题