Skip to content

Commit 5e6eef3

Browse files
committed
[layouts] Fix incorrect first page size in multipage layouts when
first page is skipped from output Fixes #18742
1 parent cc543d6 commit 5e6eef3

File tree

3 files changed

+65
-2
lines changed

3 files changed

+65
-2
lines changed

src/core/layout/qgslayoutexporter.cpp

+17-2
Original file line numberDiff line numberDiff line change
@@ -1024,7 +1024,7 @@ void QgsLayoutExporter::preparePrintAsPdf( QgsLayout *layout, QPrinter &printer,
10241024
// Also an issue with PDF paper size using QPrinter::NativeFormat on Mac (always outputs portrait letter-size)
10251025
printer.setOutputFormat( QPrinter::PdfFormat );
10261026

1027-
updatePrinterPageSize( layout, printer, 0 );
1027+
updatePrinterPageSize( layout, printer, firstPageToBeExported( layout ) );
10281028

10291029
// TODO: add option for this in layout
10301030
// May not work on Windows or non-X11 Linux. Works fine on Mac using QPrinter::NativeFormat
@@ -1043,7 +1043,7 @@ void QgsLayoutExporter::preparePrint( QgsLayout *layout, QPrinter &printer, bool
10431043

10441044
if ( setFirstPageSize )
10451045
{
1046-
updatePrinterPageSize( layout, printer, 0 );
1046+
updatePrinterPageSize( layout, printer, firstPageToBeExported( layout ) );
10471047
}
10481048
}
10491049

@@ -1566,6 +1566,21 @@ QImage QgsLayoutExporter::createImage( const QgsLayoutExporter::ImageExportSetti
15661566
}
15671567
}
15681568

1569+
int QgsLayoutExporter::firstPageToBeExported( QgsLayout *layout )
1570+
{
1571+
const int pageCount = layout->pageCollection()->pageCount();
1572+
for ( int i = 0; i < pageCount; ++i )
1573+
{
1574+
if ( !layout->pageCollection()->shouldExportPage( i ) )
1575+
{
1576+
continue;
1577+
}
1578+
1579+
return i;
1580+
}
1581+
return 0; // shouldn't really matter -- we aren't exporting ANY pages!
1582+
}
1583+
15691584
QString QgsLayoutExporter::generateFileName( const PageExportDetails &details ) const
15701585
{
15711586
if ( details.page == 0 )

src/core/layout/qgslayoutexporter.h

+6
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,12 @@ class CORE_EXPORT QgsLayoutExporter
496496

497497
QImage createImage( const ImageExportSettings &settings, int page, QRectF &bounds, bool &skipPage ) const;
498498

499+
/**
500+
* Returns the page number of the first page to be exported from the layout, skipping any pages
501+
* which have been excluded from export.
502+
*/
503+
static int firstPageToBeExported( QgsLayout *layout );
504+
499505
/**
500506
* Saves an image to a file, possibly using format specific options (e.g. LZW compression for tiff)
501507
*/

tests/src/python/test_qgslayoutexporter.py

+42
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,48 @@ def testExportToPdf(self):
463463
self.assertEqual(metadata['SUBJECT'], 'proj abstract')
464464
self.assertEqual(metadata['TITLE'], 'proj title')
465465

466+
def testExportToPdfSkipFirstPage(self):
467+
l = QgsLayout(QgsProject.instance())
468+
l.initializeDefaults()
469+
470+
# page 1 is excluded from export
471+
page1 = l.pageCollection().page(0)
472+
page1.setExcludeFromExports(True)
473+
474+
# add a second page
475+
page2 = QgsLayoutItemPage(l)
476+
page2.setPageSize('A5')
477+
l.pageCollection().addPage(page2)
478+
479+
item2 = QgsLayoutItemShape(l)
480+
item2.attemptSetSceneRect(QRectF(10, 20, 100, 150))
481+
item2.attemptMove(QgsLayoutPoint(10, 20), page=1)
482+
fill = QgsSimpleFillSymbolLayer()
483+
fill_symbol = QgsFillSymbol()
484+
fill_symbol.changeSymbolLayer(0, fill)
485+
fill.setColor(Qt.cyan)
486+
fill.setStrokeStyle(Qt.NoPen)
487+
item2.setSymbol(fill_symbol)
488+
l.addItem(item2)
489+
490+
exporter = QgsLayoutExporter(l)
491+
# setup settings
492+
settings = QgsLayoutExporter.PdfExportSettings()
493+
settings.dpi = 80
494+
settings.rasterizeWholeImage = False
495+
settings.forceVectorOutput = False
496+
settings.exportMetadata = True
497+
498+
pdf_file_path = os.path.join(self.basetestpath, 'test_exporttopdfdpi_skip_first.pdf')
499+
self.assertEqual(exporter.exportToPdf(pdf_file_path, settings), QgsLayoutExporter.Success)
500+
self.assertTrue(os.path.exists(pdf_file_path))
501+
502+
rendered_page_1 = os.path.join(self.basetestpath, 'test_exporttopdfdpi_skip_first.png')
503+
dpi = 80
504+
pdfToPng(pdf_file_path, rendered_page_1, dpi=dpi, page=1)
505+
506+
self.assertTrue(self.checkImage('test_exporttopdfdpi_skip_first', 'exporttopdfdpi_page2', rendered_page_1, size_tolerance=1))
507+
466508
def testExportToSvg(self):
467509
md = QgsProject.instance().metadata()
468510
md.setTitle('proj title')

0 commit comments

Comments
 (0)