我终于让PDFView.open
方法起作用了。现在,如果我将查看器嵌入我的页面并像Rob在前两个示例中建议的那样调用打开函数,它就可以工作。
对于那些正在寻找此类解决方案的人,我在这里提供一些代码:
这是我的Lightswitch mainPage.lsml.js中的代码。 js脚本(pdf.js、viewer和Others)在Lightswitch项目的主html页面(Default.html)中引用;我认为它应该可以在任何其他基于html而不是Lightswitch的页面上工作。
myapp.MainPage.ShowPdf_execute = function (screen) {
var blob = new Blob([screen.WebReportsPdfFilesStream.selectedItem.Pdf], { type: "application/pdf;base64" });
var formData = new FormData();
formData.tagName = pdfName;
formData.append(pdfName, blob);
var xhr = new XMLHttpRequest();
var url = "../OpenPdf.aspx";
xhr.open('POST', url, false);
xhr.onload = function (e) {
var response = e.target.response;
var pdfAsArray = convertDataURIToBinary("data:application/pdf;base64, " + response);
var pdfDocument;
PDFJS.getDocument(pdfAsArray).then(function (pdf) {
pdfDocument = pdf;
var url = URL.createObjectURL(blob);
PDFView.load(pdfDocument, 1.5)
})
};
xhr.send(formData);
};
这是convertDataURIToBinary
函数
function convertDataURIToBinary(dataURI) {
var base64Index = dataURI.indexOf(BASE64_MARKER) + BASE64_MARKER.length;
var base64 = dataURI.substring(base64Index);
var raw = window.atob(base64);
var rawLength = raw.length;
var array = new Uint8Array(new ArrayBuffer(rawLength));
for (i = 0; i < rawLength; i++) {
array[i] = raw.charCodeAt(i);
}
return array;
}
仍然缺少的是直接将流传递到
viewer.html
页面的可能性,以便在新窗口中打开并具有单独的ui来进行渲染。由于我得到了一个内部没有文档的空查看器,因此这段代码仍然无法工作。
var blob = new Blob([screen.WebReportsPdfFilesStream.selectedItem.Pdf], { type: "application/pdf;base64" });
var url = URL.createObjectURL(blob);
var viewerUrl = 'Scripts/pdfViewer/web/viewer.html?file=' + encodeURIComponent(url);
window.open(viewerUrl);
看起来encodeURIComponent(url)
没有将一个好的对象传递给查看器以加载到查看器中。
有任何想法或建议吗?
看起来
encodeURIComponent(url)
没有为查看器提供正确的对象进行加载。
有什么想法或建议吗?
$scope
是来自AngularJS的。你需要改变的是无论何时看到$scope
,都要将其变成一个变量。不是函数内部的局部变量,而是在任何函数外部定义一个变量。 - toddmoonload
。因此,PDFViewerApplication
未定义。 - Matt