Skip to content

Commit ea069ed

Browse files
committed
Push text format rendering setting into QgsLayoutExporter
1 parent 6755cbd commit ea069ed

File tree

4 files changed

+77
-0
lines changed

4 files changed

+77
-0
lines changed

python/core/auto_generated/layout/qgslayoutexporter.sip.in

+4
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,8 @@ Constructor for PdfExportSettings
188188

189189
QgsLayoutRenderContext::Flags flags;
190190

191+
QgsRenderContext::TextRenderFormat textRenderFormat;
192+
191193
};
192194

193195
ExportResult exportToPdf( const QString &filePath, const QgsLayoutExporter::PdfExportSettings &settings );
@@ -286,6 +288,8 @@ Constructor for SvgExportSettings
286288

287289
QgsLayoutRenderContext::Flags flags;
288290

291+
QgsRenderContext::TextRenderFormat textRenderFormat;
292+
289293
};
290294

291295
ExportResult exportToSvg( const QString &filePath, const QgsLayoutExporter::SvgExportSettings &settings );

src/core/layout/qgslayoutexporter.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,7 @@ class LayoutContextSettingsRestorer
299299
: mLayout( layout )
300300
, mPreviousDpi( layout->renderContext().dpi() )
301301
, mPreviousFlags( layout->renderContext().flags() )
302+
, mPreviousTextFormat( layout->renderContext().textRenderFormat() )
302303
, mPreviousExportLayer( layout->renderContext().currentExportLayer() )
303304
{
304305
}
@@ -307,6 +308,7 @@ class LayoutContextSettingsRestorer
307308
{
308309
mLayout->renderContext().setDpi( mPreviousDpi );
309310
mLayout->renderContext().setFlags( mPreviousFlags );
311+
mLayout->renderContext().setTextRenderFormat( mPreviousTextFormat );
310312
mLayout->renderContext().setCurrentExportLayer( mPreviousExportLayer );
311313
}
312314

