PDF postMessage 未定义

Posted

技术标签:

【中文标题】PDF postMessage 未定义【英文标题】:PDF postMessage is undefined 【发布时间】:2016-11-22 19:00:56 【问题描述】:

注意 - this 似乎记录了我遇到的关于“postMessage”未定义的相同问题,但没有提供答案。

我是处理 PDF 文件的新手。我正在尝试修复现有应用程序中的错误。该应用程序在浏览器中显示一个表单,允许用户进行编辑,然后使用 Adob​​e 的 javascript postMessage 方法将用户的更改回发到服务器。由于某种原因,PDF 对象似乎没有定义 postMessage 方法。 pdfObject 可以通过名称找到,它有很多很多属性(attributes 是节点图,baseURL 是用户用来导航到 PDF 的 URL,设置了 childNodes 和 contentDocument,还有很多 onXX 方法(例如 onBeforeCut、 onActivate 等),但 myPdfObj.postMessage 未定义。PDF 显示正常,可以编辑,但是当应用程序尝试调用未定义的方法 postMessage 时,屏幕上出现错误“错误:目标文档未公开”。任何知道会发生什么吗?

注意 - 即使 postMessage 未定义,我们的临时站点似乎仍然可以工作。我不知道为什么。但是,本地托管的站点不起作用。

以下是 cmets 中发布的每个问题的更多信息:

我认为它应该有一个 postMessage 函数,因为我们的代码正在调用该方法,并且它没有在任何地方声明,而且我从网上的帖子(例如 here 和 here)中找到了其他人正在调用的证据PDF 对象上的那个方法,所以我认为这是 Adob​​e 提供的。

浏览器是IE II。

这是导致错误的代码 - 单击此按钮时

<button id="useraction_savedraft" onclick="saveDraft();">Save Draft</button> 

这个 JavaScript 被称为:

function saveDraft() 
    $('#keepAsDraft').val('true');
    sendMessage(["submitForm"]);


var pdfObject = null;
function sendMessage(aMessage) 

    if (pdfObject == null) 
        pdfObject = document.getElementById("pdfForm");

        if (typeof(pdfObject) == "undefined" || typeof (pdfObject.postMessage) == "undefined") 
            statusErrorMessage("ERROR: Unable to initialize pdfForm.  Your browser may not be compatible with PDF inline-editing.");
            return;
        

        pdfObject.messageHandler = 
            onMessage: function(msg) 
                if (msg[0]=="saveFdf") 
                    $("#fdf").val(msg[1]);
                    $("#entryForm").submit();
                

                else if (msg[0]=="saveXFA") 
                    $("#fdf").val("");
                    $("#xfa").val(msg[1]);
                    $("#entryForm").submit();
                
            ,

            onError: function(error, msg)
            
                statusErrorMessage("ERROR: " + error.message);
                return;
            
        ;
    

    pdfObject.postMessage(aMessage);

调用 onMessage 和 onError 时运行的脚本是嵌入在 PDF 文件本身中的 js 函数(我们使用 3rd 方库来嵌入脚本)。这些函数称为 myOnMessage 和 myOnError。我们还在同一个 JavaScript 中定义了一个 myOnDisclose 方法,并且在嵌入脚本的最后,它使用这个逻辑将方法分配给容器的 messageHandler:

var msgHandlerObject = new Object();
msgHandlerObject.onMessage = myOnMessage;
msgHandlerObject.onError = myOnError;
msgHandlerObject.onDisclose = myOnDisclose;
msgHandlerObject.myDoc = this;

this.hostContainer.messageHandler = msgHandlerObject;

非常感谢!

【问题讨论】:

为什么你认为PDF应该有postMessage函数?您能否发布导致错误的代码? PDF 是他们自己的沙箱 “在浏览器中显示表单”是应用程序中的嵌入式浏览器还是外部浏览器。它是什么浏览器?铬合金?铬? IE?火狐? 以上主要问题中的回复 【参考方案1】:

好吧,我不知道如何解释它,但似乎可以将方法“postMessage”未定义。事实证明,回调不起作用的原因是我正在更改它调用的脚本如何嵌入 PDF 服务器端,并且不再正确嵌入它们。当我修复它时,一切正常,尽管 postMessage 仍未定义,所以我不确定它为什么/如何工作。

【讨论】:

以上是关于PDF postMessage 未定义的主要内容,如果未能解决你的问题,请参考以下文章

postMessage 未推入 dataLayer

wps转为pdf出现未定义书签

vue-pdf 无法加载到所有页面“未定义的属性”

MFC发送自定义消息-PostMessage和SendMessage

用PostMessage函数向窗体发送鼠标单击消息,单击的X坐标=100 ,y坐标=200.该窗体的句柄为hand。代码怎么写

MFC PostMessage SendMessage