Quantcast
Viewing all articles
Browse latest Browse all 14389

QGIS Atlas Python script produces corrupt PDFs because it crashes mid export

My Python script freezes in the middle of execution when trying to export a QGIS layer as a PDF with a page per feature. It gets to the following line, and then the script simply crashes:

result = exporter.exportToPdf(atlas, os.path.join(arbeidsmappe_path, output_pdf), QgsLayoutExporter.PdfExportSettings()).

I have a try, except block after this, which it never gets to.

Here is the full code block. I have changed some variable names to be more generic. Also some variables like directory and arbeidsmappe_path, it is being passed from another script.

# -*- coding: UTF-8 -*-import osimport sysfrom qgis.PyQt.QtXml import QDomDocumentfrom qgis.core import (    QgsApplication, QgsProject, QgsPrintLayout, QgsLayoutExporter,    QgsReadWriteContext)# Check for command line arguments for pathsif len(sys.argv) > 2:    directory = sys.argv[1]    arbeidsmappe_path = sys.argv[2]else:    print("Directory and arbeidsmappe path were not provided.")    sys.exit(1)# Set up the QGIS applicationQgsApplication.setPrefixPath(r"C:\Program Files\QGIS 3.30.3\bin", True)qgs = QgsApplication([], False)qgs.initQgis()# Function to generate atlas from a .qpt filedef generate_atlas_from_template(qpt_file, output_pdf, layout_name):    print(f"Starting to generate atlas from template: {qpt_file}", flush=True)    # Load the project file    project = QgsProject.instance()    if not project.read(os.path.join(directory, 'Presentasjon_analyse_NIS-FKB_test.qgs')):        print(f"Failed to read the project file: {os.path.join(directory, 'Presentasjon_analyse_NIS-FKB_test.qgs')}", flush=True)        return    project.read(os.path.join(directory, 'Presentasjon_analyse_NIS-FKB_test.qgs'))    print("Project file loaded successfully", flush=True)    # Read in the .qpt file    template_path = os.path.join(directory, qpt_file)    try:        with open(template_path) as f:            template_content = f.read()    except Exception as e:        print(f"Failed to read the template file: {template_path}. Error: {e}", flush=True)        return    print("Template file read successfully", flush=True)    template_content = open(template_path).read()    document = QDomDocument()    document.setContent(template_content)    # Create a new layout    layout = QgsPrintLayout(project)    layout.initializeDefaults()    if not layout.loadFromTemplate(document, QgsReadWriteContext()):        print(f"Failed to load layout from the template", flush=True)        return    print("Layout loaded from template successfully", flush=True)    layout.loadFromTemplate(document, QgsReadWriteContext())    # Assume layout and atlas are already configured in the .qpt file    atlas = layout.atlas()    atlas.setEnabled(True)  # Just ensure atlas is enabled, in case it's not set in the template    # Proceed to export the atlas to a PDF      exporter = QgsLayoutExporter(layout)    print(arbeidsmappe_path)    try:        print(f"Exporting atlas to {output_pdf}...", flush=True)        result = exporter.exportToPdf(atlas, os.path.join(arbeidsmappe_path, output_pdf), QgsLayoutExporter.PdfExportSettings())        if result != QgsLayoutExporter.Success:            print(f"Failed to export atlas for {output_pdf}")        else:            print(f"Atlas successfully exported to {output_pdf}")    except Exception as e:        print(f"An error occurred while exporting atlas for {output_pdf}: {e}")# Generate atlas for each templategenerate_atlas_from_template(r'C:\\Atlas_template\template1.qpt', '1.pdf', '1_layout')generate_atlas_from_template(r'C:\Atlas_template\template2.qpt', '2.pdf', '2_layout')generate_atlas_from_template(r'C:\Atlas_template\template3', '3.pdf', '3_layout')# Clean up the QGIS applicationqgs.exitQgis()

The script is supposed to create one PDF consisting of multiple pages per data layer in my .QGS project file, but it simply crashes out during the first layer it gets to.

EDIT: I ended up abandoning the idea to use atlas outside of QGIS and instead used PyQGIS which I turned into a plugin. I'll share the code with anyone if they're curious.


Viewing all articles
Browse latest Browse all 14389

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>