|
36 | 36 | QgsFillSymbol)
|
37 | 37 | from qgis.PyQt.QtCore import QSize, QSizeF, QDir, QRectF, Qt
|
38 | 38 | from qgis.PyQt.QtGui import QImage, QPainter
|
| 39 | +from qgis.PyQt.QtSvg import QSvgRenderer, QSvgGenerator |
39 | 40 |
|
40 | 41 | from qgis.testing import start_app, unittest
|
41 | 42 |
|
@@ -91,6 +92,24 @@ def pdfToPng(pdf_file_path, rendered_file_path, page, dpi=96):
|
91 | 92 | "message: {2}".format(e.cmd, e.returncode, e.message))
|
92 | 93 |
|
93 | 94 |
|
| 95 | +def svgToPng(svg_file_path, rendered_file_path, width): |
| 96 | + svgr = QSvgRenderer(svg_file_path) |
| 97 | + |
| 98 | + height = width / svgr.viewBoxF().width() * svgr.viewBoxF().height() |
| 99 | + |
| 100 | + image = QImage(width, height, QImage.Format_ARGB32) |
| 101 | + image.fill(Qt.transparent) |
| 102 | + |
| 103 | + p = QPainter(image) |
| 104 | + p.setRenderHint(QPainter.Antialiasing, False) |
| 105 | + svgr.render(p) |
| 106 | + p.end() |
| 107 | + |
| 108 | + res = image.save(rendered_file_path, 'png') |
| 109 | + if not res: |
| 110 | + os.unlink(rendered_file_path) |
| 111 | + |
| 112 | + |
94 | 113 | start_app()
|
95 | 114 |
|
96 | 115 |
|
@@ -390,6 +409,58 @@ def testExportToPdf(self):
|
390 | 409 | self.assertTrue(self.checkImage('exporttopdfdpi_page1', 'exporttopdfdpi_page1', rendered_page_1, size_tolerance=1))
|
391 | 410 | self.assertTrue(self.checkImage('exporttopdfdpi_page2', 'exporttopdfdpi_page2', rendered_page_2, size_tolerance=1))
|
392 | 411 |
|
| 412 | + def testExportToSvg(self): |
| 413 | + l = QgsLayout(QgsProject.instance()) |
| 414 | + l.initializeDefaults() |
| 415 | + |
| 416 | + # add a second page |
| 417 | + page2 = QgsLayoutItemPage(l) |
| 418 | + page2.setPageSize('A5') |
| 419 | + l.pageCollection().addPage(page2) |
| 420 | + |
| 421 | + # add some items |
| 422 | + item1 = QgsLayoutItemShape(l) |
| 423 | + item1.attemptSetSceneRect(QRectF(10, 20, 100, 150)) |
| 424 | + fill = QgsSimpleFillSymbolLayer() |
| 425 | + fill_symbol = QgsFillSymbol() |
| 426 | + fill_symbol.changeSymbolLayer(0, fill) |
| 427 | + fill.setColor(Qt.green) |
| 428 | + fill.setStrokeStyle(Qt.NoPen) |
| 429 | + item1.setSymbol(fill_symbol) |
| 430 | + l.addItem(item1) |
| 431 | + |
| 432 | + item2 = QgsLayoutItemShape(l) |
| 433 | + item2.attemptSetSceneRect(QRectF(10, 20, 100, 150)) |
| 434 | + item2.attemptMove(QgsLayoutPoint(10, 20), page=1) |
| 435 | + fill = QgsSimpleFillSymbolLayer() |
| 436 | + fill_symbol = QgsFillSymbol() |
| 437 | + fill_symbol.changeSymbolLayer(0, fill) |
| 438 | + fill.setColor(Qt.cyan) |
| 439 | + fill.setStrokeStyle(Qt.NoPen) |
| 440 | + item2.setSymbol(fill_symbol) |
| 441 | + l.addItem(item2) |
| 442 | + |
| 443 | + exporter = QgsLayoutExporter(l) |
| 444 | + # setup settings |
| 445 | + settings = QgsLayoutExporter.SvgExportSettings() |
| 446 | + settings.dpi = 80 |
| 447 | + settings.forceVectorOutput = False |
| 448 | + |
| 449 | + svg_file_path = os.path.join(self.basetestpath, 'test_exporttosvgdpi.svg') |
| 450 | + svg_file_path_2 = os.path.join(self.basetestpath, 'test_exporttosvgdpi_2.svg') |
| 451 | + self.assertEqual(exporter.exportToSvg(svg_file_path, settings), QgsLayoutExporter.Success) |
| 452 | + self.assertTrue(os.path.exists(svg_file_path)) |
| 453 | + self.assertTrue(os.path.exists(svg_file_path_2)) |
| 454 | + |
| 455 | + rendered_page_1 = os.path.join(self.basetestpath, 'test_exporttosvgdpi.png') |
| 456 | + dpi = 80 |
| 457 | + svgToPng(svg_file_path, rendered_page_1, width=936) |
| 458 | + rendered_page_2 = os.path.join(self.basetestpath, 'test_exporttosvgdpi2.png') |
| 459 | + svgToPng(svg_file_path_2, rendered_page_2, width=467) |
| 460 | + |
| 461 | + self.assertTrue(self.checkImage('exporttosvgdpi_page1', 'exporttopdfdpi_page1', rendered_page_1, size_tolerance=1)) |
| 462 | + self.assertTrue(self.checkImage('exporttosvgdpi_page2', 'exporttopdfdpi_page2', rendered_page_2, size_tolerance=1)) |
| 463 | + |
393 | 464 | def testExportWorldFile(self):
|
394 | 465 | l = QgsLayout(QgsProject.instance())
|
395 | 466 | l.initializeDefaults()
|
|
0 commit comments