mirror of
				https://github.com/qgis/QGIS.git
				synced 2025-11-04 00:04:25 -05:00 
			
		
		
		
	Push text format rendering setting into QgsLayoutExporter
This commit is contained in:
		
							parent
							
								
									6755cbd6cf
								
							
						
					
					
						commit
						ea069ed60e
					
				@ -188,6 +188,8 @@ Constructor for PdfExportSettings
 | 
			
		||||
 | 
			
		||||
      QgsLayoutRenderContext::Flags flags;
 | 
			
		||||
 | 
			
		||||
      QgsRenderContext::TextRenderFormat textRenderFormat;
 | 
			
		||||
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    ExportResult exportToPdf( const QString &filePath, const QgsLayoutExporter::PdfExportSettings &settings );
 | 
			
		||||
@ -286,6 +288,8 @@ Constructor for SvgExportSettings
 | 
			
		||||
 | 
			
		||||
      QgsLayoutRenderContext::Flags flags;
 | 
			
		||||
 | 
			
		||||
      QgsRenderContext::TextRenderFormat textRenderFormat;
 | 
			
		||||
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    ExportResult exportToSvg( const QString &filePath, const QgsLayoutExporter::SvgExportSettings &settings );
 | 
			
		||||
 | 
			
		||||
@ -299,6 +299,7 @@ class LayoutContextSettingsRestorer
 | 
			
		||||
      : mLayout( layout )
 | 
			
		||||
      , mPreviousDpi( layout->renderContext().dpi() )
 | 
			
		||||
      , mPreviousFlags( layout->renderContext().flags() )
 | 
			
		||||
      , mPreviousTextFormat( layout->renderContext().textRenderFormat() )
 | 
			
		||||
      , mPreviousExportLayer( layout->renderContext().currentExportLayer() )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
@ -307,6 +308,7 @@ class LayoutContextSettingsRestorer
 | 
			
		||||
    {
 | 
			
		||||
      mLayout->renderContext().setDpi( mPreviousDpi );
 | 
			
		||||
      mLayout->renderContext().setFlags( mPreviousFlags );
 | 
			
		||||
      mLayout->renderContext().setTextRenderFormat( mPreviousTextFormat );
 | 
			
		||||
      mLayout->renderContext().setCurrentExportLayer( mPreviousExportLayer );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -317,6 +319,7 @@ class LayoutContextSettingsRestorer
 | 
			
		||||
    QgsLayout *mLayout = nullptr;
 | 
			
		||||
    double mPreviousDpi = 0;
 | 
			
		||||
    QgsLayoutRenderContext::Flags mPreviousFlags = nullptr;
 | 
			
		||||
    QgsRenderContext::TextRenderFormat mPreviousTextFormat = QgsRenderContext::TextFormatAlwaysOutlines;
 | 
			
		||||
    int mPreviousExportLayer = 0;
 | 
			
		||||
};
 | 
			
		||||
///@endcond PRIVATE
 | 
			
		||||
