QT实现保存PDF、打印预览、打印的功能

5 篇文章 0 订阅

目标:

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);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值