qt中有两种方式可以输出pdf:
这种方式,在qt4成为唯一的方式。
- QPrinter printer(QPrinter::HighResolution); //高清晰度
- printer.setPageSize(QPrinter::A4); //设置纸张大小
- printer.setResolution(300); //设置清晰度,即dpi ,每个平方英寸像素为300
- printer.setOutputFormat(QPrinter::PdfFormat); //设置导出类型
-
- QPainter *painter = new QPainter();
- painter->begin(&printer);
- //显示文本
- painter->drawText(50,50,ui->label->text());
- //画横线
- painter->drawLine(0,375,1500,375);
- //显示图片
- QPixmap pixmap("C:\\xx.png");
- painter->drawPixmap(0,0,pixmap);
-
- painter->end();
- delete painter;
- painter = Q_NULLPTR; //养成编程好习惯,回收对象要置空
相关博客:
qt5的版本,qt提供了一个独立的pdf文件写入方式,那就是QPdfWriter,所以咱们当然用QPdfWriter啦。
正确使用的示例代码如下:
- //截取软件的界面作为截图,打印到pdf里
- QPixmap pix=QWidget::grab(QRect(tmp,ui->customPlot->size()));
-
- QFile pdfFile(path);
- QPdfWriter *pdfWriter = new QPdfWriter(&pdfFile); //实例化QPdfWriter
-
- //设置分辨率,ScreenResolution, PrinterResolution(已经弃用),
- //HighResolution(和ScreenResolution效果一样)
- pdfWriter->setResolution(QPrinter::ScreenResolution);
- pdfWriter->setPageSize(QPagedPaintDevice::A8); //设置纸张为A8纸大小
- //下面这行代码也是可以调整页面大小的,单位为毫米,如果加减一个大点的数,是有效果的
- //pdfWriter->setPageSizeMM(QSizeF(pix.widthMM(),pix.heightMM()));
-
- //实例化QPainter,这里特别注意:pdf输出大小,是由这个QPainter决定的,
- //所以实例化这个QPainter时,确保pdfWriter已经被设置完成,否则后面再设置的话
- //是不会起作用的。要么就调用pdfWriter->newPage()函数,才会起作用,但是会新起一页了
- QPainter *pic_painter = new QPainter(pdfWriter);
-
- //计算painter视口区域与抓取图片区域的尺寸比例因子
- QRect rect = pic_painter->viewport();
- //绘制时按照比例因子放大
- pic_painter->scale(factor,factor);
- //按照坐标画图
- pic_painter->drawPixmap(0,0,pix);
-
- delete pic_painter;
- delete pdfWriter;
- pdfFile.close();
//实例化QPainter,这里特别注意:pdf输出大小,是由这个QPainter决定的,
//所以实例化这个QPainter时,确保pdfWriter已经被设置完成,否则后面再设置的话
//是不会起作用的。要么就调用pdfWriter->newPage()函数,才会起作用,但是会新起一页了。典型的例子就是设置页面大小setPageSize或者setPageSizeMM函数设置的页面大小不起作用。
第二个问题:QPainter只能是一个实例设置到pdfWriter,不能多个实例弄上去,否则newPage()会不起作用,看这个例子:c++ 无法使用QPdfWriter在pdf文件中添加新页面 _大数据知识库
遇到这个问题的博客例子:
Qt使用QPDFWriter和QPainter生成PDF的问题_52_赫兹的鲸的博客-CSDN博客
由于用QPainter打印到QPdfWriter需要自己去计算好每一个坐标(Qt 生成pdf文件_qt生成pdf_小鱼仙官的博客-CSDN博客,Qt开发-ui导出pdf格式 - 知乎),挺麻烦的,所以,用QTextDocument可以支持的html直接打印上去的,所以对于格式化需求,这个就太好了,具体的参考博客:(十七)QT生成PDF文件_qt 生成pdf_sunatmine的博客-CSDN博客