@ -496,6 +499,8 @@ QgsLayoutExporter::ExportResult QgsLayoutExporter::exportToPdf( const QString &f
 | 
			
		||||
 | 
			
		||||
  mLayout->renderContext().setFlag( QgsLayoutRenderContext::FlagForceVectorOutput, settings.forceVectorOutput );
 | 
			
		||||
 | 
			
		||||
  mLayout->renderContext().setTextRenderFormat( settings.textRenderFormat );
 | 
			
		||||
 | 
			
		||||
  QPrinter printer;
 | 
			
		||||
  preparePrintAsPdf( mLayout, printer, filePath );
 | 
			
		||||
  preparePrint( mLayout, printer, false );
 | 
			
		||||
@ -565,6 +570,8 @@ QgsLayoutExporter::ExportResult QgsLayoutExporter::exportToPdf( QgsAbstractLayou
 | 
			
		||||
 | 
			
		||||
    iterator->layout()->renderContext().setFlag( QgsLayoutRenderContext::FlagForceVectorOutput, settings.forceVectorOutput );
 | 
			
		||||
 | 
			
		||||
    iterator->layout()->renderContext().setTextRenderFormat( settings.textRenderFormat );
 | 
			
		||||
 | 
			
		||||
    if ( first )
 | 
			
		||||
    {
 | 
			
		||||
      preparePrintAsPdf( iterator->layout(), printer, fileName );
 | 
			
		||||
@ -780,6 +787,7 @@ QgsLayoutExporter::ExportResult QgsLayoutExporter::exportToSvg( const QString &f
 | 
			
		||||
  mLayout->renderContext().setDpi( settings.dpi );
 | 
			
		||||
 | 
			
		||||
  mLayout->renderContext().setFlag( QgsLayoutRenderContext::FlagForceVectorOutput, settings.forceVectorOutput );
 | 
			
		||||
  mLayout->renderContext().setTextRenderFormat( s.textRenderFormat );
 | 
			
		||||
 | 
			
		||||
  QFileInfo fi( filePath );
 | 
			
		||||
  PageExportDetails pageDetails;
 | 
			
		||||
 | 
			
		||||
@ -278,6 +278,14 @@ class CORE_EXPORT QgsLayoutExporter
 | 
			
		||||
       */
 | 
			
		||||
      QgsLayoutRenderContext::Flags flags = nullptr;
 | 
			
		||||
 | 
			
		||||
      /**
 | 
			
		||||
       * Text rendering format, which controls how text should be rendered in the export (e.g.
 | 
			
		||||
       * as paths or real text objects).
 | 
			
		||||
       *
 | 
			
		||||
       * \since QGIS 3.4.3
 | 
			
		||||
       */
 | 
			
		||||
      QgsRenderContext::TextRenderFormat textRenderFormat = QgsRenderContext::TextFormatAlwaysOutlines;
 | 
			
		||||
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@ -417,6 +425,14 @@ class CORE_EXPORT QgsLayoutExporter
 | 
			
		||||
       */
 | 
			
		||||
      QgsLayoutRenderContext::Flags flags = nullptr;
 | 
			
		||||
 | 
			
		||||
      /**
 | 
			
		||||
       * Text rendering format, which controls how text should be rendered in the export (e.g.
 | 
			
		||||
       * as paths or real text objects).
 | 
			
		||||
       *
 | 
			
		||||
       * \since QGIS 3.4.3
 | 
			
		||||
       */
 | 
			
		||||
      QgsRenderContext::TextRenderFormat textRenderFormat = QgsRenderContext::TextFormatAlwaysOutlines;
 | 
			
		||||
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 | 
			
		||||
@ -31,6 +31,7 @@ from qgis.core import (QgsMultiRenderChecker,
 | 
			
		||||
                       QgsRectangle,
 | 
			
		||||
                       QgsLayoutItemPage,
 | 
			
		||||
                       QgsLayoutItemMap,
 | 
			
		||||
                       QgsLayoutItemScaleBar,
 | 
			
		||||
                       QgsLayoutPoint,
 | 
			
		||||
                       QgsLayoutMeasurement,
 | 
			
		||||
                       QgsUnitTypes,
 | 
			
		||||
@ -40,6 +41,7 @@ from qgis.core import (QgsMultiRenderChecker,
 | 
			
		||||
                       QgsCoordinateReferenceSystem,
 | 
			
		||||
                       QgsPrintLayout,
 | 
			
		||||
                       QgsSingleSymbolRenderer,
 | 
			
		||||
                       QgsRenderContext,
 | 
			
		||||
                       QgsReport)
 | 
			
		||||
from qgis.PyQt.QtCore import QSize, QSizeF, QDir, QRectF, Qt, QDateTime, QDate, QTime, QTimeZone
 | 
			
		||||
from qgis.PyQt.QtGui import QImage, QPainter
 | 
			
		||||
@ -615,6 +617,53 @@ class TestQgsLayoutExporter(unittest.TestCase):
 | 
			
		||||
        for f in [svg_file_path, svg_file_path_2]:
 | 
			
		||||
            checkMetadata(f, False)
 | 
			
		||||
 | 
			
		||||
    def testExportToSvgTextRenderFormat(self):
 | 
			
		||||
        l = QgsLayout(QgsProject.instance())
 | 
			
		||||
        l.initializeDefaults()
 | 
			
		||||
 | 
			
		||||
        # add a map and scalebar
 | 
			
		||||
        mapitem = QgsLayoutItemMap(l)
 | 
			
		||||
        mapitem.attemptSetSceneRect(QRectF(110, 120, 200, 250))
 | 
			
		||||
        mapitem.zoomToExtent(QgsRectangle(1, 1, 10, 10))
 | 
			
		||||
        mapitem.setScale(666)  # unlikely to appear in the SVG by accident... unless... oh no! RUN!
 | 
			
		||||
        l.addItem(mapitem)
 | 
			
		||||
 | 
			
		||||
        item1 = QgsLayoutItemScaleBar(l)
 | 
			
		||||
        item1.attemptSetSceneRect(QRectF(10, 20, 100, 150))
 | 
			
		||||
        item1.setLinkedMap(mapitem)
 | 
			
		||||
        item1.setStyle('Numeric')
 | 
			
		||||
        l.addItem(item1)
 | 
			
		||||
 | 
			
		||||
        exporter = QgsLayoutExporter(l)
 | 
			
		||||
        # setup settings
 | 
			
		||||
        settings = QgsLayoutExporter.SvgExportSettings()
 | 
			
		||||
        settings.dpi = 80
 | 
			
		||||
        settings.forceVectorOutput = False
 | 
			
		||||
        settings.exportMetadata = True
 | 
			
		||||
        settings.textRenderFormat = QgsRenderContext.TextFormatAlwaysText
 | 
			
		||||
 | 
			
		||||
        svg_file_path = os.path.join(self.basetestpath, 'test_exporttosvgtextformattext.svg')
 | 
			
		||||
        self.assertEqual(exporter.exportToSvg(svg_file_path, settings), QgsLayoutExporter.Success)
 | 
			
		||||
        self.assertTrue(os.path.exists(svg_file_path))
 | 
			
		||||
 | 
			
		||||
        # expect svg to contain a text object with the scale
 | 
			
		||||
        with open(svg_file_path, 'r') as f:
 | 
			
		||||
            lines = ''.join(f.readlines())
 | 
			
		||||
        self.assertIn('<text', lines)
 | 
			
		||||
        self.assertIn('>1:666<', lines)
 | 
			
		||||
 | 
			
		||||
        # force use of outlines
 | 
			
		||||
        os.unlink(svg_file_path)
 | 
			
		||||
        settings.textRenderFormat = QgsRenderContext.TextFormatAlwaysOutlines
 | 
			
		||||
        self.assertEqual(exporter.exportToSvg(svg_file_path, settings), QgsLayoutExporter.Success)
 | 
			
		||||
        self.assertTrue(os.path.exists(svg_file_path))
 | 
			
		||||
 | 
			
		||||
        # expect svg NOT to contain a text object with the scale
 | 
			
		||||
        with open(svg_file_path, 'r') as f:
 | 
			
		||||
            lines = ''.join(f.readlines())
 | 
			
		||||
        self.assertNotIn('<text', lines)
 | 
			
		||||
        self.assertNotIn('>1:666<', lines)
 | 
			
		||||
 | 
			
		||||
    def testPrint(self):
 | 
			
		||||
        l = QgsLayout(QgsProject.instance())
 | 
			
		||||
        l.initializeDefaults()
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user