一、使用QPdfWriter绘制PDF
1 void MainWindow::exportPdf() 2 { 3 //一、选择保存pdf文件路径 4 QString sPath = QFileDialog::getSaveFileName(this, tr("另存为"), "/", tr("Text Files (*.pdf)")); 5 if(sPath.isEmpty()) 6 { 7 return; 8 } 9 qDebug() << sPath; 10 11 //二、创建pdf文件 12 QFile pdfFile(sPath); 13 pdfFile.open(QIODevice::WriteOnly); 14 15 //三、创建生成pdf类,作为绘图设备 16 QPdfWriter *pPdfWriter = new QPdfWriter(&pdfFile); 17 pPdfWriter->setResolution(300); 18 pPdfWriter->setPageSize(QPagedPaintDevice::A4); 19 pPdfWriter->setPageMargins(QMarginsF(30, 30, 30, 30)); 20 21 //四、开始绘制PDF 22 paintPdf(pPdfWriter); 23 24 delete pPdfWriter; 25 pdfFile.close(); 26 27 //通过其它PDF阅读器来打开刚刚绘制的PDF 28 QDesktopServices::openUrl(QUrl::fromLocalFile(sPath)); 29 }
二、使用QPrintPreviewDialog预览绘制的PDF然后输出
在生成的打印预览界面点击打印按钮,就会弹出导出PDF窗口,选择要PDF文件要保存的路径,然后保存即可。
如下图所示:
(1)创建QPrintPreviewDialog对象
1 QPrintPreviewDialog *m_pPrintPreviewDlg = new QPrintPreviewDialog();
(2)将paintRequested()信号连接到槽
1 connect(m_pPrintPreviewDlg, &QPrintPreviewDialog::paintRequested, this, &MainWindow::slot_previewPdf);
(3)设置默认打印机的一些参数,最重要的是设置打印机输出格式为PDF
1 m_pPrintPreviewDlg->printer()->setResolution(300); 2 m_pPrintPreviewDlg->printer()->setOrientation(QPrinter::Portrait); 3 //设置打印机输出格式为PDF格式 4 m_pPrintPreviewDlg->printer()->setOutputFormat(QPrinter::PdfFormat); 5 m_pPrintPreviewDlg->printer()->setPaperSize(QPagedPaintDevice::A4); 6 m_pPrintPreviewDlg->printer()->setPageMargins(QMarginsF(30, 30, 30, 30));
(4)槽函数
1 void MainWindow::slot_previewPdf(QPrinter *printer) 2 { 3 paintPdf(printer); 4 }
(5)绘制PDF函数
1 void MainWindow::paintPdf(QPagedPaintDevice *device) 2 { 3 QPainter *pPainter = new QPainter(device); 4 qDebug() << pPainter->viewport(); 5 int nPdfWidth = pPainter->viewport().width(); 6 int nPdfHeight = pPainter->viewport().height(); 7 8 //绘制标题 9 int y = 10; 10 pPainter->setFont(QFont("宋体", 18, 36)); 11 pPainter->drawText(QRect(0, y, nPdfWidth, 100), Qt::AlignCenter, tr("实验操作记录报告")); 12 13 //绘制报告相关信息 14 y += 200; 15 pPainter->setFont(QFont("宋体", 12, 20)); 16 int nLineSpace = 100; 17 int nLineHeight = 60; 18 pPainter->drawText(QRect(100, y, nPdfWidth, nLineHeight), Qt::AlignLeft, QString("实验编号:%1").arg("19990926001")); 19 y += nLineSpace; 20 pPainter->drawText(QRect(100, y, nPdfWidth, nLineHeight), Qt::AlignLeft, QString("操作仪器:%1").arg("TMachine9568")); 21 y += nLineSpace; 22 pPainter->drawText(QRect(100, y, nPdfWidth, nLineHeight), Qt::AlignLeft, QString("操作用户:%1").arg("Dr.Miss")); 23 y += nLineSpace; 24 pPainter->drawText(QRect(100, y, nPdfWidth, nLineHeight), Qt::AlignLeft, QString("开始时间:%1").arg("1999-09-26 17:50")); 25 y += nLineSpace; 26 pPainter->drawText(QRect(100, y, nPdfWidth, nLineHeight), Qt::AlignLeft, QString("结束时间:%1").arg("1999-09-26 22:30")); 27 28 //绘制每个操作记录的各项标题 (标题宽的比例为 序号:操作时间:操作说明:试管和试剂信息 = 2:5:5:10) 29 y += 150; 30 pPainter->setFont(QFont("宋体", 14, 28)); 31 int nUnitW = nPdfWidth / (2 + 5 + 5+ 10); 32 33 int nNoWidth = nUnitW * 2; 34 35 int nTimeX = nNoWidth; 36 int nTimeWidth = nUnitW * 5; 37 38 int nExplainX = nTimeX + nTimeWidth; 39 int nExplainWidth = nUnitW * 5; 40 41 int nRgInfoX = nExplainX + nExplainWidth; 42 int nRgInfoW = nUnitW * 10; 43 44 nLineHeight = 80; 45 pPainter->drawText(QRect(0, y, nNoWidth, nLineHeight), Qt::AlignCenter, "序号"); 46 pPainter->drawText(QRect(nTimeX, y, nTimeWidth, nLineHeight), Qt::AlignCenter, "操作时间"); 47 pPainter->drawText(QRect(nExplainX, y, nExplainWidth, nLineHeight), Qt::AlignCenter, "操作说明"); 48 pPainter->drawText(QRect(nRgInfoX, y, nRgInfoW, nLineHeight), Qt::AlignCenter, "试管和试剂信息"); 49 50 //绘制一条分隔线 51 y += 100; 52 pPainter->setPen(QPen(QBrush(QColor(144, 166,188)), 8)); 53 pPainter->drawLine(QLineF(0, y, nPdfWidth, y)); 54 55 //绘制染色操作记录,假设此刻有25条记录需要绘制 56 for(int i = 0; i < 25; ++i) 57 { 58 //判断是否应该另起一页(320:根据计算,绘制每条记录大概需要320点) 59 if(y + 320 >= nPdfHeight) 60 { 61 device->newPage(); 62 y = 10; 63 } 64 65 y += 50; 66 pPainter->setFont(QFont("宋体", 12, 20)); 67 pPainter->setPen(QPen(QBrush(QColor(0, 0, 0)), 1)); 68 69 nLineSpace = 80; 70 nLineHeight = 50; 71 72 pPainter->drawText(QRect(0, y, nNoWidth, nLineHeight), Qt::AlignVCenter | Qt::AlignLeft, QString("%1").arg(i + 1)); 73 pPainter->drawText(QRect(nTimeX, y, nTimeWidth, nLineHeight), Qt::AlignVCenter | Qt::AlignLeft, "1999-09-26 18:27"); 74 pPainter->drawText(QRect(nExplainX, y, nExplainWidth, nLineHeight), Qt::AlignVCenter | Qt::AlignLeft, "需加试剂DC9混合"); 75 76 //试管和试剂信息的每行需列出2项信息 宽度比例为7:3 77 nUnitW = nRgInfoW / (7 + 3); 78 79 int nLeftX = nRgInfoX; 80 int nLeftW = nUnitW * 6; 81 82 int nRightX = nLeftX + nLeftW; 83 int nRightW = nUnitW * 4; 84 85 pPainter->drawText(QRect(nLeftX, y, nLeftW, nLineHeight), Qt::AlignVCenter | Qt::AlignLeft, 86 QString("试管ID: %1").arg("15bb00226fa")); 87 pPainter->drawText(QRect(nRightX, y, nRightW, nLineHeight), Qt::AlignVCenter | Qt::AlignLeft, 88 QString("试管位置号: %1").arg(18)); 89 90 y += nLineSpace; 91 pPainter->drawText(QRect(nLeftX, y, nLeftW, nLineHeight), Qt::AlignVCenter | Qt::AlignLeft, 92 QString("添加试剂1: %1").arg("AC856")); 93 pPainter->drawText(QRect(nRightX, y, nRightW, nLineHeight), Qt::AlignVCenter | Qt::AlignLeft, 94 QString("添加量:%1 μL").arg(150)); 95 96 y += nLineSpace; 97 pPainter->drawText(QRect(nLeftX, y, nLeftW, nLineHeight), Qt::AlignVCenter | Qt::AlignLeft, 98 QString("添加试剂2: %1").arg("SFH51")); 99 pPainter->drawText(QRect(nRightX, y, nRightW, nLineHeight), Qt::AlignVCenter | Qt::AlignLeft, 100 QString("添加量:%1 μL").arg(80)); 101 102 y += 70; 103 pPainter->setPen(QPen(QBrush(QColor(166, 188, 222)), 3)); 104 pPainter->drawLine(QLineF(0, y, nPdfWidth, y)); 105 } 106 107 delete pPainter; 108 }