我知道与此类似的问题: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()构造函数,用来生成