PDF hostContainer 回调
Posted
技术标签:
【中文标题】PDF hostContainer 回调【英文标题】:PDF hostContainer callback 【发布时间】:2012-11-29 23:51:58 【问题描述】:按照此 SO 解决方案 here 通知客户端 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、对象...等)中触发功能的方法。
【问题讨论】:
我缺少有关此步骤的一些信息:“当调用 submitForm 时,PDF 将成功创建,并且通过执行此操作在 PDF 中显示警报:”。我假设在服务器上创建了一个 PDF 并在客户端上显示,但也许我错了。也许服务器正在返回一个 FDF 文件。你能澄清一下吗? 糟糕,我的错误,submitForm 调用是为了保存 PDF 的内容而不是创建它,它已经在用户控件中呈现并嵌入到 我不明白上面哪里说“if (!this.hostContainer.messageHandler);”为什么那行末尾有一个分号?这是一个错误吗?如果不是,那条线的目的是什么?非常感谢! 【参考方案1】:我不知道您使用的 FDF 响应,所以我从您的问题中学到了一些新东西。我研究了 PDF 参考中的 AcroJS 参考和 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 查询字符串,我认为没有解决方案。
如果您想知道 MyDocScript1
和 MyDocScript2
是什么:
Doc 定义了一个数组,定义了附加的 JavaScript 脚本 添加到文档名称的 JavaScript 条目中定义的那些 字典。该数组包含偶数个元素,有组织 成对。每对的第一个元素是名称,第二个元素是名称 是定义脚本对应的文本字符串或文本流 到那个名字。每个定义的脚本都添加到那些已经 在名称字典中定义,然后在脚本之前执行 执行之前条目中定义的。 (ISO-32000-1 表 245)
我不确定所有这些在实践中是否可行。无论哪种方式,请告诉我。
【讨论】:
最后这实际上是可行的,客户端 PDF 可以双向交谈,以防您想更新答案,我必须将 /After 行修改为:/JavaScript >。谢谢,你得到了赏金! @Maya:我想达到同样的效果,但在深入了解答案和文档之前,我想问一下该解决方案是否仍然适用于现代浏览器。感谢您的任何意见! @Photon 这仍在工作中使用 Edge 和 2 个月大的 Chrome @Maya:感谢您的回复!是否使用了 Adobe Reader 浏览器插件?我想使用一个开放的阅读器,因此尝试在 pdf.js 中工作,但 pdf.js 开发人员告诉我,那里不支持 JS,也不会支持(由于某些 ISO 规范禁止在 PDF 中使用 JS :en.wikipedia.org/wiki/PDF/A#Description)以上是关于PDF hostContainer 回调的主要内容,如果未能解决你的问题,请参考以下文章