我會權衡在這個問題上我的2美分,我只是花了很多時間一個很好的協議得到它的工作。這是我發現用Google搜索這個問題的一系列答案。
var doc = new PDFDocument();
var stream = doc.pipe(blobStream());
var files = {
img1: {
url: 'http://upload.wikimedia.org/wikipedia/commons/0/0c/Cow_female_black_white.jpg',
}
};
在一個地方使用上述對象來存儲PDF中需要的所有圖像和其他文件。
var filesLoaded = 0;
//helper function to get 'files' object with base64 data
function loadedFile(xhr) {
for (var file in files) {
if (files[file].url === xhr.responseURL) {
var unit8 = new Uint8Array(xhr.response);
var raw = String.fromCharCode.apply(null,unit8);
var b64=btoa(raw);
var dataURI="data:image/jpeg;base64,"+b64;
files[file].data = dataURI;
}
}
filesLoaded += 1;
//Only create pdf after all files have been loaded
if (filesLoaded == Object.keys(files).length) {
showPDF();
}
}
//Initiate xhr requests
for (var file in files) {
files[file].xhr = new XMLHttpRequest();
files[file].xhr.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
loadedFile(this);
}
};
files[file].xhr.responseType = 'arraybuffer';
files[file].xhr.open('GET', files[file].url);
files[file].xhr.send(null);
}
function showPDF() {
doc.image(files.img1.data, 100, 200, {fit: [80, 80]});
doc.end()
}
//IFFE that will download pdf on load
var saveData = (function() {
var a = document.createElement("a");
document.body.appendChild(a);
a.style = "display: none";
return function (blob, fileName) {
var url = window.URL.createObjectURL(blob);
a.href = url;
a.download = fileName;
a.click();
window.URL.revokeObjectURL(url);
};
}());
stream.on('finish', function() {
var blob = stream.toBlob('application/pdf');
saveData(blob, 'aa.pdf');
});
我碰到漸漸從arraybuffer
類型使用Base64數據串的信息的最大的問題。我希望這有幫助!
這裏是js fiddle其中大部分xhr代碼來自。
您從中提取圖像的服務器可能需要是您的(相同來源)或需要使用適當的CORS標頭進行響應。 Wikimedia.org確實如此,但大多數服務器不會。如果你需要使用任意的URL,那麼你的服務器將不得不代理圖像。 – josh3736 2014-10-07 17:28:05
這是我的服務器。那麼在那種情況下,有一個簡單的方法可以做到嗎? – 2014-10-07 17:38:08