Skip to content

Commit

Permalink
[FEATURE] WMS server: possibility to set pdf export options (as FORMA…
Browse files Browse the repository at this point in the history
…T_OPTIONS) in the GetPrint request
  • Loading branch information
mhugent committed Apr 20, 2023
1 parent f35a0ba commit 45f7ebe
Show file tree
Hide file tree
Showing 3 changed files with 240 additions and 0 deletions.
113 changes: 113 additions & 0 deletions src/server/services/wms/qgswmsparameters.cpp
Expand Up @@ -2241,6 +2241,119 @@ namespace QgsWms
return options;
}

bool QgsWmsParameters::writeGeoPdf() const
{
bool geoPdf = false;
const QMap<QgsWmsParameters::PdfFormatOption, QString> options = formatOptions<QgsWmsParameters::PdfFormatOption>();
if ( options.contains( PdfFormatOption::WRITE_GEO_PDF ) )
{
geoPdf = QVariant( options[PdfFormatOption::WRITE_GEO_PDF] ).toBool();
}
return geoPdf;
}

bool QgsWmsParameters::pdfForceVectorOutput() const
{
bool forceVector = false;
const QMap<QgsWmsParameters::PdfFormatOption, QString> options = formatOptions<QgsWmsParameters::PdfFormatOption>();
if ( options.contains( PdfFormatOption::FORCE_VECTOR_OUTPUT ) )
{
forceVector = QVariant( options[PdfFormatOption::FORCE_VECTOR_OUTPUT] ).toBool();
}
return forceVector;
}

bool QgsWmsParameters::pdfAppendGeoreference() const
{
bool appendGeoref = true;
const QMap<QgsWmsParameters::PdfFormatOption, QString> options = formatOptions<QgsWmsParameters::PdfFormatOption>();
if ( options.contains( PdfFormatOption::APPEND_GEOREFERENCE ) )
{
appendGeoref = QVariant( options[PdfFormatOption::APPEND_GEOREFERENCE] ).toBool();
}
return appendGeoref;
}

bool QgsWmsParameters::pdfSimplifyGeometries() const
{
bool simplify = true;
const QMap<QgsWmsParameters::PdfFormatOption, QString> options = formatOptions<QgsWmsParameters::PdfFormatOption>();
if ( options.contains( PdfFormatOption::SIMPLIFY_GEOMETRY ) )
{
simplify = QVariant( options[PdfFormatOption::SIMPLIFY_GEOMETRY] ).toBool();
}
return simplify;
}

bool QgsWmsParameters::pdfExportMetadata() const
{
bool exportMetadata = false;
const QMap<QgsWmsParameters::PdfFormatOption, QString> options = formatOptions<QgsWmsParameters::PdfFormatOption>();
if ( options.contains( PdfFormatOption::EXPORT_METADATA ) )
{
exportMetadata = QVariant( options[PdfFormatOption::EXPORT_METADATA] ).toBool();
}
return exportMetadata;
}

Qgis::TextRenderFormat QgsWmsParameters::pdfTextRenderFormat() const
{
Qgis::TextRenderFormat format = Qgis::TextRenderFormat::AlwaysOutlines;
const QMap<QgsWmsParameters::PdfFormatOption, QString> options = formatOptions<QgsWmsParameters::PdfFormatOption>();
if ( options.contains( PdfFormatOption::TEXT_RENDER_FORMAT ) )
{
if ( options[PdfFormatOption::TEXT_RENDER_FORMAT].compare( QStringLiteral( "AlwaysText" ), Qt::CaseInsensitive ) == 0 )
{
format = Qgis::TextRenderFormat::AlwaysText;
}
}
return format;
}

