Bientôt un module de lecture de PDF dans Qt ?
Qt PDF utilise la bibliothèque PDFium de Chromium, disponible sous licence BSD

Le , par dourouc05, Responsable Qt
Jusqu’à présent, avec Qt, si l’on voulait afficher un fichier PDF, le choix principal est Poppler, MuPDF étant aussi utilisé, mais sans facilité pour Qt Quick. Certains aventureux utilisent Qt WebEngine et pdf.js, la bibliothèque qu’utilise Firefox pour afficher les PDF. La situation pourrait changer : pendant un précédent hackathon, des développeurs de Qt ont écrit une petite couche d’intégration avec PDFium, le moteur d’affichage de PDF de Chromium. L’avantage principal par rapport à Poppler et MuPDF est la licence : PDFium est sous licence BSD, Poppler GPL et MuPDF AGPL.

Ce module expérimental a été récemment retravaillé et mis sous licence LGPL 3, pour être utilisable par le plus grand nombre. Il comporte principalement deux classes : QPdfDocument, qui permet d’afficher une page dans une QImage, ainsi que QPdfBookmarkModel, qui donne accès aux marque-pages. Une couche d’accès pour Qt Quick est dans les projets (considérer un PDF comme une image comme les autres — à l’exception cependant des pages multiples, fonctionnalité plus rare pour des formats d’images traditionnels), mais sans date certaine.


Voir les sources de Qt PDF.
Source : New QtLabs PDF module.


Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :


 Poster une réponse Signaler un problème

Avatar de archqt archqt - Membre actif https://www.developpez.com
le 04/02/2017 à 21:28
Bonsoir,
en fait ils prennent un code BSD, le modifie, et mettent une partie en commercial et LGPL. Ils ont le droit de faire cela ? je veux dire en commercial c'est ok, en BSD aussi mais restreindre un truc qui a la base est en BSD pour le mettre en LGPL.
Si quelqu'un peut m'expliquer la moralité du truc.
Bonne soirée
Avatar de captaindidou captaindidou - Membre confirmé https://www.developpez.com
le 04/02/2017 à 22:55
Moralité n'est pas légalité.
Mais ce n'est pas sur la terrain de le moralité que l'on se situe ici. Parler de moralité en matière de justice, c'est impropre.
C'est le mot équité qu'il est approprié. Autrement dit, la question à se poser est : "Y-a-t'il un préjudice, un abus ?"

Je n'en vois pas. Il existe une bib PDF en C++ sous licence BSD. Elle est adaptée pour Qt et commercialisée et éditée sous licence LGPL.

Les faits, ce sont les développements qui constituent la valeur-ajoutée et sont propriétaires. Le code source d'origine n'est pas confisqué.
La liberté de chacun de réaliser un développement similaire est intacte.

