【发布时间】:2016-12-08 14:11:22
【问题描述】:
我需要用图像构建 PDF。我认为可以提供指向本地存储文件的链接,但是(请纠正我,我会很高兴)结果证明 PDFmake 只能处理 data:URI 编码的图像。
所以现在我必须转换图像,但必须先加载它们,否则我将转换为空白。
想法是将PDF构建代码放在$.when.apply(null, imgData).done(function() { });的括号中
AFAIK,图像可以随机加载,因此为了防止弄乱它们的顺序,我将它们放入字典中,其中每个值的键是初始 imgSources 数组的索引。
现在,这是我第一次使用Deferred 类和$.when,所以请纠正我的错误用法。
function toDataUrl(src) {
var img = new Image(),
deferred = $.Deferred();
img.crossOrigin = 'Anonymous';
img.onload = function() {
var canvas = document.createElement('CANVAS');
var ctx = canvas.getContext('2d');
var dataURL;
canvas.height = this.height;
canvas.width = this.width;
ctx.drawImage(this, 0, 0);
dataURL = canvas.toDataURL('image/jpeg');
deferred.resolve(dataURL);
};
img.src = src;
return deferred.promise();
}
function makepdf() {
var pdfContent, a = [], b = [], kontent = [],
list = $("#tabs ul>li a"),
imgSources = ['images/weledu.jpg'],
imgData = {};
$.getJSON(get_url+'types.php?id='+$('#type').val(), function (newsrc) {
imgSources.push('images/lamps/'+newsrc.data['0'].image);
$.each(imgSources, function(index, src) {
imgData.index = toDataUrl(src);
});
});
$.when.apply(null, imgData).done(function() {
// pdf creation
});
};
如果我在传递给.done() 的回调中放置一个断点,imgData 对象仍然是空白的!我错在哪里?不是应该完成吗?
【问题讨论】:
-
Function.prototype.apply不应用对象,它应用数组。 -
@zzzzBov 很好,但是我如何确定我现在从结果数组中取出了哪个 imag 的 URI?我很乐意接受建议
-
查看您正在解决的整体问题,您最好上传图像并创建 PDF 服务器端。我们在我们的商业应用中这样做。
-
@GoneCoding 等等。第一件事 - 图像存储在服务器上,没有“上传”。第二件事 - 请更好地解释“服务器端”,我不明白。你的意思是使用 PHP 和它的库来创建 PDF 还是?
-
是的,使用服务器端库来创建 PDF。将它们全部移至客户端浏览器,只是为了处理 PDF,似乎解决这个问题还有很长的路要走,但是嘿,它是 PHP :)
标签: jquery promise jquery-deferred