Wenn ich Ihr Problem gut verstehe, könnte ich eine Lösung haben. Wenn ich zu schnell auf die Schaltflächen vorherigen oder nächsten geklickt hatte, hatte die Leinwand nicht die Zeit zum Aktualisieren, und zwei (oder mehr) Seiten wurden gezeichnet, es war nicht lesbar.
das Problem zu lösen, verwende ich den folgenden Code:
var stop = false;
function goPrevious() {
if (pageNum > 1 && !stop)
{
stop = true;
pageNum--;
renderPage(pageNum);
}
}
function goNext() {
if (pageNum < pdfDoc.numPages && !stop)
{
stop = true;
pageNum++;
renderPage(pageNum);
}
}
ich auch die Render-Funktion in der Pdf.js Datei geändert haben:
render: function PDFPageProxy_render(params) {
this.renderInProgress = true;
var promise = new Promise();
var stats = this.stats;
stats.time('Overall');
// If there is no displayReadyPromise yet, then the operatorList was never
// requested before. Make the request and create the promise.
if (!this.displayReadyPromise) {
this.displayReadyPromise = new Promise();
this.destroyed = false;
this.stats.time('Page Request');
this.transport.messageHandler.send('RenderPageRequest', {
pageIndex: this.pageNumber - 1
});
}
var self = this;
function complete(error) {
self.renderInProgress = false;
stop = false;
if (self.destroyed || self.cleanupAfterRender) {
delete self.displayReadyPromise;
delete self.operatorList;
self.objs.clear();
}
if (error)
promise.reject(error);
else
promise.resolve();
}
var continueCallback = params.continueCallback;
//etc.
(in meiner Pdf.js Datei , dies ist zwischen den Zeilen 2563 und 2596).
Als Ergebnis wird keine neue Seite gezeichnet, bis die vorherige Seite vollständig gezeichnet wurde, selbst wenn Sie sehr schnell auf die vorherigen/nächsten Schaltflächen klicken!
Eine andere Lösung, die die vorherige Zeichnung könnte abbrechen:
function renderPage(num) {
pdfDoc.getPage(num).then(function(page) {
// canvas resize
viewport = page.getViewport(ratio);
canvas.height = viewport.height;
canvas.width = viewport.width;
// draw the page into the canvas
var pageTimestamp = new Date().getTime();
timestamp = pageTimestamp;
var renderContext = {
canvasContext: ctx,
viewport: viewport,
continueCallback: function(cont) {
if(timestamp != pageTimestamp) {
return;
}
cont();
}
};
page.render(renderContext);
// update page numbers
document.getElementById('page_num').textContent = pageNum;
document.getElementById('page_count').textContent = pdfDoc.numPages;
});
}
ich es Ihnen helfen, hoffen, und sorry für mein Englisch;) einen schönen Tag
Ich habe dies versucht, und es schien, besser zu arbeiten als zuvor, aber immer noch ich die Frage stellen, während ein zu fast.I klicken weiß nicht, ob Sie konfrontiert sind es auch. Ich wünschte, ich könnte die Tasten deaktivieren, bis die Zeichenfläche vollständig geladen wurde, habe ich versucht mit window.onload(), hat nicht funktioniert, wie Leinwand dauert länger zum Laden. Die komplette viewer.html von pdf.js hat die Haltefunktion, kann aber nicht herausfinden, wie sie es gemacht hat. – sss
Ich habe nur Ihre erste Lösung ausprobiert, lassen Sie mich die zweite auschecken. Vielen Dank für Ihre Mühe und Ihr Englisch ist großartig. :) – sss
Ich habe versucht, die vorherige Zeichnung abzubrechen, jedoch timestamp = pageTimestamp; gab einen Fehler Timestamp, der undefiniert ist, so änderte ich Code zu var timestamp = pageTimestamp; und jetzt kommt es nie in die Bedingung if (timestamp! = pageTimestamp), da sie immer gleich sind. Was mache ich falsch ? Nochmals vielen Dank im Voraus. :) – sss