1. 程式人生 > >Qt下將圖片,文字等輸出為PDF

Qt下將圖片,文字等輸出為PDF

由於工作中需要將應用程式的某些介面截圖,並加上註釋,並輸出為PDF檔案,在網上查閱了一些資料,整理彙總後發現有兩種方法:一是Qt4版本利用QPrinter將檔案輸出為PDF。而是Qt5版本寫新出的類QPdfWriter,更加快捷精準輸出為PDF檔案。兩者的相同之處都是利用QPainter在其中繪製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."));


在Qt5版本選利用QPdfWriter將Qpainter的檔案輸出為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."));