Мне нужно построить PDF с изображениями. Я думал, что можно предоставить ссылки на локально хранимые файлы, но (пожалуйста, поправьте меня, я был бы так счастлив), оказалось, что PDFmake может работать только с данными: кодированные изображения URI.
Итак, теперь мне нужно преобразовать изображения, НО они должны быть загружены первыми, иначе я ничего не делаю.Словарь отложенных обещаний
Идея в том, что код PDF Здание введено в скобки
$.when.apply(null, imgData).done(function() { });
AFAIK, изображения могут быть загружены в случайном порядке, поэтому для предотвращения баловаться их порядок, я положил их в словарь, где ключ к каждому значению является индекс от intital imgSource массив.
Теперь я впервые использовал 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
@zzzzBov отлично, но как я могу быть уверен в том, какой URI этого момента я беру прямо сейчас из результирующего массива?Я с радостью принимаю предложения – mekkanizer
Рассматривая общую проблему, которую вы решаете, вам будет намного лучше загружать изображения и создавать сервер PDF-сервера. Мы делаем это в наших коммерческих приложениях. –