pdf.js 在 getDocument 上失败
Posted
技术标签:
【中文标题】pdf.js 在 getDocument 上失败【英文标题】:pdf.js failing on getDocument 【发布时间】:2015-02-27 17:31:52 【问题描述】: 浏览器:Chrome 环境:grails 应用程序本地主机我正在本地主机上运行 grails 应用程序(我知道 pdf.js 和本地文件系统存在问题),而不是使用文件:我知道会失败的 url '正在传递一个类型化的 javascript 数组,但它仍然失败。正确地说,它只告诉我“警告:设置假工人”。然后它什么也不做。
this.base64ToBinary = function(dataURI)
var BASE64_MARKER = ';base64,';
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;
;
PDFJS.disableWorker = true; // due to CORS
// I convert some base64 data to binary data here which comes back correctly
var data = utilities.base64ToBinary(result);
PDFJS.getDocument(data).then(function (pdf)
//nothing console logs or reaches here
console.log(pdf);
).catch(function(error)
//no error message is logged either
console.log("Error occurred", error);
);
我想知道是不是我没有正确设置它?我可以通过仅包含 pdf.js 来纯粹在客户端使用这个库,还是我也需要包含 viewer.js?而且我注意到兼容性文件...设置不是很清楚,这个例子工作FIDDLE而我的没有,我不明白其中的区别。此外,如果我使用该示例中提供的 url,它也会说同样的话。
【问题讨论】:
实用程序.base64ToBinary 会返回什么?如果它不是 Uint8Array 那么它将不起作用。另外,在then
调用中添加第二个错误回调,这将显示失败的原因。
@async5 我已经编辑了我的问题以包含我用来创建 Uint8Array 的函数,它可以正确创建数组。当我使用小提琴示例中提供的 URL 时也会出现相同的错误,因此发生了其他事情。让我试试错误函数,看看结果如何。
@async5 错误函数的格式是什么?是这样吗? : PDFJS.getDocument(data).then(function()).error(function(data));这似乎不起作用。
PDFJS.getDocument(data).then(function() , function(reason)) -- 详见 Promise 规范
您指定 PDFJS.disableWorker = true; 是否有原因? ?也许出于同样的原因,您必须设置 PDFJS.workerSrc ?
【参考方案1】:
我要回答我自己的问题:
文档根本不清楚。如果您没有将 PDFJS.workerSrc 定义为指向正确的 pdf.worker.js 文件,而不是在 pdf.js 中,它会尝试找出文件的正确 src 路径并加载它。
然而,他们的方法非常粗略:
if (!PDFJS.workerSrc && typeof document !== 'undefined')
// workerSrc is not set -- using last script url to define default location
PDFJS.workerSrc = (function ()
'use strict';
var scriptTagContainer = document.body ||
document.getElementsByTagName('head')[0];
var pdfjsSrc = scriptTagContainer.lastChild.src;
return pdfjsSrc && pdfjsSrc.replace(/\.js$/i, '.worker.js');
)();
他们只抓取头部的最后一个脚本标签,并假设这是加载文件的正确 src,而不是在所有脚本标签中搜索包含“pdf.js”的 src 并将其用作正确的。
相反,他们应该明确并要求您实际上指向 PDFJS.workerSrc = "(your path)/pdf.worker.js"
【讨论】:
我自己也遇到了这个问题。感谢您回答此问题并进行调查!【参考方案2】:这是简短的回答:在代码开头定义 PDFJS.workerSrc。
PDFJS.workerSrc = "(your path)/pdf.worker.js"
请参阅文档中的示例:https://mozilla.github.io/pdf.js/examples/#interactive-examples
【讨论】:
以上是关于pdf.js 在 getDocument 上失败的主要内容,如果未能解决你的问题,请参考以下文章
Pdf.js:使用 base64 文件源而不是 url 呈现 pdf 文件