16#ifndef QGSABSTRACTGEOPDFEXPORTER_H
17#define QGSABSTRACTGEOPDFEXPORTER_H
31#include <QTemporaryDir>
35using namespace Qt::StringLiterals;
38class QgsGeospatialPdfRenderedFeatureHandler;
45 bool initiallyVisible =
false;
47 QString mutuallyExclusiveGroupId;
49 std::vector< std::unique_ptr< TreeNode > > children;
50 TreeNode *parent =
nullptr;
51 bool isRootNode =
false;
53 void addChild( std::unique_ptr< TreeNode > child )
56 children.emplace_back( std::move( child ) );
59 QDomElement toElement( QDomDocument &doc )
const
61 QDomElement layerElement = doc.createElement( u
"Layer"_s );
62 layerElement.setAttribute( u
"id"_s,
id );
63 layerElement.setAttribute( u
"name"_s, name );
64 layerElement.setAttribute( u
"initiallyVisible"_s, initiallyVisible ? u
"true"_s : u
"false"_s );
65 if ( !mutuallyExclusiveGroupId.isEmpty() )
66 layerElement.setAttribute( u
"mutuallyExclusiveGroupId"_s, mutuallyExclusiveGroupId );
68 for (
const auto &child : children )
70 layerElement.appendChild( child->toElement( doc ) );
76 void toChildrenElements( QDomDocument &doc, QDomElement &layerTreeElem )
const
78 for (
const auto &child : children )
80 layerTreeElem.appendChild( child->toElement( doc ) );
84 QDomElement createIfLayerOnElement( QDomDocument &doc, QDomElement &contentElement )
const
86 QDomElement element = doc.createElement( u
"IfLayerOn"_s );
87 element.setAttribute( u
"layerId"_s,
id );
88 contentElement.appendChild( element );
92 QDomElement createNestedIfLayerOnElements( QDomDocument &doc, QDomElement &contentElement )
const
94 TreeNode *currentParent = parent;
95 QDomElement finalElement = doc.createElement( u
"IfLayerOn"_s );
96 finalElement.setAttribute( u
"layerId"_s,
id );
98 QDomElement currentElement = finalElement;
99 while ( currentParent && !currentParent->isRootNode )
101 QDomElement ifGroupOn = doc.createElement( u
"IfLayerOn"_s );
102 ifGroupOn.setAttribute( u
"layerId"_s, currentParent->id );
103 ifGroupOn.appendChild( currentElement );
104 currentElement = ifGroupOn;
105 currentParent = currentParent->parent;
107 contentElement.appendChild( currentElement );
424 bool finalize(
const QList< QgsAbstractGeospatialPdfExporter::ComponentLayerDetail > &components,
const QString &destinationFile,
const ExportDetails &details );
434 QString generateTemporaryFilepath(
const QString &filename )
const;
442 static bool compositionModeSupported( QPainter::CompositionMode mode );
480 QMap< QString, QMap< QString, QgsFeatureList > > mCollatedFeatures;
492 QList< VectorComponentDetail > mVectorComponents;
494 QString mErrorMessage;
495 QTemporaryDir mTemporaryDir;
498 bool saveTemporaryLayers();
500 QString createCompositionXml(
const QList< QgsAbstractGeospatialPdfExporter::ComponentLayerDetail > &components,
const ExportDetails &details )
const;
501 void createMetadataXmlSection( QDomElement &compositionElem, QDomDocument &doc,
const ExportDetails &details )
const;
502 void createPageDimensionXmlSection( QDomElement &pageElem, QDomDocument &doc,
const double pageWidthPdfUnits,
const double pageHeightPdfUnits )
const;
503 void createGeoreferencingXmlSection( QDomElement &pageElem, QDomDocument &doc,
const ExportDetails &details,
const double pageWidthPdfUnits,
const double pageHeightPdfUnits )
const;
504 void createContentXmlSection(
505 QDomElement &contentElem,
507 const QMap< QString, TreeNode * > &groupNameToTreeNode,
508 const QMap< QString, TreeNode * > &layerIdToTreeNode,
509 const QList<ComponentLayerDetail> &components,
513 void createLayerTreeAndContentXmlSections( QDomElement &compositionElem, QDomElement &pageElem, QDomDocument &doc,
const QList<ComponentLayerDetail> &components,
const ExportDetails &details )
const;
514 void createLayerTreeAndContentXmlSectionsFromLayerTree(
515 const QgsLayerTree *layerTree, QDomElement &compositionElem, QDomElement &pageElem, QDomDocument &doc,
const QList<ComponentLayerDetail> &components,
const ExportDetails &details
521 std::unique_ptr< TreeNode > createPdfTreeNodes( QMap< QString, TreeNode * > &groupNameToTreeNode, QMap< QString, TreeNode * > &layerIdToTreeNode,
const QgsLayerTreeGroup *layerTreeGroup )
const;
526 static QString compositionModeToString( QPainter::CompositionMode mode );
static QString geospatialPDFAvailabilityExplanation()
Returns a user-friendly, translated string explaining why Geospatial PDF export support is not availa...
friend class TestQgsGeospatialPdfExport
static constexpr double DPI_72
Hardcode DPI of 72 to get correct page sizes in outputs.
bool finalize(const QList< QgsAbstractGeospatialPdfExporter::ComponentLayerDetail > &components, const QString &destinationFile, const ExportDetails &details)
To be called after the rendering operation is complete.
void pushRenderedFeature(const QString &layerId, const QgsAbstractGeospatialPdfExporter::RenderedFeature &feature, const QString &group=QString())
Called multiple times during the rendering operation, whenever a feature associated with the specifie...
virtual ~QgsAbstractGeospatialPdfExporter()=default
friend class TestQgsLayoutGeospatialPdfExport
QgsAbstractGeospatialPdfExporter()=default
QString errorMessage() const
Returns the last error message encountered during the export.
static bool geospatialPDFCreationAvailable()
Returns true if the current QGIS build is capable of Geospatial PDF support.
Represents a coordinate reference system (CRS).
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
A geometry is the spatial representation of a feature.
Layer tree group node serves as a container for layers and further groups.
Namespace with helper functions for layer tree operations.
A rectangle specified with double values.
Contains details of a particular input component to be used during PDF composition.
QString mapLayerId
Associated map layer ID, or an empty string if this component layer is not associated with a map laye...
QString group
Optional group name, for arranging layers in top-level groups.
double opacity
Component opacity.
QString name
User-friendly name for the generated PDF layer.
QPainter::CompositionMode compositionMode
Component composition mode.
QString sourcePdfPath
File path to the (already created) PDF to use as the source for this component layer.
QgsPointXY pagePoint
Coordinate on the page of the control point, in millimeters.
QgsPointXY geoPoint
Georeferenced coordinate of the control point, in CRS units.
ControlPoint(const QgsPointXY &pagePoint, const QgsPointXY &geoPoint)
Constructor for ControlPoint, at the specified pagePoint (in millimeters) and geoPoint (in CRS units)...
QMap< QString, QString > customLayerTreeGroups
Optional map of map layer ID to custom logical layer tree group in created PDF file.
QMap< QString, bool > initialLayerVisibility
Optional map of map layer ID to initial visibility state.
QList< QgsAbstractGeospatialPdfExporter::GeoReferencedSection > georeferencedSections
List of georeferenced sections.
QStringList layerOrder
Optional list of layer IDs, in the order desired to appear in the generated Geospatial PDF file.
QMap< QString, QString > layerIdToPdfLayerTreeNameMap
Optional map of map layer ID to custom layer tree name to show in the created PDF file.
QgsAbstractMetadataBase::KeywordMap keywords
Metadata keyword map.
QString creator
Metadata creator tag.
QSizeF pageSizeMm
Page size, in millimeters.
bool useOgcBestPracticeFormatGeoreferencing
true if OGC "best practice" format georeferencing should be used.
QString author
Metadata author tag.
QString subject
Metadata subject tag.
QString title
Metadata title tag.
QStringList layerTreeGroupOrder
Specifies the ordering of layer tree groups in the generated Geospatial PDF file.
bool useLayerTreeConfig
If set to true, the layer tree from the QGIS project should be used when creating a Geospatial PDF.
QDateTime creationDateTime
Metadata creation datetime.
bool includeFeatures
true if feature vector information (such as attributes) should be exported.
QString producer
Metadata producer tag.
bool useIso32000ExtensionFormatGeoreferencing
true if ISO32000 extension format georeferencing should be used.
QSet< QString > mutuallyExclusiveGroups
Contains a list of group names which should be considered as mutually exclusive.
QgsRectangle pageBoundsMm
Bounds of the georeferenced section on the page, in millimeters.
QgsCoordinateReferenceSystem crs
Coordinate reference system for georeferenced section.
QList< QgsAbstractGeospatialPdfExporter::ControlPoint > controlPoints
List of control points corresponding to this georeferenced section.
QgsPolygon pageBoundsPolygon
Bounds of the georeferenced section on the page, in millimeters, as a free-form polygon.
Contains information about a feature rendered inside the PDF.
QgsGeometry renderedBounds
Bounds, in PDF units, of rendered feature.
QgsFeature feature
Rendered feature.
RenderedFeature(const QgsFeature &feature, const QgsGeometry &renderedBounds)
Constructor for RenderedFeature.
RenderedFeature()=default
Contains information relating to a single PDF layer in the Geospatial PDF export.
QString mapLayerId
Associated map layer ID.
QString group
Optional layer group name.
QString name
User-friendly name for the generated PDF layer.
QString displayAttribute
Field name for display.
QString sourceVectorPath
File path to the (already created) vector dataset to use as the source for this component layer.
QString sourceVectorLayer
Layer name in vector dataset to use as the source.