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 文件

错误:PDFDocument:流必须有数据

xpages getDocument().getUniversalID()

GetDocument()使用

PDF.js 在固定宽度上缩放 PDF

Swift 和 Cloud Firestore 事务 - getDocuments?