由于项目上有需要,这几天在研究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();