Qt下將圖片,文字等輸出為PDF
阿新 • • 發佈:2019-02-15
由於工作中需要將應用程式的某些介面截圖,並加上註釋,並輸出為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."));