Aucune préjudice pour personne :
- la licence BSD est respectée. Elle est à ce propos, compatible avec GPL.
- la liberté des utilisateurs d'utiliser et modifier est préservée.
Avatar de dourouc05 dourouc05 - Responsable Qt https://www.developpez.com
le 06/02/2017 à 10:12
De ce que j'ai vu, ils ne reprennent pas le code de PDFium, ils construisent une couche d'abstraction par-dessus — PDFium étant utilisé comme bibliothèque. Si mes souvenirs sont bons, selon la GPL, c'est toujours un travail dérivé (donc à distribuer sous GPL, une licence "libre") ; par contre, d'un point de vue moral, ça me semble justifiable, sans problème.
Avatar de koala01 koala01 - Expert éminent sénior https://www.developpez.com
le 09/02/2017 à 3:10
Salut,
Citation Envoyé par archqt Voir le message
Bonsoir,
en fait ils prennent un code BSD, le modifie, et mettent une partie en commercial et LGPL. Ils ont le droit de faire cela ? je veux dire en commercial c'est ok, en BSD aussi mais restreindre un truc qui a la base est en BSD pour le mettre en LGPL.
Si quelqu'un peut m'expliquer la moralité du truc.
Bonne soirée
Je viens de relire le texte de la licence BSD (on le trouve, entre autres -->ICI<<-- ) et elle est très claire : tu en fais du truc sous BSD (la bibliothèque, en l'occurrence) strictement ce que tu veux. La seule restriction est que la notice concernant la licence (de la bibliothèque que tu utilise) doit l'accompagner "partout ou elle ira"

Tu voudrais même l'utiliser -- sous quelle que forme que ce soit -- pour une application vendue à 10000$ pièce, c'est ton droit le plus stricte du point de vue légal

On peut se poser la question de savoir si c'est "sympa" ou "moral" de le faire, surtout si une grande partie de ton projet est basé exclusivement sur des trucs sous licence BSD, mais, si ca ne t'empêche pas de dormir la nuit, c'est en tout cas suffisamment sympa et moral pour que tu puisse "faire avec", et c'est tout ce qui compte en définitive
Avatar de LittleWhite LittleWhite - Responsable 2D/3D/Jeux https://www.developpez.com
le 09/02/2017 à 9:14
Bonjour,

Côté moral, je ne vois pas exactement (même si je sais) pourquoi cela entre en compte. J'estime que celui qui fait le projet/bibliothèque choisit la licence en connaissance de cause (car oui, le choix de la licence est important et ne doit pas se faire n'importe comment, même si nous ne sommes pas tous des juristes). Du coup, le choix de la BSD est :
  • je veux que mon projet soit utile pour tous (et réutilisé) (même si c'est commercial) ;
  • je veux tout de même une reconnaissance, même minime de mon travail (fichier de licence).

C'est comme ça, que je résumerai (même si c'est un peu hatif).
Du coup, ce n'est pas à nous, membres externes du projet de dire : "ce n'est pas moral". Car finalement, c'est l'auteur qui a choisit que ce soit ainsi (altruisme ).
Avatar de archqt archqt - Membre actif https://www.developpez.com
le 09/02/2017 à 15:37
Bonjour,
qu'ils fassent du commercial avec du code en licence BSD je suis d'accord MAIS qu'ils laissent le nouveau code en BSD. La ils le mettent en commercial + LGPL. Donc pour celui qui veut faire du commercial c'est plus compliqué quelque part, même si c'est faisable avec une liaison statique sans fournir le code.
Ils auraient pu le laisser en licence BSD, même s'ils ont le droit de le faire.
Bonne fin de journée
Avatar de koala01 koala01 - Expert éminent sénior https://www.developpez.com
le 09/02/2017 à 20:20
Je peux me tromper, mais, à ma connaissance, Qt n'a jamais touché à la licence des bibliothèques externes qu'elle utilise, à moins, bien sur, d'en avoir réécrit le code.

Je n'ai pas les sources pour vérifier, mais, si tu prend le plugin jpeg ou le plugin png, par exemple, qui ne font que permettre de disposer de ces bibliothèques lorsqu'elles ne sont pas déjà installées (dans leur version dev) sur l'ordinateur, il me sembles qu'ils suivent exactement la licence de la version d'origine.

En fait, c'est assez paradoxale ce genre de truc, car je crois que la distinction est encore plus (floue ? / précise ?) dans le sens où le code source de la bibliothèque reste sous sa licence d'origine alors que le "packaging" (le fameux qt-libgpeg-plugin suit la politiqu de licence de Qt. Comme je l'ai dit, je n'ai pas de quoi vérifier ici, mais il me semble que c'est quelque chose du genre

Sans oublier que, au final, c'est sans doute plus compliqué que cela (obligation de lier statiquement dans un projet commercial), dans le sens où tu n'accédera sans doute jamais directement aux fonctionnalités spécifiques de la bibliothèque : tu n'utiliseras normalement que... les fonctionnalités exposées par les classes fournies par Qt, qui feront appel à cette bibliothèque ( c'est le fameux "packaging" dont je viens de parler)

Mais, de toutes façons, toi tu utilises Qt, en version dynamique ou statique selon ton gout. Et si, par l'utilisation d'une bibliothèque dont la licence entrerait en conflit avec les propres licences utilisées par Qt, c'est à Qt à faire en sorte de n'autoriser que l'utilisation des bibliothèques statiques si il y a lieu

