from __future__ import annotations
"""PDF exporter module for PDF documents."""
from pathlib import Path
from qgis.core import QgsMapRendererCustomPainterJob, QgsMapSettings
from qgis.PyQt.QtCore import QMarginsF, QRectF, QSize, QSizeF
from qgis.PyQt.QtGui import QPageSize, QPainter, QPdfWriter
from sec_interp.logger_config import get_logger
from .base_exporter import BaseExporter
logger = get_logger(__name__)
[docs]
class PDFExporter(BaseExporter):
"""Exporter for PDF format."""
[docs]
def get_supported_extensions(self) -> list[str]:
"""Get supported PDF extension."""
return [".pdf"]
[docs]
def export(self, output_path: Path, map_settings: QgsMapSettings) -> bool:
"""Export map to PDF.
Args:
output_path: Output file path
map_settings: QgsMapSettings instance configured for rendering
Returns:
True if export successful, False otherwise
"""
try:
width = self.get_setting("width", 800)
height = self.get_setting("height", 600)
# Setup PDF writer
writer = QPdfWriter(str(output_path))
writer.setResolution(300) # Set DPI
writer.setPageSize(QPageSize(QSizeF(width, height), QPageSize.Unit.Point))
writer.setPageMargins(QMarginsF(0, 0, 0, 0))
# Setup painter
painter = QPainter()
if not painter.begin(writer):
logger.error(f"Failed to begin painting for PDF export to {output_path}")
return False
try:
painter.setRenderHint(QPainter.Antialiasing)
# Update map settings with actual writer device dimensions and DPI
dev = painter.device()
map_settings.setOutputSize(QSize(dev.width(), dev.height()))
map_settings.setOutputDpi(writer.resolution())
# Render map
job = QgsMapRendererCustomPainterJob(map_settings, painter)
job.start()
job.waitForFinished()
# Draw legend if available
show_legend = self.get_setting("show_legend", True)
legend_renderer = self.get_setting("legend_renderer")
if legend_renderer and show_legend:
legend_renderer.draw_legend(painter, QRectF(0, 0, dev.width(), dev.height()))
finally:
painter.end()
except Exception:
logger.exception(f"PDF export failed for {output_path}")
return False
else:
return True