Skip to content

Commit 7230ec9

Browse files
committedJul 16, 2012
More changes for multipage print
1 parent b8932af commit 7230ec9

File tree

2 files changed

+97
-82
lines changed

2 files changed

+97
-82
lines changed
 

‎src/app/composer/qgscomposer.cpp

Lines changed: 93 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -592,75 +592,87 @@ void QgsComposer::print( QPrinter &printer )
592592
QApplication::setOverrideCursor( Qt::BusyCursor );
593593

594594
bool printAsRaster = mComposition->printAsRaster();
595-
//mView->setScene( 0 );
596595

597596
if ( printAsRaster )
598597
{
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 )
617599
{
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 )
626601
{
627-
mComposition->setPlotStyle( savedPlotStyle );
628-
return;
602+
printer.newPage();
629603
}
630604

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+
}
633629
}
634630
}
635631

636632
if ( !printAsRaster )
637633
{
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-
642634
mView->setPaintingEnabled( false );
643635
for ( int i = 0; i < mComposition->numPages(); ++i )
644636
{
645637
if ( i > 0 )
646638
{
647-
if ( !printer.newPage() )
648-
{
649-
return;
650-
}
639+
printer.newPage();
651640
}
652641
mComposition->renderPage( &p, i );
653642
}
654-
//mComposition->render( &p, paperRectPixel, paperRectMM );
655643
mView->setPaintingEnabled( true );
656644
}
657645

658646
mComposition->setPlotStyle( savedPlotStyle );
659647
QApplication::restoreOverrideCursor();
660648
}
661649

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+
662669
void QgsComposer::on_mActionExportAsImage_triggered()
663670
{
671+
if ( !mComposition )
672+
{
673+
return;
674+
}
675+
664676
if ( containsWMSLayer() )
665677
{
666678
showWMSPrintingWarning();
@@ -688,36 +700,25 @@ void QgsComposer::on_mActionExportAsImage_triggered()
688700

689701
QPair<QString, QString> fileNExt = QgisGui::getSaveAsImageName( this, tr( "Choose a file name to save the map image as" ) );
690702

691-
QgsDebugMsg( QString( "Selected filter: %1" ).arg( fileNExt.first ) );
692-
QgsDebugMsg( QString( "Image type: %1" ).arg( fileNExt.second ) );
693-
694703
if ( fileNExt.first.isEmpty() )
695-
return;
696-
697-
QImage image( QSize( width, height ), QImage::Format_ARGB32 );
698-
if ( image.isNull() )
699704
{
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 );
705705
return;
706706
}
707707

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+
}
721722
}
722723

723724

@@ -773,29 +774,39 @@ void QgsComposer::on_mActionExportAsSVG_triggered()
773774
settings.setValue( "/UI/lastSaveAsSvgFile", outputFileName );
774775
mComposition->setPlotStyle( QgsComposition::Print );
775776

776-
QSvgGenerator generator;
777+
mView->setPaintingEnabled( false );
778+
for ( int i = 0; i < mComposition->numPages(); ++i )
779+
{
780+
QSvgGenerator generator;
777781
#if QT_VERSION >= 0x040500
778-
generator.setTitle( QgsProject::instance()->title() );
782+
generator.setTitle( QgsProject::instance()->title() );
779783
#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 ) );
786799
#if QT_VERSION >= 0x040500
787-
generator.setViewBox( QRect( 0, 0, width, height ) );
800+
generator.setViewBox( QRect( 0, 0, width, height ) );
788801
#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
790803

791-
QPainter p( &generator );
804+
QPainter p( &generator );
792805

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+
}
799810
mView->setPaintingEnabled( true );
800811
}
801812

‎src/app/composer/qgscomposer.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,10 @@ class QgsComposer: public QMainWindow, private Ui::QgsComposerBase
283283
//! Print to a printer object
284284
void print( QPrinter &printer );
285285

286+
//! print composer page to image
287+
//! If the image does not fit into memory, a null image is returned
288+
QImage printPageAsRaster( int page );
289+
286290
//! Writes state under DOM element
287291
void writeXML( QDomNode& parentNode, QDomDocument& doc );
288292

0 commit comments

Comments
 (0)
Please sign in to comment.