Il me semble (la dernière fois que j'ai vu une version commerciale remonte à pas mal de temps) qu'il y a "presque de tous temps" eu des éléments qui n'étaient accessibles qu'en version statiques lorsqu'ils étaient utilisés dans la version commerciale
Avatar de dourouc05 dourouc05 - Responsable Qt https://www.developpez.com
le 18/06/2018 à 16:15
Une demande récurrente avec Qt est d’afficher un fichier PDF dans une interface sans besoin de bibliothèque externe (comme Poppler ou, avec une interface moins facile à utiliser, MuPDF). En 2017, déjà, un module était en voie de développement, en exploitant PDFium, la bibliothèque JavaScript utilisée par Chrome pour afficher des PDF. Le choix de PDFium est très pragmatique : sa licence est très permissive (BSD), le code est maintenu de manière très active (de par son utilisation dans Chrome) et, last but not least, dans des documents très complexes, le rendu de PDFium est bien plus rapide que, par exemple, Poppler.

Depuis lors, ce petit projet est arrivé à un certain degré de maturité : il est maintenant possible d’afficher un PDF, mais aussi d’y naviguer, de définir les paramètres d’affichage (vue page par page ou continue, par exemple), le tout en C++, grâce à la classe QPdfView. Tout le rendu est effectué dans un fil d’exécution séparé, ce qui évite de bloquer l’interface graphique.



Pour le moment, QPdfView et le module Qt PDF ne sont utilisables qu’en C++ dans des applications à base de widgets. L’installation est raisonnablement facile :

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
git clone git://code.qt.io/qt-labs/qtpdf
cd qtpdf
git submodule update --init --recursive
qmake
make
cd examples/pdf/pdfviewer
qmake
make
./pdfviewer
Tout comme l’utilisation :

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
#include <QPdfDocument>
#include <QPdfView>
 
QPdfDocument *document = new QPdfDocument;
document->load("document.pdf");
 
QPdfView *view = new QPdfView;
view->setDocument(document);
view->show();

Pour ses prochaines versions,Qt PDF devrait commencer par mettre à jour sa version de PDFium, une opération rendue plus compliquée que prévu à cause de changements dans le système de compilation de la bibliothèque (un passage de Gyp à GN, qu’il faut à nouveau interfacer avec qmake).

En sus, certaines fonctionnalités ne sont pas encore disponibles, comme les liens et la navigation vers des sections du document. Également, il faut encore y ajouter une interface Qt Quick… et peaufiner la documentation.

Source : Browse PDFs in a Qt Widgets application.

Voir aussi : le ticket de suivi.
Avatar de tyrtamos tyrtamos - Expert éminent https://www.developpez.com
le 20/07/2018 à 7:58
Bonjour,

Avec PyQt5, j'utilise pdf.js téléchargé ici: https://mozilla.github.io/pdf.js/.

Avec QWebEngineView, on affiche un pdf très simplement. Par exemple:

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Python 3.5, PyQt5 v5.9
 
import sys
import os
from PyQt5 import QtCore, QtWidgets, QtWebEngineWidgets
 
class Affichepdf(QtWebEngineWidgets.QWebEngineView):
    def __init__(self, fichierpdf, viewerpdf):
        super().__init__()
        self.resize(600, 800)
        PDFJS = 'file:///' + viewerpdf.replace('\\', '/')
        PDF = 'file:///' + fichierpdf.replace('\\', '/')
        self.load(QtCore.QUrl.fromUserInput('%s?file=%s' % (PDFJS, PDF)))
 
if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    affichepdf = Affichepdf("fichier_pdf_a_afficher.pdf", 'pdfjs/web/viewer.html')
    affichepdf.show()
    sys.exit(app.exec_())
Mais je préfèrerais bien sûr une solution PyQt5 plutôt qu'un bricolage javascript: j’attends avec impatience!
Responsable bénévole de la rubrique Qt : Thibaut Cuvelier -