Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

GeoDataDays 2025

#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

 

Pied de page des forums

Copyright Association GeoRezo