bool QgsWmsParameters::pdfLosslessImageCompression() const
{
bool losslessCompression = false;
const QMap<QgsWmsParameters::PdfFormatOption, QString> options = formatOptions<QgsWmsParameters::PdfFormatOption>();
if ( options.contains( PdfFormatOption::LOSSLESS_IMAGE_COMPRESSION ) )
{
losslessCompression = QVariant( options[PdfFormatOption::LOSSLESS_IMAGE_COMPRESSION] ).toBool();
}
return losslessCompression;
}

bool QgsWmsParameters::pdfDisableTiledRasterRendering() const
{
bool disableTiledRaster = false;
const QMap<QgsWmsParameters::PdfFormatOption, QString> options = formatOptions<QgsWmsParameters::PdfFormatOption>();
if ( options.contains( PdfFormatOption::DISABLE_TILED_RASTER_RENDERING ) )
{
disableTiledRaster = QVariant( options[PdfFormatOption::DISABLE_TILED_RASTER_RENDERING] ).toBool();
}
return disableTiledRaster;
}

bool QgsWmsParameters::pdfUseIso32000ExtensionFormatGeoreferencing() const
{
bool useIso32000 = true;
const QMap<QgsWmsParameters::PdfFormatOption, QString> options = formatOptions<QgsWmsParameters::PdfFormatOption>();
if ( options.contains( PdfFormatOption::USE_ISO_32000_EXTENSION_FORMAT_GEOREFERENCING ) )
{
useIso32000 = QVariant( options[PdfFormatOption::USE_ISO_32000_EXTENSION_FORMAT_GEOREFERENCING] ).toBool();
}
return useIso32000;
}

bool QgsWmsParameters::pdfUseOgcBestPracticeFormatGeoreferencing() const
{
bool useOgcGeoreferencing = false;
const QMap<QgsWmsParameters::PdfFormatOption, QString> options = formatOptions<QgsWmsParameters::PdfFormatOption>();
if ( options.contains( PdfFormatOption::USE_OGC_BEST_PRACTICE_FORMAT_GEOREFERENCING ) )
{
useOgcGeoreferencing = QVariant( options[PdfFormatOption::USE_OGC_BEST_PRACTICE_FORMAT_GEOREFERENCING] ).toBool();
}
return useOgcGeoreferencing;
}

QMap<QString, QString> QgsWmsParameters::dimensionValues() const
{
QMap<QString, QString> dimValues;
Expand Down
110 changes: 110 additions & 0 deletions src/server/services/wms/qgswmsparameters.h
Expand Up @@ -366,6 +366,25 @@ namespace QgsWms
};
Q_ENUM( DxfFormatOption )

enum PdfFormatOption
{
RASTERIZE_WHOLE_IMAGE,
FORCE_VECTOR_OUTPUT,
APPEND_GEOREFERENCE,
EXPORT_METADATA,
TEXT_RENDER_FORMAT,
SIMPLIFY_GEOMETRY,
WRITE_GEO_PDF,
USE_ISO_32000_EXTENSION_FORMAT_GEOREFERENCING,
USE_OGC_BEST_PRACTICE_FORMAT_GEOREFERENCING,
INCLUDE_GEO_PDF_FEATURES,
EXPORT_THEMES,
PREDEFINED_MAP_SCALES,
LOSSLESS_IMAGE_COMPRESSION,
DISABLE_TILED_RASTER_RENDERING
};
Q_ENUM( PdfFormatOption )

/**
* Constructor for WMS parameters with specific values.
* \param parameters Map of parameters where keys are parameters' names.
Expand Down Expand Up @@ -1367,11 +1386,102 @@ namespace QgsWms
*/
bool isForce2D() const;

/**
* Returns if a GeoPDF shall be exported
* \since QGIS 3.32
*/
bool writeGeoPdf() const;

/**
* Returns if pdf should be exported as vector
* \since QGIS 3.32
*/
bool pdfForceVectorOutput() const;

/**
* Returns true if georeference info shall be added to the pdf
* \since QGIS 3.32
*/
bool pdfAppendGeoreference() const;