@@ -317,6 +319,7 @@ class LayoutContextSettingsRestorer
317319
QgsLayout *mLayout = nullptr;
318320
double mPreviousDpi = 0;
319321
QgsLayoutRenderContext::Flags mPreviousFlags = nullptr;
322+
QgsRenderContext::TextRenderFormat mPreviousTextFormat = QgsRenderContext::TextFormatAlwaysOutlines;
320323
int mPreviousExportLayer = 0;
321324
};
322325
///@endcond PRIVATE
@@ -496,6 +499,8 @@ QgsLayoutExporter::ExportResult QgsLayoutExporter::exportToPdf( const QString &f
496499

497500
mLayout->renderContext().setFlag( QgsLayoutRenderContext::FlagForceVectorOutput, settings.forceVectorOutput );
498501

502+
mLayout->renderContext().setTextRenderFormat( settings.textRenderFormat );
503+
499504
QPrinter printer;
500505
preparePrintAsPdf( mLayout, printer, filePath );
501506
preparePrint( mLayout, printer, false );
@@ -565,6 +570,8 @@ QgsLayoutExporter::ExportResult QgsLayoutExporter::exportToPdf( QgsAbstractLayou
565570

566571
iterator->layout()->renderContext().setFlag( QgsLayoutRenderContext::FlagForceVectorOutput, settings.forceVectorOutput );
567572

573+
iterator->layout()->renderContext().setTextRenderFormat( settings.textRenderFormat );
574+
568575
if ( first )
569576
{
570577
preparePrintAsPdf( iterator->layout(), printer, fileName );
@@ -780,6 +787,7 @@ QgsLayoutExporter::ExportResult QgsLayoutExporter::exportToSvg( const QString &f
780787
mLayout->renderContext().setDpi( settings.dpi );
781788

782789
mLayout->renderContext().setFlag( QgsLayoutRenderContext::FlagForceVectorOutput, settings.forceVectorOutput );
790+
mLayout->renderContext().setTextRenderFormat( s.textRenderFormat );
783791

784792
QFileInfo fi( filePath );
785793
PageExportDetails pageDetails;

src/core/layout/qgslayoutexporter.h

+16
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,14 @@ class CORE_EXPORT QgsLayoutExporter
278278
*/
279279
QgsLayoutRenderContext::Flags flags = nullptr;
280280

281+
/**
282+
* Text rendering format, which controls how text should be rendered in the export (e.g.
283+
* as paths or real text objects).
284+
*
285+
* \since QGIS 3.4.3
286+
*/
287+
QgsRenderContext::TextRenderFormat textRenderFormat = QgsRenderContext::TextFormatAlwaysOutlines;
288+
281289
};
282290

283291
/**
@@ -417,6 +425,14 @@ class CORE_EXPORT QgsLayoutExporter
417425
*/
418426
QgsLayoutRenderContext::Flags flags = nullptr;
419427

428+
/**
429+
* Text rendering format, which controls how text should be rendered in the export (e.g.
430+
* as paths or real text objects).
431+
*
432+
* \since QGIS 3.4.3
433+
*/
434+
QgsRenderContext::TextRenderFormat textRenderFormat = QgsRenderContext::TextFormatAlwaysOutlines;
435+
420436
};
421437

422438
/**

tests/src/python/test_qgslayoutexporter.py

+49
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
QgsRectangle,
3232
QgsLayoutItemPage,
3333
QgsLayoutItemMap,
34+
QgsLayoutItemScaleBar,
3435
QgsLayoutPoint,
3536
QgsLayoutMeasurement,
3637
QgsUnitTypes,
@@ -40,6 +41,7 @@
4041
QgsCoordinateReferenceSystem,
4142
QgsPrintLayout,
4243
QgsSingleSymbolRenderer,
44+
QgsRenderContext,
4345
QgsReport)
4446
from qgis.PyQt.QtCore import QSize, QSizeF, QDir, QRectF, Qt, QDateTime, QDate, QTime, QTimeZone
4547
from qgis.PyQt.QtGui import QImage, QPainter
@@ -615,6 +617,53 @@ def checkMetadata(f, expected):
615617
for f in [svg_file_path, svg_file_path_2]:
616618
checkMetadata(f, False)
617619

620+
def testExportToSvgTextRenderFormat(self):
621+
l = QgsLayout(QgsProject.instance())
622+
l.initializeDefaults()
623+
624+
# add a map and scalebar
625+
mapitem = QgsLayoutItemMap(l)
626+
mapitem.attemptSetSceneRect(QRectF(110, 120, 200, 250))
627+
mapitem.zoomToExtent(QgsRectangle(1, 1, 10, 10))
628+
mapitem.setScale(666) # unlikely to appear in the SVG by accident... unless... oh no! RUN!
629+
l.addItem(mapitem)
630+
631+
item1 = QgsLayoutItemScaleBar(l)
632+
item1.attemptSetSceneRect(QRectF(10, 20, 100, 150))
633+
item1.setLinkedMap(mapitem)
634+
item1.setStyle('Numeric')
635+
l.addItem(item1)
636+
637+
exporter = QgsLayoutExporter(l)
638+
# setup settings
639+
settings = QgsLayoutExporter.SvgExportSettings()
640+
settings.dpi = 80
641+
settings.forceVectorOutput = False
642+
settings.exportMetadata = True
643+
settings.textRenderFormat = QgsRenderContext.TextFormatAlwaysText
644+
645+
svg_file_path = os.path.join(self.basetestpath, 'test_exporttosvgtextformattext.svg')
646+
self.assertEqual(exporter.exportToSvg(svg_file_path, settings), QgsLayoutExporter.Success)
647+
self.assertTrue(os.path.exists(svg_file_path))
648+
649+
# expect svg to contain a text object with the scale
650+
with open(svg_file_path, 'r') as f:
651+
lines = ''.join(f.readlines())
652+
self.assertIn('<text', lines)
653+
self.assertIn('>1:666<', lines)
654+
655+
# force use of outlines
656+
os.unlink(svg_file_path)
657+
settings.textRenderFormat = QgsRenderContext.TextFormatAlwaysOutlines
658+
self.assertEqual(exporter.exportToSvg(svg_file_path, settings), QgsLayoutExporter.Success)
659+
self.assertTrue(os.path.exists(svg_file_path))
660+
661+
# expect svg NOT to contain a text object with the scale
662+
with open(svg_file_path, 'r') as f:
663+
lines = ''.join(f.readlines())
664+
self.assertNotIn('<text', lines)
665+
self.assertNotIn('>1:666<', lines)
666+
618667
def testPrint(self):
619668
l = QgsLayout(QgsProject.instance())
620669
l.initializeDefaults()

0 commit comments

Comments
 (0)