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();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章