C++ Qt输出PDF
2020 年 06 月 24 日 266 420 字 暂无评论

前言:

  • 在学习中,有个需要是将应用程序的界面截图,然后加上相应信息,输出为PDF文件。
  • 在网上查阅了一些资料,借鉴了很多方法,整理后归为两种方法。

    • Qt4版本利用QPrinter将文件输出为PDF。
    • Qt5版本利用QPdfWriter,更快更精准输出为PDF文件
    • 两者相同之处都是利用QPainter在其中绘制PDF文件
    • 在pro文件中要添加
QT       += printsupport

01.Qt4版本利用QPrinter输出PDF

  • 在Qt4版本下利用QPrinter将某个控件,或者利用QWidget::grab将控件或界面输出为PDF,主要的流程为:

    • 利用QPrinter设置分辨率,纸张尺寸及输出格式(PDF)
    • 利用QFileDialog设置文件输出路径
    • 利用QPainter直接在QPrinter上绘图(QPainter.begin(QPrinter)

代码实现

//利用QPrinter输出为PDF格式并设置分辨率及纸张尺寸
    QPrinter pic_printer(QPrinter::ScreenResolution);       //设置分辨率
    pic_printer.setPageSize(QPrinter::A4);                  //设置纸张尺寸,默认不设置就是A4
    pic_printer.setOutputFormat(QPrinter::PdfFormat);       //设置输出格式pdf
 
    //用文件对话框设置输出路径
    QString file_path = QFileDialog::getSaveFileName(this,"Export PDF",QString(),"*.pdf");
    if(!file_path.isEmpty())
    {
        //如果没有写后缀就自动加上
        if(QFileInfo(file_path).suffix().isEmpty())
            file_path.append(".pdf");
        pic_printer.setOutputFileName(file_path);           //设置文件名
 
        /*****************************************绘制图片*****************************************/
        QPixmap pixmap=QWidget::grab(QRect(ui->qcustomplot->x(),ui->qcustomplot->y(),ui->qcustomplot->frameGeometry().width(),ui->qcustomplot->frameGeometry().height()+10));                     //抓取界面widget区域,可以抓取任意控件区域,Qt5推荐新的API QWidget::grab
        QPainter pic_painter;
        pic_painter.begin(&pic_printer);                //在QPrinter上绘图
        QRect rect=pic_painter.viewport();              //获取painter的视口区域
        int factor=rect.width()/pixmap.width();         //计算painter视口区域与抓取图片区域的尺寸比例因子
        pic_painter.scale(factor*0.6,factor*0.6);       //绘制时按照比例因子放大
        pic_painter.drawPixmap(10,10,pixmap);           //按照坐标画图
        /***********************以下可利用QPainter自定义绘图**************************************/
    }
    else
    QMessageBox::warning(this,tr("Path"),tr("You did not select any file."));

02.Qt5版本利用QPdfWriter输出PDF

  • 流程差不多,直接上代码
QString path = QFileDialog::getSaveFileName(this,tr("Open File"),".",tr("PDF Files(*.pdf)"));   //利用QFileDialog对话框选择文件存储路径
    if(!path.isEmpty())
    {
        //如果没有写后缀就自动加上
        if(QFileInfo(path).suffix().isEmpty())
            path.append(".pdf");
        //实例化该文件,并以只写的方式打开
        QFile pdfFile(path);
        if(!pdfFile.open(QIODevice::WriteOnly))
        {
            QMessageBox::warning(this,tr("write File"),tr("Cannot open file:\n%1").arg(path));
            return;
        }
        QPdfWriter *pdfWriter = new QPdfWriter(&pdfFile);               //实例化QPdfWriter
        QPainter *pic_painter = new QPainter(pdfWriter);                //实例化QPainter
        pdfWriter->setPageSize(QPagedPaintDevice::A4);                  //设置纸张为A4纸
        pdfWriter->setResolution(QPrinter::ScreenResolution);           //设置分辨率
/******************************************************以下为自定义绘图**************************************/
    delete pic_painter;
        delete pdfWriter;
        pdfFile.close();
    }
    
    else
        QMessageBox::warning(this,tr("Path"),tr("You did not select any file."));

03.输出结果

  • PDF1

  • PDF2


版权属于:zfh

本文链接:http://zfhblog.com/index.php/archives/93/



评论已关闭