Pdf.js: Rappel lorsque le rendu du PDF est terminé ?

Créé le 30 déc. 2014  ·  17Commentaires  ·  Source: mozilla/pdf.js

J'ai besoin de rendre un dégradé pour couvrir la moitié inférieure du PDF rendu. Je travaille pour un journal et nous faisons une application qui montre le journal avec un teaser avant de s'abonner.

Le problème est que le dégradé doit être peint au-dessus du PDF, il doit donc attendre que le rendu du PDF soit terminé. En fait, sur les navigateurs mobiles, la tentative de rendu en dégradé avant la fin du PDF entraîne un comportement extrêmement sauvage (le canevas se restitue et clignote à chaque fois que la page défile même un peu), ce qui entraîne des repeints constants et le contenu sera rendu à l'envers. parfois.

Donc, tout simplement, j'ai besoin d'exécuter un rappel lorsque le PDF a terminé le rendu.

Pouvez-vous prendre en charge les rappels ? Ou envoyer un événement lorsque le rendu est terminé ?

Commentaire le plus utile

L'utilisation de l'événement textlayerrendered fonctionne pour moi :

document.addEventListener('textlayerrendered', function (e) {
  if (e.detail.pageNumber === PDFViewerApplication.page) {
    // finished rendering
  }
}, true);

Tous les 17 commentaires

Nous avons l'événement 'pagerendered' ou render() renvoie la promesse. La visionneuse générique ne rend jamais toutes les pages, donc cela ne pourra pas être corrigé pour la visionneuse, à moins que nous n'introduisions un mode pour l'objet PDFViewer lorsqu'il rend toutes les pages.

Ok, donc un événement 'pagerendered' est déclenché à partir de quel objet ? @yurydelendik

Voir https://github.com/mozilla/pdf.js/blob/master/web/pdf_viewer.js#L225 et un exemple d'utilisation sur https://github.com/mozilla/pdf.js/blob/master/web /viewer.js#L1733

Veuillez noter que nous n'avons pas d'API pour la visionneuse. La seule API que nous avons publiée concerne le rendu du noyau et du canevas (voir src/display/api.js).

@yurydelendik Je l'utilise avec canvas, dans le navigateur. Je suis un peu confus quant aux autres endroits où PDF JS est même pertinent. Cela m'a tout de suite dérouté, mais de toute façon, on dirait que vous avez ce que je cherche. Merci beaucoup!

Fermeture comme résolu.

J'ai du mal à saisir cet événement.

J'écoute (Jquery) l'événement pagerendered comme indiqué dans les documents ci-dessus :

$(document).bind('pagerendered', function (e) {
    console.log('Page rendering complete.');
    //do stuff
});

et rendre le PDF sur toile :

PDFJS.getDocument('my_file.pdf').then(function(pdf) {
    pdf.getPage(1).then(function(page) {
        /* .. snip .. */
        var scaledViewport = page.getViewport(scale);
        var canvas = document.getElementById('the-canvas');
        var context = canvas.getContext('2d');
        canvas.height = scaledViewport.height;
        canvas.width = scaledViewport.width;
        var renderContext = {
            canvasContext : context,
            viewport : scaledViewport
        };
        page.render(renderContext);
});

Le déclenchement de l'événement moi-même fonctionne avec succès, donc mon écouteur est configuré correctement et est attaché bien avant que page.render(renderContext) ne soit appelé.

J'ai peut-être mal compris le déclencheur de l'événement. Quand exactement l'événement pagerendered doit-il être déclenché à partir du document ?

@yurydelendik

Si vous n'utilisez pas le visualiseur générique, l'événement ne sera pas déclenché. Désolé, je ne comprends pas ce que vous demandez.

Voir https://github.com/mozilla/pdf.js/blob/master/examples/learning/prevnext.html#L76 pour voir comment attendre la fin du rendu. jQuery sera moins utile ici, essayez d'apprendre à utiliser Promises.

@yurydelendik Je comprends maintenant, merci beaucoup pour votre temps !

L'utilisation de l'événement textlayerrendered fonctionne pour moi :

document.addEventListener('textlayerrendered', function (e) {
  if (e.detail.pageNumber === PDFViewerApplication.page) {
    // finished rendering
  }
}, true);

En utilisant votre extrait ci-dessus, vous feriez simplement :

page.render(renderContext).then(function() {
  console.log("FINISHED RENDERING!");
}, function() {
  console.log("ERROR");
});

@brendandahl merci)

Merci @lucdetellis ! J'ai essayé de faire en sorte qu'un bouton externe à la visionneuse déclenche la fonctionnalité d'impression, mais cela ne fonctionnerait jamais en raison de l'erreur indiquée. L'utilisation de votre solution à l'intérieur d'une fonction m'a permis de déclencher cette fonction à partir du cadre parent, puis window.focus() et window.print() une fois le rendu terminé, et BAM, problème résolu. Je cherchais partout une solution à ce sujet :)

document.addEventListener('textlayerrendered', function (e) {
  if (e.detail.pageNumber === PDFViewerApplication.page) {
    // finished rendering
  }
}, true);

N'est jamais appelé pour moi...

Je l'appelle ainsi (à la fin viewer.js ):

document.addEventListener('textlayerrendered', function (e) {
      console.log("textlayerrendered event called!");
    if (e.detail.pageNumber === PDFViewerApplication.page) {
    // finished rendering
      console.log("FINISHED RENDERING!");
      Android.makeWebViewVisible();
     } else {
     console.log("NOT DONE RENDERING!");
     }
}, true);

document.addEventListener('DOMContentLoaded', webViewerLoad, true);

Veuillez pardonner mon ignorance de javascript, je suis un développeur Android qui essaie d'obtenir des rappels js pour la fin du rendu du PDF car je rencontre des problèmes spécifiques à Android... Toute aide serait grandement appréciée.

Mis à jour:
Le problème était que la visibilité de mon Android WebView n'était pas définie sur VISIBLE , donc aucun des événements JS n'était déclenché.

En utilisant la visionneuse fournie avec pdf.js, l'événement pagesloaded a fonctionné pour moi (j'ouvre la boîte de dialogue d'impression dès qu'elle est chargée):

document.addEventListener('pagesloaded', function (e) {
    window.print();
}, true);

@turquoise-turtle avez-vous attaché l'événement Listener au document principal ou à l'iframe où vous avez le visualiseur ?

var iframe = document.getElementById('iframe').contentDocument;

                            iframe.addEventListener('pagesloaded', function (e) {
                                alert("loaded");
                            }, true);

je fais ça et ça n'a pas l'air de marcher

set "eventBusDispatchToDOM": true dans viewer.js pourquoi personne ne le dit !

Il semble que la valeur par défaut ait été modifiée pour ne pas envoyer d'événements au DOM entre août et septembre, en regardant # 10019

Cette page vous a été utile?
0 / 5 - 0 notes