Я создаю документ PDF с использованием jsPDF , однако мне нужно добавить изображения, представленные в форме, в этот документ.
// You'll need to make your image into a Data URL
// Use http://dataurl.net/#dataurlmaker
var imgData = 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYFBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAg[...]' //snip
[...]
doc.addImage(imgData, 'JPEG', 15, 40, 180, 160)
Однако, как показано в фрагментевыше мне нужно преобразовать файл в DataURI, но я не нашел ни библиотеки, которая делает это, ни надежного способа сделать это с чистым JavaScript.
Я нашел следующий метод, который позволяет мне извлечьDataURI из URL с XMLHttpRequest.
function obtenerDataUri(url, pos, lastpos, isleft)
{
var request = new XMLHttpRequest();
request.open('GET', url, true);
request.responseType = 'blob';
request.onload = function() {
var reader = new FileReader();
reader.readAsDataURL(request.response);
reader.onload = function(e){
var imgData = e.target.result.replace("data:application/xml;", "data:application/png;"), pos, lastpos, isleft;
doc.addImage(imgData, 'PNG', (isleft) ? 15 : 90, (isleft) ? pos : lastpos, 75, 75);
};
};
request.send();
}
Этот метод не работает для меня, потому что он асинхронный, это означает, что я добавляю содержимое в PDF после его полной генерации.Этот метод не работает синхронно, потому что responseType
не поддерживается в синхронных запросах (возможно, из-за устаревания).
Обратите внимание, что эти изображения уже загружены на сервер, когда PDF готов для генерации, поэтомуЯ не могу получить DataURI для локальных файлов.
Эта функция вызывается здесь:
$('#imgArea img').each(function()
{
g_bPDFGisLeft = !g_bPDFGisLeft;
var bPDFGposCheck = true;
while(bPDFGposCheck)
{
var pos = (g_iPDFGpage == 0) ? doc.autoTable.previous.finalY+8+(75*g_iPDFGimg) : (75*g_iPDFGimg);
if((pos+(75*(g_iPDFGimg+1))) >= 300)
{
doc.addPage();
g_iPDFGimg = 0;
g_iPDFGpage++;
bPDFGposCheck = true;
}
else
bPDFGposCheck = false;
}
obtenerDataUri($(this).attr('src'), pos, g_fPDFGlastPos, g_bPDFGisLeft);
g_fPDFGlastPos = pos;
if(!g_bPDFGisLeft)
g_iPDFGimg++;
});
После выполнения obtenerDataUri
, поскольку он выполняет запрос, не будетдождитесь завершения функции onload
.Это означает, что генератор PDF будет продолжать добавлять страницы и асинхронно размещать изображения на неправильных страницах.
Как получить DataURI синхронно из изображений URL?
Я ценю любую помощь сЭта проблема.Пожалуйста, скажите мне, если вам нужно больше подробностей об этом.