Javascript 下载 BLOB 为 PDF
Javascript download BLOB as PDF
我正在尝试将 blob 对象转换为 pdf 并下载它。
到目前为止,我已经尝试了以下方法:
var downloadLink = document.createElement('a');
downloadLink.target = '_blank';
downloadLink.download = 'name_to_give_saved_file.pdf';
// convert downloaded data to a Blob
var blob = new Blob([file.$binary], { type: 'application/pdf' });
// create an object URL from the Blob
var URL = window.URL || window.webkitURL;
var downloadUrl = URL.createObjectURL(blob);
// set object URL as the anchor's href
downloadLink.href = downloadUrl;
// append the anchor to document body
document.body.append(downloadLink);
// fire a click event on the anchor
downloadLink.click();
文件大小似乎是正确的,但我看不到它,因为它似乎已损坏。
查看我的 html 文件中的 PDF 是这样的:
$('#test').html('<embed width=100% height=100%'
+ ' type="application/pdf"'
+ ' src="data:application/pdf;base64,'
+ escape(file.$binary)
+ '"></embed>')
这没有任何问题!
现在回答我的问题...为什么一个有效而另一个无效?
感谢您的帮助...
您的 file.$binary
不是二进制数据(即使对象名称是 `$binary)。它实际上是一个 string 包含二进制数据的 base64 表示。
因此,在制作Blob
之前,您需要将字符串转换为二进制数据。
您可以使用以下方法(来自 ):
const b64toBlob = (b64Data, contentType='', sliceSize=512) => {
const byteCharacters = atob(b64Data);
const byteArrays = [];
for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
const slice = byteCharacters.slice(offset, offset + sliceSize);
const byteNumbers = new Array(slice.length);
for (let i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}
const blob = new Blob(byteArrays, {type: contentType});
return blob;
}
那你可以做
var blob = b64toBlob(file.$binary, 'application/pdf');
查看同一问题的其他答案(),有一个更简单的方法:
const b64toBlob = (base64, type = 'application/octet-stream') =>
fetch(`data:${type};base64,${base64}`).then(res => res.blob())
那你还可以
var blob = b64toBlob(file.$binary, 'application/pdf');
我正在尝试将 blob 对象转换为 pdf 并下载它。
到目前为止,我已经尝试了以下方法:
var downloadLink = document.createElement('a');
downloadLink.target = '_blank';
downloadLink.download = 'name_to_give_saved_file.pdf';
// convert downloaded data to a Blob
var blob = new Blob([file.$binary], { type: 'application/pdf' });
// create an object URL from the Blob
var URL = window.URL || window.webkitURL;
var downloadUrl = URL.createObjectURL(blob);
// set object URL as the anchor's href
downloadLink.href = downloadUrl;
// append the anchor to document body
document.body.append(downloadLink);
// fire a click event on the anchor
downloadLink.click();
文件大小似乎是正确的,但我看不到它,因为它似乎已损坏。
查看我的 html 文件中的 PDF 是这样的:
$('#test').html('<embed width=100% height=100%'
+ ' type="application/pdf"'
+ ' src="data:application/pdf;base64,'
+ escape(file.$binary)
+ '"></embed>')
这没有任何问题!
现在回答我的问题...为什么一个有效而另一个无效?
感谢您的帮助...
您的 file.$binary
不是二进制数据(即使对象名称是 `$binary)。它实际上是一个 string 包含二进制数据的 base64 表示。
因此,在制作Blob
之前,您需要将字符串转换为二进制数据。
您可以使用以下方法(来自 ):
const b64toBlob = (b64Data, contentType='', sliceSize=512) => {
const byteCharacters = atob(b64Data);
const byteArrays = [];
for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
const slice = byteCharacters.slice(offset, offset + sliceSize);
const byteNumbers = new Array(slice.length);
for (let i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}
const blob = new Blob(byteArrays, {type: contentType});
return blob;
}
那你可以做
var blob = b64toBlob(file.$binary, 'application/pdf');
查看同一问题的其他答案(),有一个更简单的方法:
const b64toBlob = (base64, type = 'application/octet-stream') =>
fetch(`data:${type};base64,${base64}`).then(res => res.blob())
那你还可以
var blob = b64toBlob(file.$binary, 'application/pdf');