当前位置: 首页 > 面试题库 >

PDF.JS:使用ArrayBuffer或Blob而不是URL呈现PDF

焦宏硕
2023-03-14
问题内容

我知道与此类似的问题:Pdf.js:使用base64文件源而不是url呈现pdf文件。Codetoffel很好地回答了这个问题,但是我的问题不同之处在于,通过对我的WebAPI实现的RESTful调用来检索我的PDF。让我解释…

首先,这是使用PDF.JS通过URL打开PDF的基本方法:

PDFJS.getDocument("/api/path/to/my.pdf").then(function (pdf) {
  pdf.getPage(1).then(function (page) {
    var scale = 1;
    var viewport = page.getViewport(scale);
    var canvas = document.getElementById('the-canvas');
    var context = canvas.getContext('2d');
    canvas.height = viewport.height;
    canvas.width = viewport.width;
    page.render({canvasContext: context, viewport: viewport});
  });
});

这很好用,但是我正在使用Angular及其$resource服务通过我的RESTful Web
API来请求PDF。我确实知道PDF.JS允许我将URL作为PDFJS.getDocument方法(上面)中的字符串传递替换为在此处DocumentInitParams定义的对象。使用DocumentInitParams对象的工作方式如下:

var docInitParams = {
    url: "/api/path/to/my.pdf",
    httpHeaders: getSecurityHeaders(), //as needed
    withCredentials: true
};
PDFJS.getDocument(docInitParams).then(function (pdf) {
    ...
});

这也可以,但是$resource通过要求我构造api URL
可以在我的Angular上工作。但这没关系,因为PDFJS允许我直接给它提供PDF数据,而不是给它一个指向PDF的URL,如下所示:

var myPdf = myService.$getPdf({ Id: 123 });

//It's an Angular $resource, so there is a promise to be fulfilled...
myPdf.$promise.then(function() {
    var docInitParams = {
        data: myPdf
    };
    PDFJS.getDocument(docInitParams).then(function (pdf) {
        ...
    });
});

这是我似乎无法开始的工作。我可以告诉该myService.$gtPdf方法以a
blob或as的形式返回数据,arraybuffer但均无效。我试图将arraybuffer返回的数据Uint8Array也转换为太,但无济于事。

我不确定还可以尝试使用小费吗?

如何从服务返回的数据与PDFJS一起使用?

提前致谢。


问题答案:

您不是将响应数据传递给PDF.js,而是资源的一个实例:

var myPdf = myService.$getPdf({ Id: 123 });
myPdf.$promise.then(function() {
    var docInitParams = {
        data: myPdf

您尚未显示的代码$getPdf,但我想它等同于

var myService = $resource('/foo', {}, {$getPdf:{responseType: 'arraybuffer'}});
var myPdf = myService.$getPdf();

默认情况下,AngularJS $resource将响应视为对象(从JSON反序列化)并将任何属性从对象复制到资源实例(myPdf在上一片段中)。

显然,由于您的响应是数组缓冲区(或Blob,类型化数组或其他),因此将无法正常工作。获得所需响应的一种方法是使用transformResponse将响应对象包装在一个对象中:

var myService = $resource('/foo', {}, {
    $getPdf: {
        responseType: 'arraybuffer',
        transformResponse: function(data, headersGetter) {
            // Stores the ArrayBuffer object in a property called "data"
            return { data : data };
        }
    }
});
var myPdf = myService.$getPdf();
myPdf.$promise.then(function() {
    var docInitParams = {
        data: myPdf.data
    };

    PDFJS.getDocument(docInitParams).then(function (pdf) {
        // ...
    });
});

或者只是以下内容(避免了不必要的局部变量):

myService.$getPdf().$promise.then(function(myPdf) {
    PDFJS.getDocument({
        data: myPdf.data
    }).then(function (pdf) {
        // ...
    });
});


 类似资料:
  • 问题内容: 我正在尝试使用pdf.js从pdf渲染页面 通常,使用网址,我可以这样做: 但是在这种情况下,我将文件放在base64中而不是url中: 如何做到这一点? 问题答案: 从http://mozilla.github.com/pdf.js/build/pdf.js的源代码中 因此,使用标准XMLHttpRequest(XHR)来检索文档。问题在于XMLHttpRequests不支持数据:u

  • 问题内容: 我已经尝试在项目中添加pdf.js查看器文件,并且该文件可以在Chrome,Mozilla,Safari等浏览器中使用,但无法在node-webkit和PyQt webkit中加载某些页面。 我正在尝试使用iframe加载文件,如下所示: 问题答案: 我在Qt论坛上找到了这个话题,thebeast44发布了一段Qt代码来回答您的问题。我对python的翻译如下。 您还需要从作者的原始代

  • HttpPost与IP(注释行)完美配合,但不写入相对url,这有什么可能的原因吗? 我可以通过两种方式使用浏览器访问资源。显然,xxx只是为了隐私。 我得到: 发送信号。PID: 15236 SIG: 3 threadid=3:对信号3作出反应< br >将堆栈跟踪写入'/data/anr/traces.txt' 这个日志应该简单地说我正在从UI活动访问互联网,这不应该这样做,好的。但是编写IP

  • 我在另一个帖子上问了一个类似的问题,我得到的答案适用于firefox,但不适用于chrome,因为chrome会阻止弹出窗口。 我试着用一个按钮打开文件,但文件没有重新编辑。

  • 我正在研究Blob,我注意到当你有一个ArrayBuffer时,你可以很容易地将它转换成Blob,如下所示: 我现在的问题是,有没有可能从一团变成一团?

  • ArrayBuffer 对象 ArrayBuffer 对象表示一段二进制数据,用来模拟内存里面的数据。通过这个对象,JavaScript 可以读写二进制数据。这个对象可以看作内存数据的表达。 这个对象是 ES6 才写入标准的,普通的网页编程用不到它,为了教程体系的完整,下面只提供一个简略的介绍,详细介绍请看《ES6 标准入门》里面的章节。 浏览器原生提供ArrayBuffer()构造函数,用来生成