目标:
1、实现文字、图像保存为pdf并在保存后自动打开的功能;
2、实现文字、图像打印预览的功能
3、实现文字、图像打印的功能
平台:
VS 2019 + QT5.15.2
需要的类:
QPainter、QPdfWriter
需要的QT库
Qt5PrintSupport.dll:C:\QT\Qt5.15.2\5.15.2\msvc2019_64\bin
plugins:C:\QT\Qt5.15.2\5.15.2\msvc2019_64\plugins\printsupport
需在VS对应的工程中增加附加依赖项
工程右键--属性--链接器--输入--附加依赖项中增加
//实现文字、图像保存为pdf并在保存后自动打开的功能
//input QString ID,name,QImage
QPdfWriter* pPdfWriter = new QPdfWriter(&pdfFile);
pPdfWriter->setPageSize(QPagedPaintDevice::A4);
pPdfWriter->setResolution(300);
int iMargin = 40; // 页边距
pPdfWriter->setPageMargins(QMarginsF(iMargin, iMargin, iMargin, iMargin));
QPainter* pPdfPainter = new QPainter(pPdfWriter);
void createPdf(QPainter* pPdfPainter, QString ID,QString Name, const QImage* image)
{
QTextOption option(Qt::AlignHCenter | Qt::AlignVCenter);// 标题,居中
int pos_y = 10;
int pos_x = 0;
int prtlogic_wid = pPdfPainter->viewport().width();
int prtlogic_hgt = pPdfPainter->viewport().height();
int row_h = prtlogic_hgt/60;
//标题
QFont fontTitle("Microsoft YaHei", 14, QFont::DemiBold);
pPdfPainter->setFont(fontTitle); // 为绘制工具设置字体
pPdfPainter->drawText(QRect(0, pos_y, prtlogic_wid, row_h*2), Qt::AlignHCenter | Qt::AlignBottom,"****信息表");
pos_y += row_h * 3;
option.setWrapMode(QTextOption::WordWrap);
QFont fontText1("Microsoft YaHei", 10, QFont::Normal, true);
pPdfPainter->setFont(fontText1); // 为绘制工具设置字体
//ID
pPdfPainter->setFont(QFont("", 10));
m_key = tr("ID:");
QString outHeadPatientIDString = m_key + m_ID;//m_ID为实际的值
pPdfPainter->drawText(QRect(pos_x, pos_y, prtlogic_wid, row_h), Qt::AlignLeft, outHeadPatientIDString);
pos_x += prtlogic_wid / 4;
//Name
pPdfPainter->setFont(QFont("", 10));
m_key = tr("Name:");
QString outHeadPatientNameString = m_key + m_Name;//m_Name为实际的值
pPdfPainter->drawText(QRect(pos_x, pos_y, prtlogic_wid, row_h), Qt::AlignLeft, outHeadPatientNameString);
pos_x += prtlogic_wid / 4;
//image
int image_hgt = pFuseImage->height();//待保存图像的真实-高度
int image_wid = pFuseImage->width();//待保存图像的真实-宽度
int image_show_hgt = prtlogic_wid * image_hgt / image_wid;//根据纸张比例计算的保存图像时的高度
pPdfPainter->drawImage(QRect(0, pos_y, prtlogic_wid, image_show_hgt), *pFuseImage);
//page feet
int feetlinewidth = 450;
int pos_feety = pPdfPainter->viewport().height();
pos_feety -= row_h;
int pos_rightx = pPdfPainter->viewport().width();
pos_rightx -= feetlinewidth;
time
QDateTime time = QDateTime::currentDateTime();
text = QString("Date:");
pPdfPainter->drawText(QRect(pos_rightx, pos_feety, feetlinewidth, row_h), Qt::AlignLeft, text);
pPdfPainter->drawText(QRect(pos_rightx + 150, pos_feety, feetlinewidth - 150, row_h), Qt::AlignHCenter, time.toString("yyyy-MM-dd hh:mm:ss"));
}
//实现打印预览
QPrinter printer;
printer.setOutputFormat(QPrinter::NativeFormat);
printer.setPageSize(QPagedPaintDevice::A4);
printer.setOrientation(QPrinter::Portrait);
printer.printerName();//获取默认打印机
printer.setNumCopies(1);
printer.setPageOrder(QPrinter::FirstPageFirst);//设置打印顺序
printer.setPageMargins(6, 6, 6, 6, QPrinter::Millimeter);
printer.setPageSize(QPrinter::A4);
//打印预览
QPrintPreviewDialog* pPreviewDialog = new QPrintPreviewDialog(&printer);
connect(pPreviewDialog, &QPrintPreviewDialog::paintRequested, this, &IGSReportView::slotPintPreview);//关联打印预览的内容
pPreviewDialog->resize(1000, 900);
pPreviewDialog->exec();
delete pPreviewDialog;
pPreviewDialog = nullptr;
void slotPintPreview(QPrinter* printer)
{
QPainter pPdfPainter;
printer->setPageSize(QPrinter::A4);
pPdfPainter.begin(printer);
createPdf(&pPdfPainter, m_ID, m_Name, pFuseImage);
pPdfPainter.end();
}
//打印
QPrintDialog printDialog(&printer, this);
if (printDialog.exec() == QDialog::Accepted)
{
QPainter painter(&printer);
createPdf(&painter, m_sPatientID, m_sPatientName, pFuseImage);
}