10

在此处遵循此 SO 解决方案以通知客户端 PDF 文档中的单击事件,当客户端使用 this.myPDF.submitForm("localhost/Handler.ashx?r=2 ) 功能?

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、对象...等)中触发功能的方法。

4

1 回答 1

5

我不知道您使用的 FDF 响应,所以我从您的问题中学到了一些新东西。我研究了 PDF 参考中的 AcroJS 参考和 FDF 规范,现在我对您的代码的作用有了更好的理解。谢谢你。

我假设您已经知道如何使用来自 PDF 的 JavaScript 调用来触发 HTML 文件中的 JavaScript 消息。请参阅HTML 和 PDF 之间createMessageHandler()JavaScript 通信一文。

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

如果有这个问题的解决方案,它将涉及 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 定义了一个数组,该数组定义了要添加到文档名称字典的 JavaScript 条目中定义的脚本的附加 JavaScript 脚本。该数组包含偶数个元素,成对组织。每对的第一个元素是名称,第二个元素是定义与该名称对应的脚本的文本字符串或文本流。每个已定义的脚本都被添加到名称字典中已定义的脚本中,然后在执行 Before 条目中定义的脚本之前执行。(ISO-32000-1 表 245)

我不确定所有这些在实践中是否可行。无论哪种方式,请让我知道。

于 2012-12-16T13:21:16.513 回答