/**
* Returns if geometries shall to be simplified
* \since QGIS 3.32
*/
bool pdfSimplifyGeometries() const;

/**
* Returns true if metadata shall be added to the pdf
* \since QGIS 3.32
*/
bool pdfExportMetadata() const;

/**
* Returns text render format for pdf export
* \since QGIS 3.32
*/
Qgis::TextRenderFormat pdfTextRenderFormat() const;

/**
* Returns true if images embedded in pdf must be lossless
* \since QGIS 3.32
*/
bool pdfLosslessImageCompression() const;

/**
* Returns true if rasters shall be untiled in the pdf
* \since QGIS 3.32
*/
bool pdfDisableTiledRasterRendering() const;

/**
* Returns true, if Iso32000 georeferencing shall be used
* \since QGIS 3.32
*/
bool pdfUseIso32000ExtensionFormatGeoreferencing() const;

/**
* Returns true if OGC best practice georeferencing shall be used
* \since QGIS 3.32
*/
bool pdfUseOgcBestPracticeFormatGeoreferencing() const;

QString version() const override;

QString request() const override;

private:

/**
* Returns the format options for an output format. Possible template types are QgsWmsParameters::PdfFormatOption or QgsWmsParameters::DxfFormatOption
* \returns a key-value map
* \since QGIS 3.32
*/
template<typename T> QMap< T, QString > formatOptions() const
{
QMap<T, QString> options;
const QMetaEnum metaEnum( QMetaEnum::fromType<T>() );
const QStringList opts = mWmsParameters.value( QgsWmsParameter::FORMAT_OPTIONS ).toStringList( ';' );

for ( auto it = opts.constBegin(); it != opts.constEnd(); ++it )
{
const int equalIdx = it->indexOf( ':' );
if ( equalIdx > 0 && equalIdx < ( it->length() - 1 ) )
{
const QString name = it->left( equalIdx ).toUpper();
int metaEnumVal = metaEnum.keyToValue( name.toStdString().c_str() );
if ( metaEnumVal < 0 )
{
continue; //option for a different format
}
const T option = ( T )metaEnumVal;
const QString value = it->right( it->length() - equalIdx - 1 );
options.insert( option, value );
}
}
return options;
}

static bool isExternalLayer( const QString &name );

bool loadParameter( const QString &name, const QString &value ) override;
Expand Down
17 changes: 17 additions & 0 deletions src/server/services/wms/qgswmsrenderer.cpp
Expand Up @@ -633,6 +633,23 @@ namespace QgsWms
// Set scales
exportSettings.predefinedMapScales = QgsLayoutUtils::predefinedScales( layout.get( ) );

// Settings from format options request parameters
exportSettings.writeGeoPdf = mWmsParameters.writeGeoPdf();
exportSettings.textRenderFormat = mWmsParameters.pdfTextRenderFormat();
exportSettings.forceVectorOutput = mWmsParameters.pdfForceVectorOutput();
exportSettings.appendGeoreference = mWmsParameters.pdfAppendGeoreference();
exportSettings.simplifyGeometries = mWmsParameters.pdfSimplifyGeometries();
exportSettings.useIso32000ExtensionFormatGeoreferencing = mWmsParameters.pdfUseIso32000ExtensionFormatGeoreferencing();
exportSettings.useOgcBestPracticeFormatGeoreferencing = mWmsParameters.pdfUseOgcBestPracticeFormatGeoreferencing();
if ( mWmsParameters.pdfLosslessImageCompression() )
{
exportSettings.flags |= QgsLayoutRenderContext::FlagLosslessImageRendering;
}
if ( mWmsParameters.pdfDisableTiledRasterRendering() )
{
exportSettings.flags |= QgsLayoutRenderContext::FlagDisableTiledRasterLayerRenders;
}

// Export all pages
if ( atlas )
{
Expand Down

0 comments on commit 45f7ebe

Please sign in to comment.