我知道一个类似的问题:Pdf.js: rendering a pdf file using a base64 file source instead of url。 Codetoffel很好地回答了这个问题,但我的问题不同之处在于我的PDF是通过对我的Web API实现的RESTful调用来检索的。让我解释一下......
首先,这是使用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允许我用一个DocumentInitParams
对象替换在PDFJS.getDocument方法(上面)中将URL作为字符串传递,该对象定义为here。使用DocumentInitParams对象的工作方式如下:
var docInitParams = {
url: "/api/path/to/my.pdf",
httpHeaders: getSecurityHeaders(), //as needed
withCredentials: true
};
PDFJS.getDocument(docInitParams).then(function (pdf) {
...
});
这也有效,但它可以通过要求我构建api URL来解决我的Angular $resource
。但这没关系因为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
方法将数据作为blob
或arraybuffer
返回但不起作用。我试图将arraybuffer返回的数据转换为Uint8Array
,但无济于事。
我不确定还有什么可以尝试并且真的可以使用小费。
如何从我的服务返回数据以使用PDFJS?
提前致谢。
答案 0 :(得分:19)
您没有将响应数据传递给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) {
// ...
});
});