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

Interfaces Graphiques en Java Discussion :

Un browser embarqué lisant les PDF


Sujet :

Interfaces Graphiques en Java

  1. #1
    Membre à l'essai
    Un browser embarqué lisant les PDF
    Bonjour à tous,
    Ce post est la suite du post https://www.developpez.net/forums/d2...fichier-local/ .
    Je suis toujours sur mon projet de faire un écran de veille qui affiche un site internet.
    Petite modification cependant, j'ai réussi à faire en sorte que je n'appel plus un fichier local incluant un script et d'autres infos mais j'appel une page du style "www.toto.com/id", donc plus de problème de cookie en local.
    Tout va pour le mieux dans le meilleur des mondes jusqu'à ce que je navigue sur les différents spots de pub envoyés : une vidéo se lance pour chaque page (pas de problème) et certains spots inclus des boutons pour visualiser notamment les mentions légales. Or, cette page affiche juste un document PDF dans un iframe je pense.

    Mon problème est que le WebView de JavaFx ne possède pas de module PDF et je n'ai rien trouvé sur comment lui en ajouter un.
    J'ai trouvé comment afficher un document PDF via PDF.js mais il me semble que cela ne peut se faire que si on mets à dispo une page, pas quand on l'appel :
    -si je mets à dispo une page a.html qui embarque un pdf, je peux choisir d'afficher ce document via le reader en js.
    -par contre, si j'appel une adresse mais que le créateur n'a rien fait de spécial, il n'y a pas moyen de signaler au browser d'utiliser ce reader.

    Bref je suis encore une fois bloqué avec cette fonctionnalité et je commence à penser que créateur d'écran de veille est un vrai métier.
    Au secours !!!

  2. #2
    Modérateur

    Salut,


    Tu pourrais simplement, comme tu as fait pour ton mini serveur web pour les pages locale, faire un proxy, ou utiliser ce serveur web, pour transformer les liens vers pdf en une page qui affiche le pdf via pdf.js, ou patcher les liens.

    Il me semble que viewerjs le fait tout seul, en modifiant juste le lien (on ne passe pas par du js pour ouvrir le pdf). Il te suffirait donc de patcher les href <a> (par un script dans la page, ou en Java dans le proxy via JSoup).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre extrêmement actif
    Bonjour,

    il faut éventuellement considérer l'utilisation d'un vrai client web comme moteur de rendu dans ton application, comme Chromium si les suggestions précédentes ne marchent pas.
    https://medium.com/@daniel.bischoff/...f-72f67a677db6

    Cordialement
    La joie de l'âme est dans la planification -- Louis Hubert Liautey

  4. #4
    Rédacteur/Modérateur

    Voir Displaying pdf in JavaFX sur StackOverflow qui offre divers solutions dont une reposant sur pdf.js.

    EDIT - si on extrait le contenu de la distribution du viewer dans un package webview.pdf (sans modifier l'arborescence du contenu), on peut charger la visionneuse avec le PDF d'exemple fourni via le code suivant :

    Code :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
    package webview.pdf;
     
    import javafx.application.Application;
    import javafx.application.Platform;
    import javafx.scene.Scene;
    import javafx.scene.layout.StackPane;
    import javafx.scene.web.WebView;
    import javafx.stage.Stage;
     
    import java.net.URL;
    import java.util.Optional;
     
    public final class Main extends Application {
        public static void main(String... args) {
            launch(args);
        }
     
        private WebView webView;
     
        @Override
        public void start(final Stage stage) throws Exception {
            webView = new WebView();
            final var root = new StackPane(webView);
            root.setPrefSize(600, 600);
            final var scene = new Scene(root);
            stage.setTitle("Test");
            stage.setScene(scene);
            stage.show();
            Platform.runLater(this::loadViewer);
        }
     
        private void loadViewer() {
            Optional.ofNullable(getClass().getResource("web/viewer.html"))
                    .map(URL::toExternalForm)
                    .ifPresent(webView.getEngine()::load);
        }
    }
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Membre à l'essai
    Bon déjà désolé de ne pas vous avoir répondu mais j'ai été très occupé ces derniers temps.
    Merci pour vos trois réponses.

    @joel.drigo Ta solution me semble correcte en théorie. Par contre, pour la mettre en pratique, ça me semble complexe : jamais fait de proxy et je ne maîtrise pas vraiment ce fonctionnement.

    @ddoumeche J'y ai déjà pensé et j'ai réussi à intégrer Chromium en remplacement de WebView. Par contre, rien ne fonctionne sauf les PDF : les vidéos ne se lisent pas, les liens sont cassés ... Ce n'est pas vraiment plus efficace du coup ^^. De plus, JCEF (de mémoire c'est bien celui-là que j'ai intégré) est extrêmement compliqué à mettre en place.

    @bouye La solution me parait OK mais il y a un problème : le runlater charge le loader après le chargement de la page. Or cette dernière ne contient pas forcément des PDF, c'est bien ça le problème. Donc au chargement, à la place d'une vidéo, j'ai un loader pdf vide ^^.

    Bon je chipote car en fait, ce qu'il me faut c'est un mixe des solutions de joel.drigo et de bouye : interpréter le code de la page pour trapper le chargement d'un PDF et intégrer le viewer.html à la place. Pour ce faire, je vais regarder du coté des proxy comme indiqué plus haut. Je vais tacher de trouver des tutos et si je n'y arrive pas, je regarderais avec les evenements du genre VIEWER_NOT_FOUND ou autre.

  6. #6
    Modérateur

    Quand je parle de proxy, c'est simplement un serveur intermédiaire par lequel toutes tes requêtes locales vont passer, ce qui va te permettre d'en patcher le contenu.
    Au lieu d'attaquer une url directement, elle passe par cette application qui va faire la requête réelle (appeler l'URL réelle) récupérer le résultat, le parser, le patcher et l'envoyer en réponse de la requête du navigateur. Ce qui veut dire évidemment en théorie de patcher tous les "chemins" : url dans le html, dans les headers, les css, etc, pour que le navigateur passe toujours par le proxy, pour que tout soit patché. Mais tu peux procéder partiellement : le but c'est surtout d'intercepter du html qui contient des balise <a> qui contiennent des liens vers des pdf, de manière à quand on clicke sur le lien dans le navigateur, ou qu'il y ait un traitement qui provoque le lancement de ce lien, ça affiche un viewer.js au lieu de passer par le renderer natif du navigateur.

    Mais il y a peut être une solution beaucoup plus simple, mais non Java : faire un plugin pour le navigateur qui fait cette interception dans le navigateur, à la source, pour rediriger les requêtes directes de pdf vers une page qui prend une url de pdf en paramètre et appel pdf.js ou viewer.js au choix. C'est un domaine que je connais que vaguement mais ça doit être possible.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Rédacteur/Modérateur

    @Jbwils Quelle video ? Ceci est l'exemple fonctionnel de base qui charge le PDF fourni dans la distribution de viewer.js. Il va de soit que si tu veux charger un PDF lambda quelconque tu dois faire des aménagements de code ce qui inclus entre autre :
    • Éviter le chargement du fichier par défaut (son nom est hardcodé dans les paramètres par défaut dans viewer.js il me semble)
    • Localiser la fonction JavaScript qui permet de charger le fichier.
    • Installer un pont entre Java et Javascript
    • Rajouter le code Java permettant de sélectionner le fichier PDF sur le disque (si c'est bien la ta problématique) ou de la source appropriée (web, etc. )
    • Via le pont, demander a WebView de charger ce fichier dans viewer.js ou viewer.html


    De même qu'il faudra réfléchir sur comment procéder pour certaines fonctionnalités qui peuvent être supportées dans un navigateur standalone (ex: Chrome, FireFox, etc.) mais pas forcement dans un tel environnement (ex: impression, sauvegarde du fichier PDF, etc.)

    EDIT - ah ok j'avais mal lu le message initial. C'est un peu plus complexe qu'une simple visionneuse donc. Hum... il te faut quand meme localiser dans le code de viewer.js ce qui permet de charger un PDF quelconque et ensuite voir comment invoquer ca avec les boutons de ta video. Cette video et ces boutons sont aussi du contenu web ou ca s'affiche directement dans Java ?
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  8. #8
    Membre à l'essai
    Effectivement Bouye, c'est plus complexe qu'une simple visionneuse.
    J'ai résolu mon problème : le site que j'appel va installer pdf.js afin que les visiteurs affichent la page, même si le browser ne possède pas de module PDF.
    Au final, c'est le plus sur pour eux également.

    En tout cas, merci pour cette discussion et ces échanges, techniques certes, mais très sympas.
    Je reste persuadé que mettre un proxy est viable mais à condition de pouvoir traper tous les appels aux PDF : tous les appels doivent être fait de la même manière.
    Ensuite, isoler le code chargeant le PDF et l'appeler.
    Pas mal de travail au final mais complètement faisable pour ceux qui rencontreraient le même problème que moi. Courage à vous, vous en aurez quand même besoin ^^.

###raw>template_hook.ano_emploi###