Tengo un diseño existente y estoy tratando de exportarlo a PDF desde un script independiente después de que los datos se actualizan automáticamente. Si abro QGIS y exporto todo está bien, pero cuando lo llamo desde Python solo obtengo el mapa base y la superposición de puntos. Mi capa de polígonos falta.
Tuve que desbloquear/bloquear las capas y luego guardar el diseño para que los puntos se muestren en el PDF exportado, pero no tuve suerte con los polígonos.
Ambas capas de puntos y polígonos vienen de una capa de base de datos de Oracle, pero solo la capa de polígonos utiliza el administrador de autenticación para las credenciales (es decir, authcfg).
Ejemplo de código:
#!/usr/bin/env python3
import os, time
from qgis.PyQt.QtCore import QSettings
from qgis.PyQt.QtSql import QSqlDatabase, QSqlQuery
from qgis.core import (QgsProject, QgsLayoutExporter, QgsApplication, QgsAuthManager, QgsFeedback)
QgsApplication.setPrefixPath("/usr", True)
gui_flag = False
app = QgsApplication([], gui_flag)
app.initQgis()
project_path = os.getcwd() + '/project.qgs'
project_instance = QgsProject.instance()
project_instance.setFileName(project_path)
project_instance.read()
authMgr = QgsApplication.authManager()
if authMgr.authenticationDatabasePath():
print('INFO: Auth already initilised => we are inside a QGIS app.')
msg = 'Dentro de QGIS'
else:
print('ADVERTENCIA: fuera de QGIS, por ejemplo, en un entorno de prueba => configurar variable de entorno antes')
# db init
os.environ['QGIS_AUTH_DB_DIR_PATH'] = "profile/qgis-auth.db"
msg = 'La contraseña maestra no se pudo establecer'
assert authMgr.setMasterPassword("password", True), msg
authMgr.init( "profile/qgis-auth.db" )
if not QSqlDatabase.isDriverAvailable('QOCISPATIAL'):
print("ADVERTENCIA: Oracle no disponible")
else:
db = QSqlDatabase.addDatabase("QOCISPATIAL")
db.setDatabaseName("oracleDatabase:1521/dbName")
db.setUserName("username")
db.setPassword("password")
if db.isValid():
if not db.open():
print("ADVERTENCIA: Oracle no disponible")
else:
print("INFO: Base de datos de Oracle disponible")
manager = QgsProject.instance().layoutManager()
timestr = time.strftime("%Y%m%d-%H%M%S")
feedback = QgsFeedback()
layout = manager.layoutByName("layoutName") # nombre del diseño
# o layout = manager.layouts()[0] # primer diseño
exportSettings = QgsLayoutExporter.PdfExportSettings()
exportSettings.flags = layout.renderContext().flags()
exportSettings.dpi = 150
exportSettings.forceVectorOutput = True
exportSettings.writeGeoPdf = True
exportSettings.includeGeoPdfFeatures = False
exporter = QgsLayoutExporter(layout)
exporter.exportToPdf(project_instance.absolutePath() + "/layoutName-" + timestr + ".pdf",
exportSettings)
app.exitQgis()
Puedes ver que ya he realizado una serie de comprobaciones, en su mayoría innecesarias, para asegurarme de que se conecta a la base de datos de Oracle y parecen estar funcionando. Además, ahora dibuja la capa de puntos que también proviene de la base de datos de Oracle.
Mi hipótesis de trabajo es que las credenciales de autenticación están fallando pero no recibo un error, por lo que es difícil depurarlo. Desde que cambié desde QgsLayoutExporter.PdfExportSettings() para definirlos manualmente, ahora recibo errores sobre las dimensiones de la página PDF insertada difieren de la página de salida PDF pero no estoy seguro si están vinculados ya que el PDF aún se crea correctamente; solo sin la capa de polígonos.
Actualización
Ahora he vuelto a intentar el script utilizando el nombre de usuario y la contraseña escritos en el proyecto y puedo confirmar que la capa siempre falta si uso un authcfg y funciona bien si el nombre de usuario y la contraseña están en el archivo del proyecto.
Por lo tanto, mi pregunta ha cambiado a; ¿cómo se puede utilizar el administrador de autenticación para una capa y aún así poder exportar a PDF utilizando un script de Python independiente?