Cet article a été évalué par des pairs par Vildan Softic. Merci à tous les pairs examinateurs de SitePoint pour avoir obtenu le contenu de SitePoint à son meilleur!
Le traitement des fichiers PDF dans les applications Web a toujours été très délicat. Si vous avez de la chance, vos utilisateurs ont juste besoin de télécharger le fichier. Mais parfois, les utilisateurs ont besoin de plus de fonctionnalités. J'ai eu de la chance dans le passé, mais cette fois, nos utilisateurs ont besoin de l'application pour afficher des documents PDF afin qu'ils puissent enregistrer des métadonnées liées à chaque page. Auparavant, les gens pourraient avoir utilisé des plugins PDF co?teux (tels que Adobe Reader) pour s'exécuter dans le navigateur pour y parvenir. Cependant, après un certain temps et une expérimentation, j'ai trouvé un meilleur moyen d'intégrer une visionneuse PDF dans mon application Web. Aujourd'hui, nous apprendrons à simplifier le traitement PDF à l'aide d'Aurelia et PDF.JS.
Points de base
- Utilisez Aurelia et PDF.js pour créer une visionneuse PDF personnalisée et efficace avec des fonctionnalités telles que la mise à l'échelle et le défilement pour améliorer l'interaction et les performances de l'utilisateur.
- Implémentez la liaison des données bidirectionnelle pour les attributs tels que la page actuelle et le niveau de zoom dans Aurelia, permettant une intégration transparente et des mises à jour dynamiques dans l'application.
- Développer la visionneuse PDF en éléments personnalisés réutilisables Aurelia qui vous permettent d'ajouter plusieurs téléspectateurs à votre application sans conflit.
- Utilisez PDF.js pour traiter le rendu PDF, prendre en charge les opérations asynchrones et le travailleur Web pour désinstaller le traitement et améliorer la vitesse de réponse de l'interface utilisateur.
- résoudre les problèmes de performances potentiels en considérant le défilement virtuel et d'autres optimisations, en particulier pour gérer efficacement les grands documents.
- Explorez la possibilité de convertir une visionneuse PDF personnalisée en un plugin Aurelia pour faciliter l'intégration dans d'autres projets et applications.
Présentation: objectif
Notre objectif aujourd'hui est de construire un composant de la visionneuse PDF dans Aurelia qui permet un flux de données bidirectionnel entre le spectateur et notre application. Nous avons trois exigences principales:
- Nous voulons que les utilisateurs puissent charger des documents, faire défiler et zoomer / sortir avec de bonnes performances.
- Nous voulons pouvoir lier bidirectionnellement les propriétés de la visionneuse (telles que la page actuelle et le niveau de zoom actuel) aux propriétés de l'application.
- Nous voulons que ce spectateur soit un composant réutilisable; nous voulons pouvoir facilement placer plusieurs téléspectateurs dans la demande sans conflit.
Vous pouvez trouver le code de ce tutoriel dans notre référentiel GitHub, ainsi qu'une démo du code terminé ici.
Introduction pdf.js
pdf.js est une bibliothèque JavaScript écrite par la Fondation Mozilla. Il charge des documents PDF, des fichiers d'analyse et des métadonnées connexes, et rend la sortie de la page vers l'élément Dom n?ud (généralement <canvas></canvas>
). La visionneuse par défaut incluse dans le projet prend en charge les téléspectateurs PDF intégrés dans Chrome et Firefox et peut être utilisé comme pages ou ressources autonomes (intégrées dans IFRAMES).
C'est vraiment cool. Le problème ici est que la visionneuse par défaut, bien qu'elle possède de nombreuses fonctionnalités, est con?ue comme une page Web autonome. Cela signifie que même s'il peut être intégré dans une application Web, il doit essentiellement s'exécuter dans un sable IFRAME. La visionneuse par défaut est con?ue pour obtenir une entrée de configuration via sa cha?ne de requête, mais nous ne pouvons pas facilement modifier la configuration après le chargement initial, et nous ne pouvons pas facilement obtenir des informations et des événements de la visionneuse. Afin de l'intégrer à l'application Web Aurelia - y compris la gestion des événements et la liaison bidirectionnelle - nous devons créer un composant personnalisé Aurelia.
Remarque: Si vous avez besoin d'une revue sur PDF.js, veuillez consulter notre tutoriel: rendu PDF personnalisé en JavaScript à l'aide de PDF.js
de Mozilla.implémentation
Pour atteindre notre objectif, nous créerons un élément personnalisé Aurelia. Cependant, nous ne placerons pas la visionneuse par défaut dans nos composants. Au lieu de cela, nous créerons notre propre visionneuse qui se connecte à la bibliothèque PDF.js Core and Viewer afin que nous puissions maximiser le contr?le de nos propriétés et rendements liés. Pour notre preuve de concept initial, nous commencerons par l'application Aurelia Skeleton.
Code Photoscope
Comme vous pouvez le voir sur le lien ci-dessus, l'application Skeleton a de nombreux fichiers, dont beaucoup dont nous n'avons pas besoin. Pour simplifier les opérations, nous avons préparé une version rationalisée du squelette et y a ajouté du contenu:
- Une tache Gulp pour copier nos fichiers PDF dans le dossier DIST (Aurelia est utilisée pour le regroupement).
- La dépendance pdf.js a été ajoutée à package.json.
- Dans le répertoire racine de l'application, index.html et index.css ont subi certains paramètres de style initiaux.
- La copie vide du fichier que nous allons utiliser a été ajoutée.
- Le fichier SRC / Resources / Elements / PDF-Document.css contient certains styles CSS pour les éléments personnalisés.
Alors, faisons fonctionner l'application en cours d'exécution.
Tout d'abord, assurez-vous que Gulp et JSPM sont installés à l'échelle mondiale:
npm install -g gulp jspm
puis clonez le squelette et entrez-y:
git clone git@github.com:sitepoint-editors/aurelia-pdfjs.git -b skeleton cd aurelia-pdfjs
puis installez les dépendances nécessaires:
npm install jspm install -y
Exécutez enfin Gulp Watch et accédez à http: // localhost: 9000. Si tout se passe comme prévu, vous devriez voir un message de bienvenue.
Plus de paramètres
La prochaine chose à faire est de trouver quelques fichiers PDF et de les mettre dans SRC / Documents. Nommez-les un.pdf et deux.pdf. Pour maximiser les tests de nos composants personnalisés, il est préférable que l'un des fichiers PDF soit très long, comme la guerre et la paix qui peuvent être trouvés dans le projet Gutenberg.
Après avoir mis le fichier PDF en place, ouvrez Src / App.html et Src / App.js (comme convenu, le composant de l'application est le composant racine de l'application Aurelia) et remplacez le code par ces deux fichiers Code: src / app.html et src / app.js. Dans ce tutoriel, nous ne discuterons pas de ces fichiers, mais il y a de bons commentaires dans le code.
Gulp détectera automatiquement ces modifications et vous devriez voir notre rendu d'interface utilisateur d'application. C'est le paramètre. Maintenant, commencez à montrer ...
Créer un élément personnalisé Aurelia
Nous voulons créer un composant qui peut être utilisé directement pour n'importe quelle vue Aurelia. étant donné que la vue Aurelia n'est qu'un extrait HTML inclus dans la balise de modèle HTML5, un exemple peut ressembler à ceci:
npm install -g gulp jspmLes balises
<pdf-document>
sont un exemple d'éléments personnalisés. Il et ses propriétés (telles que l'échelle et la page) ne sont pas des propriétés natives de HTML, mais nous pouvons utiliser des éléments personnalisés Aurelia pour le créer. Les éléments personnalisés sont faciles à créer, en utilisant les blocs de construction de base d'Aurelia: vues et vue ViewModel. Par conséquent, nous allons d'abord construire notre ViewModel, nommé PDF-Document.js, comme indiqué ci-dessous:
git clone git@github.com:sitepoint-editors/aurelia-pdfjs.git -b skeleton cd aurelia-pdfjs
Le contenu principal à noter ici est le @bindable
décorateur; Aux attributs connexes, nous placons sur des éléments personnalisés. Cela nous permettra de contr?ler notre visionneuse PDF simplement en modifiant les propriétés de l'élément. defaultBindingMode: bindingMode.twoWay
npm install jspm install -y
(Le contenu suivant est essentiellement cohérent avec le texte d'origine, mais certaines phrases ont été ajustées en détail pour maintenir la ma?trise et la lisibilité et éviter la duplication.)
pdf.js intégrés
pdf.js est divisé en trois parties: bibliothèque principale (traitement de l'analyse et de l'interprétation des documents PDF), de la bibliothèque d'affichage (construire des API disponibles en haut de la couche de base) et du plug-in de la visionneuse Web (pré-construit nous mentionné précédemment). Pour nos besoins, nous utiliserons la bibliothèque de base via l'API d'affichage;Afficher l'API Exporte un objet de bibliothèque nommé PDFJS, qui nous permet de définir certaines variables de configuration et de charger notre document à l'aide de PDFJS.GetDocument (URL). L'API est complètement asynchrone - elle envoie et re?oit des messages au travailleur Web, il s'appuie donc fortement sur JavaScript Promise. Nous utiliserons principalement l'objet PDFDocumentProxy renvoyé de manière asynchrone de la méthode pdfjs.getDocument () et l'objet PDFPageProxy renvoyé de manière asynchrone à partir de pdfDocumentProxy.getPage ().
Bien que la documentation soit un peu clairsemée, PDF.js a quelques exemples de création d'une visionneuse de base, ici et ici. Nous allons construire nos composants personnalisés en fonction de cela.
Intégration des travailleurs Web
pdf.js utilise un travailleur Web pour désinstaller ses taches de rendu. En raison de la fa?on dont les travailleurs du Web s'exécutent dans un environnement de navigateur (ils sont en fait en bac à sable), nous sommes obligés de charger des travailleurs Web en utilisant le chemin de fichier direct vers les fichiers JavaScript au lieu des chargeurs de modules habituels. Heureusement, Aurelia fournit une abstraction de chargeur, nous n'avons donc pas à faire référence à des chemins de fichier statiques (cela peut changer lorsque nous regroupons l'application).Si vous suivez notre version du référentiel, vous avez peut-être installé le package PDFJS-DIST, sinon vous devrez le faire maintenant (par exemple, en utilisant JSPM JSPM Install NPM: PDFJS-DIST@^1.5.391) . Nous injecterons ensuite l'abstraction du chargeur d'Aurelia à l'aide du module d'injection de dépendance d'Aurelia et utiliserons le chargeur pour charger le fichier de travailleur Web dans notre constructeur comme suit:
Page de chargement
La bibliothèque PDF.js gère le chargement, l'analyse et l'affichage des documents PDF. Il a une prise en charge intégrée pour les téléchargements partiels et l'authentification. Tout ce que nous avons à faire est de fournir l'URI du document pertinent.
Le chargement et l'affichage du PDF seront pilotés par notre attribut lié; dans ce cas, ce sera l'attribut URL. Fondamentalement, lorsque l'URL change, l'élément personnalisé doit demander à PDF.js d'émettre une demande au fichier. Nous le ferons dans le gestionnaire URLChanged et apporterons quelques modifications à notre constructeur pour initialiser certaines propriétés et quelques modifications apportées à notre méthode détachée pour nettoyer.
Pour chaque page du document, nous créerons un élément <canvas></canvas>
dans le DOM situé dans un conteneur défilement avec une hauteur fixe. Pour ce faire, nous utiliserons la fonctionnalité de modèle de base d'Aurelia, en utilisant un répéteur. étant donné que chaque page PDF peut avoir sa propre taille et son orientation, nous définirons la largeur et la hauteur de chaque élément de canevas en fonction de la fenêtre de page PDF.
Page de rendu
Maintenant que nous avons chargé les pages, nous devons être en mesure de les rendre aux éléments DOM. Pour ce faire, nous compterons sur la fonctionnalité de rendu de PDF.JS. La bibliothèque PDF.js Viewer a une API asynchrone dédiée aux pages de rendu; leur site Web a un excellent exemple montrant comment créer un objet RenderContext et le transmettre à la méthode de rendu PDF.js. Nous extrassons ce code de l'exemple et l'enroulons dans une fonction de rendu:
Implémentez le défilement
Pour offrir une expérience familière et transparente, nos composants doivent afficher la page comme des parties d'un document entièrement défilable. Nous pouvons le faire en faisant en sorte que notre conteneur ait une hauteur fixe avec un débordement de parchemin, qui peut être réalisé via CSS.
Pour maximiser les performances des grands documents, nous ferons les choses suivantes. Tout d'abord, nous utiliserons TaskQueue d'Aurelia pour modifier le DOM. Deuxièmement, nous suivrons la page que PDF.js a rendu afin qu'il n'ait pas à refaire le travail qu'il a fait. Enfin, nous rendrons la page visible uniquement après que le défilement s'arrête en utilisant le comportement contraignant du débouchement d'Aurelia. Voici comment nous courirons lors du défilement:
Atteindre la mise à l'échelle
Lorsque nous évoluons, nous voulons mettre à jour le niveau de zoom actuel. Nous le ferons dans le gestionnaire de propriétés Scalechanged. Fondamentalement, nous redimensions tous les éléments de la toile pour refléter la nouvelle taille de la fenêtre pour chaque page d'une échelle donnée. Nous renforcerons ensuite ce qui est affiché dans la fenêtre actuelle et redémarrerons la boucle.
Le résultat final
passons en revue nos objectifs:
- Nous voulons que les utilisateurs puissent charger des documents, faire défiler et zoomer / sortir avec de bonnes performances.
- Nous voulons pouvoir lier bidirectionnellement les propriétés de la visionneuse (telles que la page actuelle et le niveau de zoom actuel) aux propriétés de l'application.
- Nous voulons que ce spectateur soit un composant réutilisable; nous voulons pouvoir facilement placer plusieurs téléspectateurs dans la demande sans conflit.
Le code final peut être trouvé dans notre référentiel GitHub, ainsi qu'une démo du code terminé ici. Bien qu'il y ait encore place à l'amélioration, nous avons atteint notre objectif!
(Le contenu suivant est essentiellement cohérent avec le texte d'origine, mais certaines phrases ont été ajustées en détail pour maintenir la ma?trise et la lisibilité et éviter la duplication.)
Analyse post-projet et amélioration
Il y a toujours de la place à l'amélioration. Voici quelques choses que je souhaite mettre à niveau dans PDF Viewer Implémentation:
Créer un plugin
Aurelia fournit un système de plug-in. La conversion de cette preuve de concept en plugin Aurelia en fera une ressource hors utilisation pour toute application Aurelia. Le référentiel Aurelia Github fournit un projet de squelette de plugin qui sera un bon point de départ. De cette fa?on, d'autres peuvent utiliser cette fonctionnalité sans la reconstruire!
optimal
Le traitement des fichiers PDF dans les applications Web a toujours été très délicat. Mais avec les ressources disponibles aujourd'hui, nous pouvons réaliser plus que jamais en combinant les bibliothèques et leurs capacités. Aujourd'hui, nous avons vu un exemple de visionneuse PDF de base - une visionneuse qui peut être étendue avec des fonctionnalités personnalisées, car nous avons un contr?le total sur celui-ci. Les possibilités sont infinies! êtes-vous prêt à construire quelque chose? Veuillez me le faire savoir dans les commentaires ci-dessous.
FAQ (FAQ) à propos des composants de la visionneuse PDF personnalisée Aurelia
(Le contenu suivant est essentiellement cohérent avec le texte d'origine, mais certaines phrases ont été ajustées en détail pour maintenir la ma?trise et la lisibilité et éviter la duplication.)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Il existe trois fa?ons courantes d'initier des demandes HTTP dans Node.js: utilisez des modules intégrés, Axios et Node-Fetch. 1. Utilisez le module HTTP / HTTPS intégré sans dépendances, ce qui convient aux scénarios de base, mais nécessite un traitement manuel de la couture des données et de la surveillance des erreurs, tels que l'utilisation de https.get () pour obtenir des données ou envoyer des demandes de post via .write (); 2.AXIOS est une bibliothèque tierce basée sur la promesse. Il a une syntaxe concise et des fonctions puissantes, prend en charge l'async / attendre, la conversion JSON automatique, l'intercepteur, etc. Il est recommandé de simplifier les opérations de demande asynchrones; 3.Node-Fetch fournit un style similaire à la récupération du navigateur, basé sur la promesse et la syntaxe simple

Les types de données JavaScript sont divisés en types primitifs et types de référence. Les types primitifs incluent la cha?ne, le nombre, le booléen, le nul, un non défini et le symbole. Les valeurs sont immuables et les copies sont copiées lors de l'attribution des valeurs, de sorte qu'elles ne se affectent pas; Les types de référence tels que les objets, les tableaux et les fonctions stockent les adresses de mémoire, et les variables pointant vers le même objet s'afferchent mutuellement. Le typeof et l'instance de OFF peuvent être utilisés pour déterminer les types, mais prêtent attention aux problèmes historiques de typeofnull. Comprendre ces deux types de différences peut aider à écrire un code plus stable et fiable.

Bonjour, développeurs JavaScript! Bienvenue dans JavaScript News de cette semaine! Cette semaine, nous nous concentrerons sur: le différend de marque d'Oracle avec Deno, les nouveaux objets Time JavaScript sont pris en charge par les navigateurs, les mises à jour Google Chrome et certains outils de développeurs puissants. Commen?ons! Le différend de marque d'Oracle avec la tentative de Deno Oracle d'enregistrer une marque "JavaScript" a provoqué la controverse. Ryan Dahl, le créateur de Node.js et Deno, a déposé une pétition pour annuler la marque, et il pense que JavaScript est un niveau ouvert et ne devrait pas être utilisé par Oracle

La promesse est le mécanisme central pour gérer les opérations asynchrones en JavaScript. Comprendre les appels de cha?ne, la gestion des erreurs et les combinants est la clé pour ma?triser leurs applications. 1. L'appel de la cha?ne renvoie une nouvelle promesse à travers. Puis () pour réaliser la concaténation des processus asynchrones. Chaque .then () re?oit le résultat précédent et peut renvoyer une valeur ou une promesse; 2. La gestion des erreurs doit utiliser .catch () pour attraper des exceptions pour éviter les défaillances silencieuses, et peut renvoyer la valeur par défaut dans Catch pour continuer le processus; 3. Combinateurs tels que promesse.all () (réussi avec succès uniquement après tout succès), promesse.race () (le premier achèvement est retourné) et promesse.allsetTled () (en attente de toutes les achèvements)

Cacheapi est un outil fourni par le navigateur pour mettre en cache les demandes de réseau, qui est souvent utilisée en conjonction avec travailleur de service pour améliorer les performances du site Web et l'expérience hors ligne. 1. Il permet aux développeurs de stocker manuellement des ressources telles que des scripts, des feuilles de style, des photos, etc.; 2. Il peut faire correspondre les réponses du cache en fonction des demandes; 3. Il prend en charge la suppression des caches spécifiques ou la nettoyage du cache entier; 4. Il peut mettre en ?uvre des stratégies de priorité de cache ou de priorité de réseau grace à l'écoute des événements Fetch; 5. Il est souvent utilisé pour le support hors ligne, accélérez la vitesse d'accès répétée, préchargement des ressources clés et du contenu de mise à jour des antécédents; 6. Lorsque vous l'utilisez, vous devez faire attention au contr?le de la version du cache, aux restrictions de stockage et à la différence entre le mécanisme de mise en cache HTTP.

La boucle d'événement de JavaScript gère les opérations asynchrones en coordonnant les piles d'appels, les webapis et les files d'attente de taches. 1. La pile d'appels exécute du code synchrone, et lors de la rencontre de taches asynchrones, il est remis à WebAPI pour le traitement; 2. Une fois que le WebAPI a terminé la tache en arrière-plan, il met le rappel dans la file d'attente correspondante (macro tache ou micro tache); 3. La boucle d'événement vérifie si la pile d'appels est vide. S'il est vide, le rappel est retiré de la file d'attente et poussé dans la pile d'appels pour l'exécution; 4. Micro taches (comme Promise. puis) ??prendre la priorité sur les taches macro (telles que Settimeout); 5. Comprendre la boucle d'événements permet d'éviter de bloquer le thread principal et d'optimiser l'ordre d'exécution du code.

Les bulles d'événements se propagent de l'élément cible vers l'extérieur vers le n?ud d'ancêtre, tandis que la capture d'événements se propage de la couche externe vers l'intérieur vers l'élément cible. 1. événements Bubbles: Après avoir cliqué sur l'élément enfant, l'événement déclenche l'auditeur de l'élément parent vers le haut. Par exemple, après avoir cliqué sur le bouton, il sortira d'abord cliqué sur l'enfant, puis parent. 2. Capture d'événement: définissez le troisième paramètre sur true, afin que l'auditeur soit exécuté dans l'étape de capture, tels que le déclenchement de l'écouteur de capture de l'élément parent avant de cliquer sur le bouton. 3. Les utilisations pratiques incluent la gestion unifiée des événements d'éléments enfants, le prétraitement d'interception et l'optimisation des performances. 4. Le flux d'événements DOM est divisé en trois étapes: capture, cible et bulle, et l'écouteur par défaut est exécuté dans l'étape de la bulle.

Dans les tableaux JavaScript, en plus de la carte et du filtre, il existe d'autres méthodes puissantes et rarement utilisées. 1. La réduction peut non seulement résumer, mais également compter, se regrouper, aplatir les tableaux et construire de nouvelles structures; 2. Find et FindIndex sont utilisés pour trouver des éléments ou des index individuels; 3.Il et tout sont utilisés pour déterminer si les conditions existent ou que toutes les personnes se rencontrent; 4.Sort peut être trié mais changera le tableau d'origine; 5. Faites attention à la copie du tableau lorsque vous l'utilisez pour éviter les effets secondaires. Ces méthodes rendent le code plus concis et efficace.
