Qt如何导出pdf
1、Qt5中新出来的类QPdfWriter,可以很快实现导出pdf,只需要调用QPainter绘画文字、图片即可。
QPdfWriter中还有如下方法:
void setCreator(const QString & creator)//设置PDF作者
bool setPageLayout(const QPageLayout & newPageLayout)//设置新页面的页面布局
bool setPageMargins(const QMarginsF & margins)//设置页边距
bool setPageMargins(const QMarginsF & margins, QPageLayout::Unit units)
bool setPageOrientation(QPageLayout::Orientation orientation)
bool setPageSize(const QPageSize & pageSize)//设置页面大小A4,B4
void setResolution(int resolution)//设置分辨率
void setTitle(const QString & title)//设置标题
比如绘画Text:
QFile f("E://QPdfWriter.pdf");
f.open(QIODevice::WriteOnly);
QPdfWriter* writer = new QPdfWriter(&f);
QPainter* p = new QPainter(writer);
writer->setPageSize(QPagedPaintDevice::A5);
p->drawText(QRect(100, 100, 2000, 200), "test1");//第一个页面
writer->newPage();
p->drawText(QRect(100, 100, 2000, 200), "test2");//第二个页面
delete p;
delete writer;
f.close();
结果如下:

2、QPrinter通过图片生成pdf
代码如下:
//图片生成pdf
QPrinter printerPixmap(QPrinter::HighResolution);
printerPixmap.setPageSize(QPrinter::A4); //设置纸张大小为A4
printerPixmap.setOutputFormat(QPrinter::PdfFormat); //设置输出格式为pdf
printerPixmap.setOutputFileName("E:\\test_pixmap.pdf"); //设置输出路径
QPixmap pixmap = QPixmap::grabWidget(ui.celllViewWidget, ui.celllViewWidget->rect()); //获取界面的图片
QPainter painterPixmap;
painterPixmap.begin(&printerPixmap);
QRect rect = painterPixmap.viewport();
int multiple = rect.width() / pixmap.width();
painterPixmap.scale(multiple, multiple); //将图像(所有要画的东西)在pdf上放大multiple-1倍
painterPixmap.drawPixmap(0, 0, pixmap); //画图
painterPixmap.end();
效果如下:

3、QPrinter将文本生成pdf
//文本生成pdf
QPrinter printerText;
printerText.setOutputFormat(QPrinter::PdfFormat);
printerText.setOutputFileName("E:\\test_text.pdf");
QPainter painterText;
painterText.begin(&printerText);
QDateTime current_date_time = QDateTime::currentDateTime();
QString current_date = current_date_time.toString("yyyy-MM-dd hh:mm:ss ddd");
QPoint point(10, 10);
for (int i = 1; i <= 5; i++)
{
QString message = QString("%1 %2 %3").arg(QString::number(i)).arg(current_date).arg(QStringLiteral("北京"));
int y = point.y();
point.setY(y + 20);
painterText.drawText(point, message);
message.clear();
}
//printer_text.newPage(); //生成新的一页,可继续插入
painterText.end();
效果如下:

4、HTML生成pdf
//Html生成PDF
QFile file("E://a.txt");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
return;
QTextStream in(&file);
QString html = in.readAll();
file.close();
QPrinter printerHtml;
printerHtml.setPageSize(QPrinter::A4);
printerHtml.setOutputFormat(QPrinter::PdfFormat);
printerHtml.setOutputFileName("E:\\test_html.pdf");
QTextDocument textDocument;
textDocument.setHtml(html);
textDocument.print(&printerHtml);
textDocument.end();
a.txt 文件中html内容:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
</head>
<body>
<table width="200" border="1">
<tr>
<th scope="row">序列</th>
<td>项目</td>
<td>价格</td>
</tr>
<tr>
<th scope="row">1</th>
<td>水立方</td>
<td>2$</td>
</tr>
<tr>
<th scope="row">2</th>
<td>鸟巢</td>
<td>4$</td>
</tr>
</table>
</body>
</html>
效果如下
