由於項目上有需要,這幾天在研究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();