IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

PDF.js dans un template HTML


Sujet :

JavaScript

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Django
    Inscrit en
    Novembre 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Django

    Informations forums :
    Inscription : Novembre 2016
    Messages : 18
    Points : 35
    Points
    35
    Par défaut PDF.js dans un template HTML
    Bonjour tout le monde,

    Je me permets de poser ma question ici car je bloque sr mon problème depuis maintenant plusieurs jours sans pouvoir trouver une quelconque solution.
    Je développe un projet sous Django et je rencontre une difficulté à faire fonctionner un petit script JS dans un template HTML.

    Objectif :

    J'affiche un tableau de publications avec une publication (objet) par ligne disposant de différentes informations : format, langue, titre.
    A la fin de chaque ligne, je souhaite également insérer une "preview" de la première page pour chaque publication.
    J'utilise donc la librairie PDF.js afin d'effectuer cette tâche.
    L'idéal serait de pouvoir passer la souris sur une icone et d'afficher dans une petite fenêtre de type popup la prévisualisation de la première page de chaque publication.

    Ce que j'obtiens actuellement :

    Actuellement, j'arrive à afficher la première page d'un PDF, mais en définissant une URL fixe pointant vers un unique PDF.
    Je n'arrive pas à boucler sur chaque PDF pour afficher la première page de chaque publication.
    Pour ce faire je dois mêler mes variables Django avec le code Javascript et c'est là que ça coince.

    Voici mon code HTML :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    {% for category in category_list %}
            <div class="panel-group accordion" id="accordion_{{ category.id }}" role="tablist" aria-multiselectable="true">
              <div class="panel panel-default">
                <div class="panel-heading" role="tab">
                  <h4 class="panel-title">
                    <a data-toggle="collapse" data-parent="#accordion_{{ category.id }}"
                       href="#collapseOne_{{ category.id }}" aria-expanded="true" aria-controls="collapseOne">
                      <i class="more-less glyphicon glyphicon-plus"></i>
                      {{ category }}
                      {% for publication in category.publication.all %}
                        {% for document in publication.documents.all %}
                          {% if document.publication.new_publication == True %}
                            <span class="glyphicon glyphicon-flag"></span>
                          {% endif %}
                        {% endfor %}
                      {% endfor %}
                    </a>
                  </h4>
                </div>
                  <div id="collapseOne_{{ category.id }}" class="panel-collapse collapse" role="tabpanel"
                       aria-labelledby="#accordion_{{ category.id }}">
                    {% for publication in category.publication.all %}
                    <div class="panel panel-default subpanel">
                      <b>{{ publication }}</b>
                      {% for document in publication.documents.all %}
                        {% if document.publication.new_publication == True %}
                          <span class="glyphicon glyphicon-flag"></span>
                        {% endif %}
                      {% endfor %}
                    <div class="panel-body">
                      {% for document in publication.documents.all %}
                        <table class="table table-condensed">
                          <tbody>
                          <tr>
                            <td class="col-md-1">
                              <input type="checkbox" class="fakeRadio" name="DocumentChoice" value="{{ document.id }}"></td>
                            <td class="col-md-1">
                              {% if document.format == 'pdf' %}
                                <span class="badge alert-danger">{{ document.format }}</span>
                              {% endif %}
                              {% if document.format == 'epub' %}
                                <span class="badge alert-info">{{ document.format }}</span>
                              {% endif %}
                            </td>
                            <td class="col-md-1"> {{ document.language }}</td>
                            <td class="col-md-1"> <i>{{ document.title }}</i></td>
                            <td class="col-md-1">
                              {% if document.publication.new_publication == True %}
                                <span class="glyphicon glyphicon-flag"></span>
                              {% else %}
                                <span></span>
                              {% endif %}
                            </td>
                            <td class="col-md-1">
                              <canvas id="test{{ document.id }}" style="border:1px solid #000000;"></canvas>
                            </td>
                          </tr>
                          </tbody>
                        </table>
                      {% endfor %}
                    </div>
                    </div>
                    {% endfor %}
                  </div>
              </div>
            </div>
          {% endfor %}

    La partie qui m'intéresse se trouve ici :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    {% for document in publication.documents.all %}
                        <table class="table table-condensed">
                          <tbody>
                          <tr>
                            <td class="col-md-1">
                              <input type="checkbox" class="fakeRadio" name="DocumentChoice" value="{{ document.id }}"></td>
                            <td class="col-md-1">
                              {% if document.format == 'pdf' %}
                                <span class="badge alert-danger">{{ document.format }}</span>
                              {% endif %}
                              {% if document.format == 'epub' %}
                                <span class="badge alert-info">{{ document.format }}</span>
                              {% endif %}
                            </td>
                            <td class="col-md-1"> {{ document.language }}</td>
                            <td class="col-md-1"> <i>{{ document.title }}</i></td>
                            <td class="col-md-1">
                              {% if document.publication.new_publication == True %}
                                <span class="glyphicon glyphicon-flag"></span>
                              {% else %}
                                <span></span>
                              {% endif %}
                            </td>
                            <td class="col-md-1">
                              <canvas id="test{{ document.id }}" style="border:1px solid #000000;"></canvas>
                            </td>
                          </tr>
                          </tbody>
                        </table>
                      {% endfor %}

    Avec le canvas à la fin du code. Ce canvas doit permettre d'afficher mon PDF pour chaque publication.

    Avec cela j'ai un petit script javascript qui est écrit de la façon suivante :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
      <script src="https://mozilla.github.io/pdf.js/build/pdf.js"></script>
     
    <script type="text/javascript">
      var document_upload = "{{ document.upload }}";
      pdfjsLib.getDocument('http://localhost:8000/media/'+document_upload).then(function (pdf) {
        console.log("pdf loaded");
        pdf.getPage(1).then(function (page) {
            var scale = 0.30;
            var viewport = page.getViewport(scale);
     
            var canvases = document.getElementsByTagName('canvas');
            Array.from(canvases).forEach((canvas) => {
                var context = canvas.getContext('2d');
                canvas.height = viewport.height;
                canvas.width = viewport.width;
     
                var renderContext = {
                    canvasContext: context,
                    viewport: viewport
                };
                page.render(renderContext);
            });
        });
      });
      </script>

    Néanmoins, rien ne s'affiche pour le moment et je pense qu'il y a un problème avec la variable que je récupère ?
    Comment l'intégrer au code JS ?

    Merci d'avance


    EDIT :

    Peut-être quelques pistes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var document_upload = {{ document.upload }}
    Cela me retourne : Undefined

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var document_upload = "{{ document.upload }}";
    Cela retourne un "blank"

    J'affiche le code avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    console.log(document_upload);

  2. #2
    Membre expert
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 387
    Points : 3 535
    Points
    3 535
    Billets dans le blog
    1
    Par défaut
    Bonjour Andromedae93.

    La variable document de Django est accessible uniquement à l'intérieur de ta boucle {% for document in publication.documents.all %}

    à mon sens il faudrait que tu places dans ta boucle, une div avec une propriété data-upload="{{document.upload}}"

    ensuite dans le JavaScript, faire une boucle sur tout les documents et récupérer cette variable avec la propriété "data-upload".

    J'espère que ça pourra vous donner des pistes pour avancer.
    Consultant et développeur full-stack spécialiste du Web
    faq jQuery - règles du forum - faqs web

Discussions similaires

  1. afficher pdf volumineux dans page html
    Par Barny dans le forum Langage
    Réponses: 3
    Dernier message: 10/06/2008, 18h37
  2. Afficher un flux PDF dans une page HTML
    Par dachu dans le forum Général Conception Web
    Réponses: 3
    Dernier message: 21/04/2008, 11h55
  3. Inserer un Lien ".pdf" dans un page HTML
    Par Bib0ucH dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 13/12/2007, 13h40
  4. Affichage PDF dans une fenêtre HTML
    Par gbarbier dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 28/08/2007, 15h20
  5. Affichage d'un flux pdf dans une page html
    Par NizarK dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 27/03/2007, 08h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo