javascript - PDF hostContainer回调

标签 javascript pdf adobe itextsharp acrofields

遵循此 SO 解决方案 here要通知客户 PDF 文档中的点击事件,如何在客户使用 this.myPDF.submitForm("localhost/Handler.ashx?r=2) 函数提交 PDF 时通知客户?

PDF 文件在用户控件中创建,然后呈现为 ​​HTML 对象:

string container = ("<object data='/myfile.pdf' type='application/pdf'></object>");

PDF附带的JS文件是这样完成的:

 var webClient = new WebClient();
 string htmlContent = webClient.DownloadString(fileurl + "pdf_script.js");
 PdfAction action = PdfAction.JavaScript(htmlContnent, pdfstamper.Writer);
 pdfstamper.Writer.SetOpenAction(action);

以及js文件的内容:

this.disclosed = true;
if (this.external && this.hostContainer) {

function onMessageFunc(stringArray) {
     try {
          this.myPDF.submitForm("http://localhost/Handler.ashx?EmpNo=12345" + "#FDF", false);

        }
        catch (e) {

        }
    }
    function onErrorFunc(e) {
        console.show();
        console.println(e.toString());
    }
    try {
        if (!this.hostContainer.messageHandler);
        this.hostContainer.messageHandler = new Object();
        this.hostContainer.messageHandler.myPDF = this;
        this.hostContainer.messageHandler.onMessage = onMessageFunc;
        this.hostContainer.messageHandler.onError = onErrorFunc;
        this.hostContainer.messageHandler.onDisclose = function () { return true; };
    }
    catch (e) {
        onErrorFunc(e);
    }
}

当调用 submitForm 时,PDF 内容(表单字段)被成功保存,并通过执行以下操作在 PDF 中显示警告:

message = "%FDF-1.2
                   1 0 obj
                   <<
                   /FDF
                   <<
                      /Status("Success!")
                   >>
                   >>
                   endobj
                   trailer
                   <</Root 1 0 R>>
           %%EOF");
return message;

我想做的是在从该客户端发送表单提交调用后让 PDF 回调客户端,这是一种确认客户端表单已提交的方式,而不是以警报的形式,而是一种在主机(容器、iframe、对象...等)中触发功能的方法。

最佳答案

我不知道你使用的 FDF 回复,所以我从你的问题中学到了一些新东西。我研究了 AcroJS Reference 和 PDF Reference 中的 FDF 规范,现在我对你的代码做了什么有了更好的理解。谢谢你。

我假设您已经知道如何使用来自 PDF 的 JavaScript 调用在 HTML 文件中触发 JavaScript 消息。请参阅 JavaScript Communication between HTML and PDF 中的 createMessageHandler()文章。

我将您的问题解释为:“如何在成功提交数据后调用此方法?”

如果要解决这个问题,它会涉及到 JavaScript。我看到有人可以在 FDF 文件中添加 JavaScript,但我不确定该 JavaScript 是否可以“与”HTML 对话。我不确定您是否可以从 FDF 响应中调用初始 PDF 中的 JavaScript 函数。如果可能,您应该向 PDF 添加类似于/Status 条目的 JavaScript 条目。

这个条目的值是一个字典,类似于:

<<
/Before (app.alert\("before!"\))
/After (app.alert\("after"\))
/Doc [/MyDocScript1, (myFunc1\(\)),
      /MyDocScript2, (myFunc2\(\))
>>

在您的情况下,我会删除/Before 和/Doc 键。我认为您不需要它们,我会将字典缩减为:

<<
/After (talkToHtml\(\))
>>

其中 talkToHtml() 是 PDF 中已经存在的方法:

function talkToHtml() {
    var names = new Array();
    names[0] = "Success!";
    try{
        this.hostContainer.postMessage(names);
    }
    catch(e){
        app.alert(e.message);
    }
}

我不知道这样行不行。我自己从来没有尝试过。我的回答基于规范。

我不知道你是否真的需要使用 FDF。您是否尝试过将 JavaScript 添加到您的 submitForm() 方法中?像这样的东西:

this.myPDF.submitForm({
    cURL: "http://localhost/Handler.ashx?EmpNo=12345",
    cSubmitAs: "FDF",
    oJavaScript: {
        Before: 'app.alert("before!")',
        After: 'app.alert("after")',
        Doc: ["MyDocScript1", "myFunc1()",
              "MyDocScript2", "myFunc2()" ]
    }
});

这仅在您提交为 FDF 时有效。如果您提交 HTML 查询字符串,我认为没有解决方案。

如果您想知道 MyDocScript1MyDocScript2 是什么:

Doc defines an array defining additional JavaScript scripts to be added to those defined in the JavaScript entry of the document’s name dictionary. The array contains an even number of elements, organized in pairs. The first element of each pair is a name and the second is a text string or text stream defining the script corresponding to that name. Each of the defined scripts is added to those already defined in the name dictionary and then executed before the script defined in the Before entry is executed. (ISO-32000-1 Table 245)

我不确定所有这些在实践中是否有效。无论哪种方式,请告诉我。

关于javascript - PDF hostContainer回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13837002/

相关文章:

javascript - 如何从 Markdown 代码块字符串中提取代码?

c# - 将数据从 datagridview 显示到 reportviewer C#

html - 将 CSS 和 HTML 中的日期获取到 PDF 页脚

css - Spry 验证文本字段在谷歌浏览器中显示不佳

javascript - Adobe Animate CC 和 JavaScript - 碰撞检测

javascript - 渲染一个 Jbuilder 模板并将字符串分配给 gon

JavaScript 正则表达式替换整个单词

javascript - discord.js 中的字体生成器

r - 以 Shiny 的方式显示来自本地驱动器的 pdf

JavaScript 为 Adob​​e Form Field 自动计算 24 小时工时?