May*_*aya 10 javascript pdf adobe itextsharp acrofields
按照此SO解决方案在此处通知客户PDF文档中的单击事件,如何在客户端使用this.myPDF.submitForm("localhost/Handler.ashx?r = 2"提交PDF时通知客户端)功能?
PDF文件在用户控件内创建,然后呈现为HTML对象:
string container = ("<object data='/myfile.pdf' type='application/pdf'></object>");
Run Code Online (Sandbox Code Playgroud)
附加到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);
Run Code Online (Sandbox Code Playgroud)
和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);
}
}
Run Code Online (Sandbox Code Playgroud)
当调用submitForm时,PDF内容(表单字段)将成功保存,并通过执行以下操作在PDF中显示警报:
message = "%FDF-1.2
1 0 obj
<<
/FDF
<<
/Status("Success!")
>>
>>
endobj
trailer
<</Root 1 0 R>>
%%EOF");
return message;
Run Code Online (Sandbox Code Playgroud)
我想要做的是让PDF在客户端发送表单提交调用后回调客户端,这是一种向客户确认表单已提交的方式,而不是以警报的形式,而是一种触发主机功能的方法(容器,iframe,对象......等).
您使用的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\(\))
>>
Run Code Online (Sandbox Code Playgroud)
在您的情况下,我会删除/ Before和/ Doc键.我认为你不需要它们,我会将字典缩减为:
<<
/After (talkToHtml\(\))
>>
Run Code Online (Sandbox Code Playgroud)
talkToHtml()PDF中已存在的方法在哪里:
function talkToHtml() {
var names = new Array();
names[0] = "Success!";
try{
this.hostContainer.postMessage(names);
}
catch(e){
app.alert(e.message);
}
}
Run Code Online (Sandbox Code Playgroud)
我不知道这是否有效.我自己从未尝试过.我的答案基于规格.
我不知道你是否真的需要使用FDF.您是否尝试过在您的submitForm()方法中添加JavaScript?就像是:
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()" ]
}
});
Run Code Online (Sandbox Code Playgroud)
这仅在您提交为FDF时才有效.如果您提交HTML查询字符串,我认为没有解决方案.
如果你想知道什么MyDocScript1和MyDocScript2有:
Doc定义了一个数组,用于定义要添加到文档名称字典的JavaScript条目中定义的JavaScript脚本的其他JavaScript脚本.该数组包含偶数组成的偶数元素.每对中的第一个元素是名称,第二个元素是定义与该名称对应的脚本的文本字符串或文本流.每个已定义的脚本都将添加到已在名称字典中定义的脚本中,然后在执行Before条目中定义的脚本之前执行.(ISO-32000-1表245)
我不确定这一切是否都能在实践中发挥作用.请以任何方式告诉我.