@@ -592,75 +592,87 @@ void QgsComposer::print( QPrinter &printer )
592
592
QApplication::setOverrideCursor ( Qt::BusyCursor );
593
593
594
594
bool printAsRaster = mComposition ->printAsRaster ();
595
- // mView->setScene( 0 );
596
595
597
596
if ( printAsRaster )
598
597
{
599
- // print out via QImage, code copied from on_mActionExportAsImage_activated
600
- int width = ( int )( mComposition ->printResolution () * mComposition ->paperWidth () / 25.4 );
601
- int height = ( int )( mComposition -> printResolution () * mComposition ->paperHeight () / 25.4 );
602
- QImage image ( QSize ( width, height ), QImage::Format_ARGB32 );
603
- if ( !image.isNull () )
604
- {
605
- image.setDotsPerMeterX ( mComposition ->printResolution () / 25.4 * 1000 );
606
- image.setDotsPerMeterY ( mComposition ->printResolution () / 25.4 * 1000 );
607
- image.fill ( 0 );
608
- QPainter imagePainter ( &image );
609
- QRectF sourceArea ( 0 , 0 , mComposition ->paperWidth (), mComposition ->paperHeight () );
610
- QRectF targetArea ( 0 , 0 , width, height );
611
- mView ->setPaintingEnabled ( false );
612
- mComposition ->render ( &imagePainter, targetArea, sourceArea );
613
- mView ->setPaintingEnabled ( true );
614
- p.drawImage ( targetArea, image, targetArea );
615
- }
616
- else
598
+ for ( int i = 0 ; i < mComposition ->numPages (); ++i )
617
599
{
618
- QApplication::restoreOverrideCursor ();
619
- int answer = QMessageBox::warning ( 0 ,
620
- tr ( " Image too large" ),
621
- tr ( " Creation of image with %1x%2 pixels failed. Retry without 'Print As Raster'?" )
622
- .arg ( width ).arg ( height ),
623
- QMessageBox::Ok | QMessageBox::Cancel,
624
- QMessageBox::Ok );
625
- if ( answer == QMessageBox::Cancel )
600
+ if ( i > 0 )
626
601
{
627
- mComposition ->setPlotStyle ( savedPlotStyle );
628
- return ;
602
+ printer.newPage ();
629
603
}
630
604
631
- QApplication::setOverrideCursor ( Qt::BusyCursor );
632
- printAsRaster = false ;
605
+ QImage image = printPageAsRaster ( i );
606
+
607
+ if ( image.isNull () )
608
+ {
609
+ QApplication::restoreOverrideCursor ();
610
+ int answer = QMessageBox::warning ( 0 ,
611
+ tr ( " Image too large" ),
612
+ tr ( " Creation of image failed. Retry without 'Print As Raster'?" ),
613
+ QMessageBox::Ok | QMessageBox::Cancel,
614
+ QMessageBox::Ok );
615
+ if ( answer == QMessageBox::Cancel )
616
+ {
617
+ mComposition ->setPlotStyle ( savedPlotStyle );
618
+ return ;
619
+ }
620
+
621
+ QApplication::setOverrideCursor ( Qt::BusyCursor );
622
+ printAsRaster = false ;
623
+ }
624
+ else
625
+ {
626
+ QRectF targetArea ( 0 , 0 , image.width (), image.height () );
627
+ p.drawImage ( targetArea, image, targetArea );
628
+ }
633
629
}
634
630
}
635
631
636
632
if ( !printAsRaster )
637
633
{
638
- // better in case of custom page size, but only possible with Qt>=4.4.0
639
- QRectF paperRectMM = printer.pageRect ( QPrinter::Millimeter );
640
- QRectF paperRectPixel = printer.pageRect ( QPrinter::DevicePixel );
641
-
642
634
mView ->setPaintingEnabled ( false );
643
635
for ( int i = 0 ; i < mComposition ->numPages (); ++i )
644
636
{
645
637
if ( i > 0 )
646
638
{
647
- if ( !printer.newPage () )
648
- {
649
- return ;
650
- }
639
+ printer.newPage ();
651
640
}
652
641
mComposition ->renderPage ( &p, i );
653
642
}
654
- // mComposition->render( &p, paperRectPixel, paperRectMM );
655
643
mView ->setPaintingEnabled ( true );
656
644
}
657
645
658
646
mComposition ->setPlotStyle ( savedPlotStyle );
659
647
QApplication::restoreOverrideCursor ();
660
648
}
661
649
650
+ QImage QgsComposer::printPageAsRaster ( int page )
651
+ {
652
+ // print out via QImage, code copied from on_mActionExportAsImage_activated
653
+ int width = ( int )( mComposition ->printResolution () * mComposition ->paperWidth () / 25.4 );
654
+ int height = ( int )( mComposition -> printResolution () * mComposition ->paperHeight () / 25.4 );
655
+ QImage image ( QSize ( width, height ), QImage::Format_ARGB32 );
656
+ if ( !image.isNull () )
657
+ {
658
+ image.setDotsPerMeterX ( mComposition ->printResolution () / 25.4 * 1000 );
659
+ image.setDotsPerMeterY ( mComposition ->printResolution () / 25.4 * 1000 );
660
+ image.fill ( 0 );
661
+ QPainter imagePainter ( &image );
662
+ mView ->setPaintingEnabled ( false );
663
+ mComposition ->renderPage ( &imagePainter, page );
664
+ mView ->setPaintingEnabled ( true );
665
+ }
666
+ return image;
667
+ }
668
+
662
669
void QgsComposer::on_mActionExportAsImage_triggered ()
663
670
{
671
+ if ( !mComposition )
672
+ {
673
+ return ;
674
+ }
675
+
664
676
if ( containsWMSLayer () )
665
677
{
666
678
showWMSPrintingWarning ();
@@ -688,36 +700,25 @@ void QgsComposer::on_mActionExportAsImage_triggered()
688
700
689
701
QPair<QString, QString> fileNExt = QgisGui::getSaveAsImageName ( this , tr ( " Choose a file name to save the map image as" ) );
690
702
691
- QgsDebugMsg ( QString ( " Selected filter: %1" ).arg ( fileNExt.first ) );
692
- QgsDebugMsg ( QString ( " Image type: %1" ).arg ( fileNExt.second ) );
693
-
694
703
if ( fileNExt.first .isEmpty () )
695
- return ;
696
-
697
- QImage image ( QSize ( width, height ), QImage::Format_ARGB32 );
698
- if ( image.isNull () )
699
704
{
700
- QMessageBox::warning ( 0 ,
701
- tr ( " Image too big" ),
702
- tr ( " Creation of image with %1x%2 pixels failed. Export aborted." )
703
- .arg ( width ).arg ( height ),
704
- QMessageBox::Ok );
705
705
return ;
706
706
}
707
707
708
- mComposition ->setPlotStyle ( QgsComposition::Print );
709
- image.setDotsPerMeterX ( mComposition ->printResolution () / 25.4 * 1000 );
710
- image.setDotsPerMeterY ( mComposition ->printResolution () / 25.4 * 1000 );
711
- image.fill ( 0 );
712
- QPainter p ( &image );
713
- QRectF sourceArea ( 0 , 0 , mComposition ->paperWidth (), mComposition ->paperHeight () );
714
- QRectF targetArea ( 0 , 0 , width, height );
715
- mView ->setPaintingEnabled ( false );
716
- mComposition ->render ( &p, targetArea, sourceArea );
717
- p.end ();
718
- mComposition ->setPlotStyle ( QgsComposition::Preview );
719
- mView ->setPaintingEnabled ( true );
720
- image.save ( fileNExt.first , fileNExt.second .toLocal8Bit ().constData () );
708
+ for ( int i = 0 ; i < mComposition ->numPages (); ++i )
709
+ {
710
+ QImage image = printPageAsRaster ( i );
711
+ if ( i == 0 )
712
+ {
713
+ image.save ( fileNExt.first , fileNExt.second .toLocal8Bit ().constData () );
714
+ }
715
+ else
716
+ {
717
+ QFileInfo fi ( fileNExt.first );
718
+ QString outputFilePath = fi.absolutePath () + " /" + fi.baseName () + " _" + QString::number ( i + 1 ) + " ." + fi.suffix ();
719
+ image.save ( outputFilePath, fileNExt.second .toLocal8Bit ().constData () );
720
+ }
721
+ }
721
722
}
722
723
723
724
@@ -773,29 +774,39 @@ void QgsComposer::on_mActionExportAsSVG_triggered()
773
774
settings.setValue ( " /UI/lastSaveAsSvgFile" , outputFileName );
774
775
mComposition ->setPlotStyle ( QgsComposition::Print );
775
776
776
- QSvgGenerator generator;
777
+ mView ->setPaintingEnabled ( false );
778
+ for ( int i = 0 ; i < mComposition ->numPages (); ++i )
779
+ {
780
+ QSvgGenerator generator;
777
781
#if QT_VERSION >= 0x040500
778
- generator.setTitle ( QgsProject::instance ()->title () );
782
+ generator.setTitle ( QgsProject::instance ()->title () );
779
783
#endif
780
- generator.setFileName ( outputFileName );
781
- // width in pixel
782
- int width = ( int )( mComposition ->paperWidth () * mComposition ->printResolution () / 25.4 );
783
- // height in pixel
784
- int height = ( int )( mComposition ->paperHeight () * mComposition ->printResolution () / 25.4 );
785
- generator.setSize ( QSize ( width, height ) );
784
+ if ( i == 0 )
785
+ {
786
+ generator.setFileName ( outputFileName );
787
+ }
788
+ else
789
+ {
790
+ QFileInfo fi ( outputFileName );
791
+ generator.setFileName ( fi.absolutePath () + " /" + fi.baseName () + " _" + QString::number ( i + 1 ) + " ." + fi.suffix () );
792
+ }
793
+
794
+ // width in pixel
795
+ int width = ( int )( mComposition ->paperWidth () * mComposition ->printResolution () / 25.4 );
796
+ // height in pixel
797
+ int height = ( int )( mComposition ->paperHeight () * mComposition ->printResolution () / 25.4 );
798
+ generator.setSize ( QSize ( width, height ) );
786
799
#if QT_VERSION >= 0x040500
787
- generator.setViewBox ( QRect ( 0 , 0 , width, height ) );
800
+ generator.setViewBox ( QRect ( 0 , 0 , width, height ) );
788
801
#endif
789
- generator.setResolution ( mComposition ->printResolution () ); // because the rendering is done in mm, convert the dpi
802
+ generator.setResolution ( mComposition ->printResolution () ); // because the rendering is done in mm, convert the dpi
790
803
791
- QPainter p ( &generator );
804
+ QPainter p ( &generator );
792
805
793
- QRectF sourceArea ( 0 , 0 , mComposition ->paperWidth (), mComposition ->paperHeight () );
794
- QRectF targetArea ( 0 , 0 , width, height );
795
- mView ->setPaintingEnabled ( false );
796
- mComposition ->render ( &p, targetArea, sourceArea );
797
- p.end ();
798
- mComposition ->setPlotStyle ( QgsComposition::Preview );
806
+ mComposition ->renderPage ( &p, i );
807
+ p.end ();
808
+ mComposition ->setPlotStyle ( QgsComposition::Preview );
809
+ }
799
810
mView ->setPaintingEnabled ( true );
800
811
}
801
812
0 commit comments