#1 Fri 06 June 2025 07:15
- pyjoubert
- Participant assidu
- Lieu: Lyon
- Date d'inscription: 21 Mar 2006
- Messages: 374
QGIS: PYQGIS 3.34 --> Creation Composeur en python
Bonjour,
Je voudrai créer et utiliser un composeur de mise en page d'une façon dynamique en lisant mes valeurs dans une base de données..
Je ne trouve aucune doc la dessus, c'est pour cela que je me retourne vers le forum.
Avez-vous quelques exemples concrets à me proposer ?
Merci et bonne journée, PYJ
Hors ligne
#2 Sat 07 June 2025 07:13
- pyjoubert
- Participant assidu
- Lieu: Lyon
- Date d'inscription: 21 Mar 2006
- Messages: 374
Re: QGIS: PYQGIS 3.34 --> Creation Composeur en python
L'idée est de
1) éditer le fichier .QPT
2) appeler le composeur pour faire le tracé
Tout cela en python
Merci
Hors ligne
#3 Sat 07 June 2025 16:39
- arnaudp
- Participant occasionnel
- Date d'inscription: 20 Sep 2020
- Messages: 48
Re: QGIS: PYQGIS 3.34 --> Creation Composeur en python
Bonjour pyjoubert,
Il y a cet article de blog qui montre un exemple : https://opensourceoptions.com/pyqgis-cr … th-python/ [en].
L'idée va être de travailler avec QgsLayoutManager https://qgis.org/pyqgis/3.40/core/QgsLayoutManager.html
Puis ensuite vous pourrez travailler avec les différentes classes concernant les layouts : https://qgis.org/pyqgis/3.40/core/index … ore-layout
Si vous souhaitez charger un QPT déjà préparé, il faudra utiliser la fonction loadFromTemplate : https://qgis.org/pyqgis/3.40/core/QgsLa … omTemplate
Il y a l'air d'avoir un exemple sur gis.stackexchange : https://gis.stackexchange.com/a/325985 [en].
Je n'ai pas testé par contre.
Je suis curieux d'avoir votre retour.
Bonne journée.
Hors ligne
#4 Wed 11 June 2025 13:27
- pyjoubert
- Participant assidu
- Lieu: Lyon
- Date d'inscription: 21 Mar 2006
- Messages: 374
Re: QGIS: PYQGIS 3.34 --> Creation Composeur en python
Bonjour,
J'ai essayé de faire comme l'exemple cité dans ton post (qpt déjà existant)
Code:
from PySide6.QtXml import QDomDocument from qgis.core import QgsReadWriteContext,QgsLayout,QgsProject def WBO_COMPOSEUR_ChargerTemplate(qpt): p = QgsProject() l = QgsLayout(p) with open(qpt) as f: template_content = f.read() doc = QDomDocument() doc.setContent(template_content) items, ok = l.loadFromTemplate(doc, QgsReadWriteContext(), False) WBO_COMPOSEUR_ChargerTemplate("c:\Temp\composer.qpt")
J'obtiens une erreur
WBO_COMPOSEUR_ChargerTemplate
TypeError: QgsLayout.loadFromTemplate(): argument 1 has unexpected type 'PySide6.QtXml.QDomDocument'
En allant chercher QDomDocument dans PyQt5.QtXml , je n'ai plus d'ereeur, ok me rend True, mais rien ne s'imprime
PYJ
Dernière modification par pyjoubert (Wed 11 June 2025 14:08)
Hors ligne
#5 Wed 11 June 2025 14:12
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1197
Re: QGIS: PYQGIS 3.34 --> Creation Composeur en python
Bonjour,
je n'y connais pas grand chose mais pourquoi ne pas utiliser plutôt le QDomDocument de PyQt ? :
Code:
from PyQt5.QtXml import QDomDocument
Hors ligne
#6 Thu 12 June 2025 06:54
- pyjoubert
- Participant assidu
- Lieu: Lyon
- Date d'inscription: 21 Mar 2006
- Messages: 374
Re: QGIS: PYQGIS 3.34 --> Creation Composeur en python
Bonjour.
En effet avec le DomDocument de pyQt, Ok prend la valeur de True
Le qpt semble donc chargé
Comment exporter en pdf ?
l Étant un layout, il semble vide
Merci
PYJ
Hors ligne
#7 Thu 12 June 2025 07:33
- pyjoubert
- Participant assidu
- Lieu: Lyon
- Date d'inscription: 21 Mar 2006
- Messages: 374
Re: QGIS: PYQGIS 3.34 --> Creation Composeur en python
Et voici mon nouveau test (qui ne fait pas le pdf !!)
Code:
from PyQt5.QtXml import QDomDocument from qgis.core import QgsReadWriteContext,QgsLayout,QgsProject,QgsLayoutExporter def WBO_COMPOSEUR_ChargerTemplate(qpt): p = QgsProject() lay = QgsLayout(p) with open(qpt) as f: template_content = f.read() doc = QDomDocument() doc.setContent(template_content) items, ok = lay.loadFromTemplate(doc, QgsReadWriteContext(), False) return(ok,lay) # Exécution du test ret,layout = WBO_COMPOSEUR_ChargerTemplate("C:/Users/SITPYJO/AppData/Roaming/QGIS/QGIS3/Profiles/grandlyon23/composer_templates/A4_paysage.qpt") print(ret) print(layout) exporter = QgsLayoutExporter(layout) exporter.exportToPdf("c:/temp/essai.pdf", QgsLayoutExporter.PdfExportSettings())
Si vous voyez ce qui ne va pas, je suis preneur
PUJ
Hors ligne
#8 Thu 12 June 2025 22:20
- arnaudp
- Participant occasionnel
- Date d'inscription: 20 Sep 2020
- Messages: 48
Re: QGIS: PYQGIS 3.34 --> Creation Composeur en python
Bonsoir,
En suivant cet exemple https://gis.stackexchange.com/questions … ing-pyqgis je suis arrivé à ce résultat qui fonctionne.
Code:
from qgis.core import QgsReadWriteContext,QgsPrintLayout,QgsLayout,QgsProject,QgsLayoutExporter # lecture du fichier QPT ff = open("/Users/arnaud/Desktop/TEST_script.qpt", 'r') tmplt = ff.read() ff.close() doc = QDomDocument() doc.setContent(tmplt) ele = doc.documentElement() # On initialise un QgsPRINTLayout project = QgsProject.instance() layout = QgsPrintLayout(project) layout.initializeDefaults() # On ajoute les éléments issu du QPT layout.addItemsFromXml(ele, doc, QgsReadWriteContext()) # Cette partie permet d'ajouter le QPT au gestionnaire des mises en page (pratique pour debugger) # layout.setName("TEST") # manager = project.layoutManager() # for lay in manager.printLayouts(): # if lay.name() == "TEST": # manager.removeLayout(lay) # manager.addLayout(layout) # On export exporter = QgsLayoutExporter(layout) exporter.exportToPdf("/Users/arnaud/Desktop/essai.pdf", QgsLayoutExporter.PdfExportSettings())
Chez moi, c'était dans la fonction WBO_COMPOSEUR_ChargerTemplate que ça plantait.
LA différence est l'usage de addItemsFromXml https://qgis.org/pyqgis/3.40/core/QgsLa … emsFromXml à la place de loadFromTemplate.
Je n'ai pas toute les subtilités en tête. Si quelqu'un a des éclaircissements, je suis très curieux.
Sinon, j'essairais de regarder plus en détail lorsque j'aurais plus de temps.
Bonne soirée.
Hors ligne
#9 Fri 13 June 2025 07:00
- pyjoubert
- Participant assidu
- Lieu: Lyon
- Date d'inscription: 21 Mar 2006
- Messages: 374
Re: QGIS: PYQGIS 3.34 --> Creation Composeur en python
Bonjour,
A y est, j'ai mon PDF de fait
Certes, il y a un problème de mise en page, mais avec l'option de debuggager, via manager, ça va me permettre de corriger
Un grand merci!
PYJ
Hors ligne
#10 Mon 16 June 2025 09:55
- pyjoubert
- Participant assidu
- Lieu: Lyon
- Date d'inscription: 21 Mar 2006
- Messages: 374
Re: QGIS: PYQGIS 3.34 --> Creation Composeur en python
Bonjour,
C'est toujours moi !
J'ai encore un petit souci,
Le code fonctionne à 90%
Je m'explique, touts les élément (carte, rectangle, photo, ..) sont visibles lorsque je les vois dans le manager, par contre la page reste en A4 paysage?
Conséquence, le pdf est tronqué et ne représente que les éléments de mise en page contenus dans cette page.
Que dois-je rajouter dans le cote pour que la page garde mes dimensions personnalisée ?
Merci encore de votre aide et bonne journée
PYJ
Hors ligne
#11 Mon 16 June 2025 10:29
- pyjoubert
- Participant assidu
- Lieu: Lyon
- Date d'inscription: 21 Mar 2006
- Messages: 374
Re: QGIS: PYQGIS 3.34 --> Creation Composeur en python
En fait, je récupère tout les éléments, mais il faudrait en plus que je récupère les dimensions de ma page (qui elle, ne semble pas être considérée comme élément de mise en page)
PYJ
Hors ligne
#12 Mon 16 June 2025 11:21
- pyjoubert
- Participant assidu
- Lieu: Lyon
- Date d'inscription: 21 Mar 2006
- Messages: 374
Re: QGIS: PYQGIS 3.34 --> Creation Composeur en python
C'est tout bon,
Il fallait que je définisse ma page après l'initialisation du layout
PYJ
Hors ligne