Qt使用QPDFWriter和QPainter生成PDF的問題

由於項目上有需要,這幾天在研究Qt生成PDF。但是遇到問題,繪製第二頁的時候,同一座標和尺寸,與第一頁的表現完全不一致。


	QFile pdfFile(QCoreApplication::applicationDirPath() + "/test.pdf");
	pdfFile.open(QIODevice::WriteOnly);
	QPdfWriter* pWriter = new QPdfWriter(&pdfFile);
	QPainter* pPainter = new QPainter(pWriter); 
  
  	//Init Page
	pWriter->setPageSize(QPagedPaintDevice::A4); 
	pWriter->setResolution(300);
	pWriter->setPageMargins(QMarginsF(0, 0, 0, 0)); 

	//Init Font
	QFont font;
	font.setFamily("simhei.ttf");
	font.setPointSize(16);
	pPainter->setFont(font);

	//Painter PDF  
	int nLeft = 40; 
	int nPDFWidth = pPainter->viewport().width(); 
	int nPDFHeight = pPainter->viewport().height(); 

	int nWidth = pPainter->viewport().width() - nLeft * 2;
	int nHeight = pPainter->viewport().height() - 1000;   
	  
	pPainter->drawText(QRect(50, 150, nWidth, 200), Qt::AlignHCenter | Qt::AlignBottom,
	QStringLiteral("這是一個測試")); 
	pPainter->drawPixmap(50, 10, 200, 100, QPixmap("E:/Work/Resource/777.png")); 
  
  	pWriter->newPage();
 	pPainter->drawText(QRect(50, 150, nWidth, 200), Qt::AlignHCenter | Qt::AlignBottom,
	QStringLiteral("這是一個測試"));  
	pPainter->drawPixmap(50, 10, 200, 100, QPixmap("E:/Work/Resource/777.png"));

	pWriter->newPage();
	pPainter->drawText(QRect(50, 150, nWidth, 200), Qt::AlignHCenter | Qt::AlignBottom,
	QStringLiteral("這是一個測試"));  
	pPainter->drawPixmap(50, 10, 200, 100, QPixmap("E:/Work/Resource/777.png"));

	pWriter->newPage();
	pPainter->drawText(QRect(50, 150, nWidth, 200), Qt::AlignHCenter | Qt::AlignBottom,
	QStringLiteral("這是一個測試")); 
	pPainter->drawPixmap(50, 10, 200, 100, QPixmap("E:/Work/Resource/777.png")); 
 
 	//繪製完畢
	delete pPainter;
	delete pWriter; 
	//Close File
	pdfFile.close();  

苦惱了很久,最終發現是初始化QPainter的時候出了問題
以下兩行都會對QPainter進行初始化:

  初始化第一頁的QPainter: 
  QPainter* pPainter = new QPainter(pWriter); 
  初始化後續頁的QPainter: 
  pWriter->newPage(); 

初始化QPainter之前,QPDFWriter的屬性必須已經設置好,否則座標系會紊亂,除非格式有更改,同一個PDF文件只需設置一次

	pWriter->setPageSize(QPagedPaintDevice::A4); //頁面尺寸
	pWriter->setResolution(300);//分辨率
	pWriter->setPageMargins(QMarginsF(0, 0, 0, 0)); //邊框

更改後的代碼:

	QFile pdfFile(QCoreApplication::applicationDirPath() + "/test.pdf");
	pdfFile.open(QIODevice::WriteOnly);
	QPdfWriter* pWriter = new QPdfWriter(&pdfFile);
  
  	//Init Page
	pWriter->setPageSize(QPagedPaintDevice::A4); 
	pWriter->setResolution(300);
	pWriter->setPageMargins(QMarginsF(0, 0, 0, 0));  
 
 	//設置好QPDFWriter之後再初始化QPainter
	QPainter* pPainter = new QPainter(pWriter); 

	//Init Font
	QFont font;
	font.setFamily("simhei.ttf");
	font.setPointSize(16);
	pPainter->setFont(font);

	//Painter PDF  
	int nLeft = 40; 
	int nPDFWidth = pPainter->viewport().width(); 
	int nPDFHeight = pPainter->viewport().height(); 

	int nWidth = pPainter->viewport().width() - nLeft * 2;
	int nHeight = pPainter->viewport().height() - 1000;   
	   
	pPainter->drawText(QRect(50, 150, nWidth, 200), Qt::AlignHCenter | Qt::AlignBottom,
	QStringLiteral("這是一個測試")); 
	pPainter->drawPixmap(50, 10, 200, 100, QPixmap("E:/Work/Resource/777.png"));  
	 
	//由於之前已經對QPDFWriter進行過設置,且格式沒有更改, 此處無需再設置QPDFWriter
 	pWriter->newPage();
 	pPainter->drawText(QRect(50, 150, nWidth, 200), Qt::AlignHCenter | Qt::AlignBottom,
	QStringLiteral("這是一個測試"));  
	pPainter->drawPixmap(50, 10, 200, 100, QPixmap("E:/Work/Resource/777.png"));

	//由於之前已經對QPDFWriter進行過設置,且格式沒有更改, 此處無需再設置QPDFWriter
	pWriter->newPage(); 
	pPainter->drawText(QRect(50, 150, nWidth, 200), Qt::AlignHCenter | Qt::AlignBottom,
	QStringLiteral("這是一個測試"));  
	pPainter->drawPixmap(50, 10, 200, 100, QPixmap("E:/Work/Resource/777.png"));

	//由於之前已經對QPDFWriter進行過設置,且格式沒有更改, 此處無需再設置QPDFWriter
	pWriter->newPage();
	pPainter->drawText(QRect(50, 150, nWidth, 200), Qt::AlignHCenter | Qt::AlignBottom,
	QStringLiteral("這是一個測試")); 
	pPainter->drawPixmap(50, 10, 200, 100, QPixmap("E:/Work/Resource/777.png")); 
 
 	//繪製完畢
	delete pPainter;
	delete pWriter; 
	//Close File
	pdfFile.close();  

使用HTML文件生成PDF

	QFile file;
    file.setFileName("test.html");
    if(!file.open(QIODevice::ReadOnly))
        return;
    QTextStream streamFile(&file);
    QString strHtml = streamFile.readAll();
    file.close();
    QPrinter printer;
    printer.setOutputFormat(QPrinter::PdfFormat);
    printer.setOutputFileName("QCoreApplication::applicationDirPath() + "/test.pdf"");
    QTextDocument doc;
    doc.setHtml(strHtml);
    doc.print(&printer); 

Qt4生成PDF:
需要加載模塊printsuppor和Qt5的QPDFWriter本質上都是調用QPainter進行圖片,文本等的繪製

	QPrinter printer(QPrinter::HighResolution);
    printer.setPageSize(QPrinter::A4);
    printer.setOutputFormat(QPrinter::PdfFormat);
    printer.setOutputFileName("QCoreApplication::applicationDirPath() + "/test.pdf");  
    QPainter painter;
    painter.begin(&printer)
    painter->drawText(50, 500, "Item:"); 
    painter.end();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章