是否有一种简单的方法可以从网址获取图片以放入PDFKit pdf?
我在浏览器中自动生成PDF。我想要包含一个图像,我有一个URL。问题在于我在浏览器中生成PDF。由于我有从互联网上获得的URL,似乎应该有一种简单的方法将该图像转换为PDFKit可读的内容。
Javascript是否有办法将图片网址转换为PDFKit可读的缓冲区?
我想要的是您希望执行以下命令:
doc.image('http://upload.wikimedia.org/wikipedia/commons/0/0c/Cow_female_black_white.jpg')
提前致谢。我在网上找到的解决方案让您的服务器接收链接,并使用缓冲区进行响应。这是唯一的方法吗?或者有没有一种方式在浏览器中没有http发布?
答案 0 :(得分:3)
我通过AJAX检索图像作为base64编码的字符串,然后使用以下代码将base64编码的字符串转换为可用的缓冲区:
var data = atob(base64);
var buffer = [];
for (var i = 0; i < data.length; ++i)
buffer.push(data.charCodeAt(i));
buffer._isBuffer = true;
buffer.readUInt16BE = function(offset, noAssert) {
var len = this.length;
if (offset >= len) return;
var val = this[offset] << 8;
if (offset + 1 < len)
val |= this[offset + 1];
return val;
};
pdf.image(buffer);
另请参阅https://github.com/devongovett/pdfkit/issues/354#issuecomment-68666894,其中讨论的相同问题适用于字体。
答案 1 :(得分:2)
这是一个非常古老的问题,但我会添加我的笔记,因为它是寻找&#34; pdfkit浏览器图像时的第一个建议&#34;在Google上。
我的解决方案基于数据uri选项supported by PDFKit:
使用base64编码数据传递图像路径,缓冲区或数据uri 图像方法以及一些可选参数。
因此,在快速浏览一下后,我发现从图像URL获取数据uri的一般方法是使用canvas like in this post。将它放在PDFKit's interactive browser demo:
中function getDataUri(url, callback) {
var image = new Image();
image.crossOrigin = 'anonymous'
image.onload = function () {
var canvas = document.createElement('canvas');
canvas.width = this.naturalWidth; // or 'width' if you want a special/scaled size
canvas.height = this.naturalHeight; // or 'height' if you want a special/scaled size
canvas.getContext('2d').drawImage(this, 0, 0);
// // Get raw image data
// callback(canvas.toDataURL('image/png').replace(/^data:image\/(png|jpg);base64,/, ''));
// ... or get as Data URI
callback(canvas.toDataURL('image/png'));
};
image.src = url;
}
// Usage
getDataUri('http://pdfkit.org/docs/img/14.png', function(dataUri) {
// create a document and pipe to a blob
var doc = new PDFDocument();
var stream = doc.pipe(blobStream());
doc.image(dataUri, 150, 200, {
width: 300
});
// end and display the document in the iframe to the right
doc.end();
stream.on('finish', function() {
iframe.src = stream.toBlobURL('application/pdf');
});
});
答案 2 :(得分:1)
我使用 NPM 包 axios 来获取 base64 编码的缓冲区:
在项目文件夹上:
npm i axios
代码:
var axios = require('axios');
let image = await axios.get("url", {responseType: 'arraybuffer'});
doc.image(image.data, 12, h, {
width: 570,
align: 'center',
valign: 'center'
});
答案 3 :(得分:0)
我会在这个问题上权衡我的2美分,因为我花了很多时间让它发挥作用。这是我发现谷歌搜索问题的一大堆答案。
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数据的字符串。我希望这有帮助!
以下是大多数xhr代码来自的js fiddle。