我会权衡在这个问题上我的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