[SOLVED] PDF Print in multiple pages



  • Hello everyone,
    I'm trying to print data from QStringList into a PDF File using the QPrint Class. My function is like :
    QString pdfFile = QFileDialog::getSaveFileName(this, tr("Ouvrir fichier"), "/", tr("Fichier pdf (*.pdf)"));

    if(pdfFile.isEmpty())
    	return;
    
    int nbColonnes = header.size();
    int nbDonnees = donnees.size();
    
    QPrinter printer; //The QPrinter class is a paint device that paints on a printer
    printer.setOutputFormat(QPrinter::PdfFormat); 
    printer.setOrientation(QPrinter::Landscape); 
    printer.setPageSize(QPrinter::A4);
    
    //this can be also NativeFormat or PostScriptFormat
    //for details, read QPrinter class documentation
    printer.setOutputFileName(pdfFile);
    QPainter painter; //The QPainter class performs painting on widgets and other paint devices (such as QPrinter)
        
    //here we start painting to the printer
    if (!painter.begin(&printer))
    {
    	QMessageBox::critical(this, NAME_APP, "Fichier pdf non crée");
         return;
    }
    
    int x = 0;
    int y = 0;  
    
    QRect r;
    for (int k=0; k<nbColonnes; k++)
    {
    	// bilog-mh cf. TL-20819 : Paraméterer largeur des colonnes à afficher
    	if (k==0)
    		colonne_width = 70;
    	else if (k==1)
    		colonne_width = 130;
    	else if (k==2)
    		colonne_width = 150;
    	else if (k==3)
    		colonne_width = 700;
    
    	QRect required = QRect(); //this represent the required rectangled size
    	r = QRect(x, 0, colonne_width, 60); //this represent our calculated rectangle size
    	painter.drawRect(r);
    	//now we insert each string of the list into the rectangle
    	QString text = header.at(k);
    	//now we draw the text into the given rectangle, using word wrap option.
    	//the last parameter indicates a rectangle in which the text should be enclosed         
    	painter.drawText(r, Qt::AlignCenter | Qt::TextWordWrap, text, &required);
    	//if the calculated height is not enought for drawing the text, we should redraw all rectangles
    	 x += colonne_width;			  
    }
    
    x = 0;
    for (int k=0; k<nbDonnees; k++)
    {
    	// bilog-mh cf. TL-20819 : Paraméterer largeur des colonnes à afficher
    	switch ((k+1)%4)
    	{
    	case 1 :
    			colonne_width = 70;
    			break;
    	case 2:
    			colonne_width = 130;
    			break;
    	case 3 :
    			colonne_width = 150;
    			break;
    	case 0 :
    			colonne_width = 700;
    			break;
    	}
    		
    	if (k%nbColonnes == 0)
    	{
    		// bilog-mh cf. TL-20819 : si première ligne de données alors on retient le height de la ligne header
    		if (k== 0)
    			y += 60;
    		else
    			y += 200;
    		x = 0;
    	}
    
    	QRect required = QRect(); //this represent the required rectangled size
    	r = QRect(x, y, colonne_width, 200); //this represent our calculated rectangle size
    	painter.drawRect(r);
    	//now we insert each string of the list into the rectangle
    	QString txt = donnees.at(k);		
    	//now we draw the text into the given rectangle, using word wrap option.
    	//the last parameter indicates a rectangle in which the text should be enclosed         
    	painter.drawText(r, Qt::AlignJustify | Qt::TextWordWrap, txt, &required);
    
    	 x += colonne_width;		 
    	 
    	// bilog-mh cf. TL-20819 : si on atteint la fin de page, on insère un nouvelle page
    	if (y > printer.height())
    		printer.newPage();
    }
    painter.end();
    

    The problem is that only the first page display data and the other pages are blank.

    Does anyone have an idea what I'm wrong et tell me how to modify my function to display all data ?
    Many thanks in advance for your useful help.
    Best regards.



  • @mourad_bilog said:

    The problem is that only the first page display data and the other pages are blank.

    Is the first page printed correctly??

    Could you add a qDebug() line inside this statement to be sure is executed??

    if (y > printer.height())
        printer.newPage();
    

    like

    if (y > printer.height()) {
        qDebug() << "New Page";
        printer.newPage();
    }
    


  • Thanks for reply.

    I've verified it and the printer.newPage(); is executed. In fact, the output file have 77 pages but only the first page contains data and the others are all blank.



  • I'm not 100% sure but could you reset y=0 when you start a new page??



  • Ohhhh yeees.
    It's Ok :)
    Many thanks for your help



  • Ok,

    don't forget to mark the thread as solved (add [SOLVED] prefix to the thread title)


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.