Я использую код в http://jsfiddle.net/epistemex/LUNaJ/Можно ли кэшировать холсты?
PDFJS.disableWorker = true; // due to CORS
var canvas = document.createElement('canvas'), // single off-screen canvas
ctx = canvas.getContext('2d'), // to render to
pages = [],
currentPage = 1,
url = 'http://www.corsproxy.com/www.ohio.edu/technology/training/upload/Java-Script-Reference-Guide.pdf';
PDFJS.getDocument(url).then(function (pdf) {
PROGRESS.max = pdf.numPages; // just for demo
PROGRESS.value = 1; // just for demo
// init parsing of first page
if (currentPage <= pdf.numPages) getPage();
// main entry point/function for loop
function getPage() {
// when promise is returned do as usual
pdf.getPage(currentPage).then(function(page) {
var scale = 1.5;
var viewport = page.getViewport(scale);
canvas.height = viewport.height;
canvas.width = viewport.width;
var renderContext = {
canvasContext: ctx,
viewport: viewport
};
// now, tap into the returned promise from render:
page.render(renderContext).then(function() {
// store compressed image data in array
pages.push(canvas.toDataURL());
if (currentPage < pdf.numPages) {
currentPage++;
PROGRESS.value = currentPage; // just for demo
getPage(); // get next page
}
else {
done(); // call done() when all pages are parsed
}
});
});
}
});
function done() {
// NOTE: Just for demo - correct order is not guaranteed here
// as the drawPage is async. use same method as above to make
// sure the order is correct (not for-loop, but use the callback
// to get next page). To present a single page it won't be
// a problem though... (just use drawPage() directly)
for(var i = 0; i < pages.length; i++) {
drawPage(i, addPage);
}
}
function addPage(img) {
img.style.width = '100px';
img.style.height = '120px';
document.body.appendChild(img);
}
function drawPage(index, callback) {
var img = new Image;
img.onload = function() {
ctx.drawImage(this, 0, 0, ctx.canvas.width, ctx.canvas.height);
callback(this); // invoke callback when we're done
}
img.src = pages[index]; // start loading the data-uri as source
}
для отображения PDF Количество страниц в холст. Проблема заключается в том, что это берет время, если файл PDF имеет большое количество файлов. Можно ли кэшировать/сохранять эти сгенерированные файлы на компьютере пользователя/баусере, чтобы, если он запускает код вторичным временем, ему не нужно создавать их снова, и вместо этого они могут отображаться немедленно.
URL данные не являются «кэшировать» браузером, поскольку загрузка не выполняется. Однако, чтобы избежать двойного вызова toDataURL, вы можете сохранить сгенерированные элементы '' в массиве и извлечь этот массив при втором вызове – Kaiido
В зависимости от размера вы можете сохранить/получить их с помощью 'localStorage' –
@Kaiido, не могли бы вы объяснить, как это можно сделать. – user3741635