项目链接:https://download.csdn.net/download/C_panpan/88268845 https://download.csdn.net/download/C_panpan/88268845
//.h
public:
void exportPdf();
void paintPdf(QPagedPaintDevice *device);
//.cpp
void pdfDemo::exportPdf()
{
//一、选择保存pdf文件路径
QString sPath = QFileDialog::getSaveFileName(this, tr("save as"), "/", tr("Text Files (*.pdf)"));
if (sPath.isEmpty())
{
return;
}
qDebug() << sPath;
//二、创建pdf文件
QFile pdfFile(sPath);
pdfFile.open(QIODevice::WriteOnly);
//三、创建生成pdf类,作为绘图设备
QPdfWriter *pPdfWriter = new QPdfWriter(&pdfFile);
pPdfWriter->setResolution(300);
pPdfWriter->setPageOrientation(QPageLayout::Landscape);//设置页面方向:QPageLayout::Portrait 纵向、QPageLayout::Landscape 横向
pPdfWriter->setPageSize(QPagedPaintDevice::A4);
pPdfWriter->setPageMargins(QMarginsF(30, 30, 30, 30));
//四、开始绘制PDF
paintPdf(pPdfWriter);
delete pPdfWriter;
pdfFile.close();
//通过其它PDF阅读器来打开刚刚绘制的PDF
QDesktopServices::openUrl(QUrl::fromLocalFile(sPath));
}
void pdfDemo::paintPdf(QPagedPaintDevice *device)
{
QPainter *pPainter = new QPainter(device);
qDebug() << pPainter->viewport();
int nPdfWidth = pPainter->viewport().width();
int nPdfHeight = pPainter->viewport().height();
//绘制标题
int y = 10;
pPainter->setFont(QFont(GBK::ToUnicode("宋体"), 18, 36));
pPainter->drawText(QRect(0, y, nPdfWidth, 100), Qt::AlignCenter, GBK::ToUnicode("出库单"));
//绘制表格
pPainter->setRenderHint(QPainter::Antialiasing, true);// 反走样
pPainter->setPen(QPen(QBrush(QColor(144, 166, 188)), 3));// 设置画笔颜色、宽度
pPainter->drawRect(50, 200, 3156, 1800);//绘制矩形
pPainter->drawLine(QLineF(50, 400, 3206, 400));//绘制直线
pPainter->drawLine(QLineF(50, 600, 3206, 600));//绘制直线
pPainter->drawLine(QLineF(50, 800, 3206, 800));//绘制直线
pPainter->drawLine(QLineF(50, 1000, 3206, 1000));//绘制直线
pPainter->drawLine(QLineF(50, 1200, 3206, 1200));//绘制直线
pPainter->drawLine(QLineF(50, 1400, 3206, 1400));//绘制直线
pPainter->drawLine(QLineF(50, 1600, 3206, 1600));//绘制直线
pPainter->drawLine(QLineF(50, 1800, 3206, 1800));//绘制直线
pPainter->drawLine(QLineF(300, 200, 300, 2000));//绘制直线
pPainter->drawLine(QLineF(1200, 200, 1200, 2000));//绘制直线
pPainter->drawLine(QLineF(1500, 200, 1500, 2000));//绘制直线
pPainter->drawLine(QLineF(1900, 200, 1900, 2000));//绘制直线
pPainter->drawLine(QLineF(2300, 200, 2300, 2000));//绘制直线
pPainter->drawLine(QLineF(2700, 200, 2700, 2000));//绘制直线
//绘制报告相关信息
pPainter->setFont(QFont(GBK::ToUnicode("宋体"), 12, 20));
pPainter->drawText(QRect(50, 200, 200, 200), Qt::AlignHCenter | Qt::AlignVCenter, GBK::ToUnicode("编号"));
pPainter->drawText(QRect(300, 200, 900, 200), Qt::AlignHCenter | Qt::AlignVCenter, GBK::ToUnicode("名称及规格"));
pPainter->drawText(QRect(1200, 200, 300, 200), Qt::AlignHCenter | Qt::AlignVCenter, GBK::ToUnicode("单位"));
pPainter->drawText(QRect(1500, 200, 400, 200), Qt::AlignHCenter | Qt::AlignVCenter, GBK::ToUnicode("数量"));
pPainter->drawText(QRect(1900, 200, 400, 200), Qt::AlignHCenter | Qt::AlignVCenter, GBK::ToUnicode("单价"));
pPainter->drawText(QRect(2300, 200, 400, 200), Qt::AlignHCenter | Qt::AlignVCenter, GBK::ToUnicode("金额"));
pPainter->drawText(QRect(2700, 200, 400, 200), Qt::AlignHCenter | Qt::AlignVCenter, GBK::ToUnicode("备注"));
delete pPainter;
}
运行效果
绘制效果2:
void pdfDemo::paintPdf(QPagedPaintDevice *device)
{
QPainter *pPainter = new QPainter(device);
qDebug() << pPainter->viewport();
int nPdfWidth = pPainter->viewport().width();
int nPdfHeight = pPainter->viewport().height();
//绘制标题
int y = 10;
pPainter->setFont(QFont(GBK::ToUnicode("宋体"), 18, 36));
pPainter->drawText(QRect(0, y, nPdfWidth, 100), Qt::AlignCenter, GBK::ToUnicode("实验操作记录报告"));
//绘制报告相关信息
y += 200;
pPainter->setFont(QFont(GBK::ToUnicode("宋体"), 12, 20));
int nLineSpace = 100;
int nLineHeight = 60;
pPainter->drawText(QRect(100, y, nPdfWidth, nLineHeight), Qt::AlignLeft, GBK::ToUnicode("实验编号:19990926001"));
y += nLineSpace;
pPainter->drawText(QRect(100, y, nPdfWidth, nLineHeight), Qt::AlignLeft, GBK::ToUnicode("操作仪器:TMachine9568"));
y += nLineSpace;
pPainter->drawText(QRect(100, y, nPdfWidth, nLineHeight), Qt::AlignLeft, GBK::ToUnicode("操作用户:Dr.Miss"));
y += nLineSpace;
pPainter->drawText(QRect(100, y, nPdfWidth, nLineHeight), Qt::AlignLeft, GBK::ToUnicode("开始时间:1999-09-26 17:50"));
y += nLineSpace;
pPainter->drawText(QRect(100, y, nPdfWidth, nLineHeight), Qt::AlignLeft, GBK::ToUnicode("结束时间:1999-09-26 22:30"));
//绘制每个操作记录的各项标题 (标题宽的比例为 序号:操作时间:操作说明:试管和试剂信息 = 2:5:5:10)
y += 150;
pPainter->setFont(QFont(GBK::ToUnicode("宋体"), 14, 28));
int nUnitW = nPdfWidth / (2 + 5 + 5 + 10);
int nNoWidth = nUnitW * 2;
int nTimeX = nNoWidth;
int nTimeWidth = nUnitW * 5;
int nExplainX = nTimeX + nTimeWidth;
int nExplainWidth = nUnitW * 5;
int nRgInfoX = nExplainX + nExplainWidth;
int nRgInfoW = nUnitW * 10;
nLineHeight = 80;
pPainter->drawText(QRect(0, y, nNoWidth, nLineHeight), Qt::AlignCenter, GBK::ToUnicode("序号"));
pPainter->drawText(QRect(nTimeX, y, nTimeWidth, nLineHeight), Qt::AlignCenter, GBK::ToUnicode("操作时间"));
pPainter->drawText(QRect(nExplainX, y, nExplainWidth, nLineHeight), Qt::AlignCenter, GBK::ToUnicode("操作说明"));
pPainter->drawText(QRect(nRgInfoX, y, nRgInfoW, nLineHeight), Qt::AlignCenter, GBK::ToUnicode("试管和试剂信息"));
//绘制一条分隔线
y += 100;
pPainter->setPen(QPen(QBrush(QColor(144, 166, 188)), 8));
pPainter->drawLine(QLineF(0, y, nPdfWidth, y));
//绘制染色操作记录,假设此刻有25条记录需要绘制
for (int i = 0; i < 20; ++i)
{
//判断是否应该另起一页(320:根据计算,绘制每条记录大概需要320点)
if (y + 320 >= nPdfHeight)
{
device->newPage();
y = 10;
}
y += 50;
pPainter->setFont(QFont(GBK::ToUnicode("宋体"), 12, 20));
pPainter->setPen(QPen(QBrush(QColor(0, 0, 0)), 1));
nLineSpace = 80;
nLineHeight = 50;
pPainter->drawText(QRect(0, y, nNoWidth, nLineHeight), Qt::AlignVCenter | Qt::AlignLeft, QString("%1").arg(i + 1));
pPainter->drawText(QRect(nTimeX, y, nTimeWidth, nLineHeight), Qt::AlignVCenter | Qt::AlignLeft, GBK::ToUnicode("1999-09-26 18:27"));
pPainter->drawText(QRect(nExplainX, y, nExplainWidth, nLineHeight), Qt::AlignVCenter | Qt::AlignLeft, GBK::ToUnicode("需加试剂DC9混合"));
//试管和试剂信息的每行需列出2项信息 宽度比例为7:3
nUnitW = nRgInfoW / (7 + 3);
int nLeftX = nRgInfoX;
int nLeftW = nUnitW * 6;
int nRightX = nLeftX + nLeftW;
int nRightW = nUnitW * 4;
pPainter->drawText(QRect(nLeftX, y, nLeftW, nLineHeight), Qt::AlignVCenter | Qt::AlignLeft,
GBK::ToUnicode("试管ID:15bb00226fa"));
pPainter->drawText(QRect(nRightX, y, nRightW, nLineHeight), Qt::AlignVCenter | Qt::AlignLeft,
GBK::ToUnicode("试管位置号:18"));
y += nLineSpace;
pPainter->drawText(QRect(nLeftX, y, nLeftW, nLineHeight), Qt::AlignVCenter | Qt::AlignLeft,
GBK::ToUnicode("添加试剂1:AC856"));
pPainter->drawText(QRect(nRightX, y, nRightW, nLineHeight), Qt::AlignVCenter | Qt::AlignLeft,
GBK::ToUnicode("添加量:150"));
y += nLineSpace;
pPainter->drawText(QRect(nLeftX, y, nLeftW, nLineHeight), Qt::AlignVCenter | Qt::AlignLeft,
GBK::ToUnicode("添加试剂2:SFH51"));
pPainter->drawText(QRect(nRightX, y, nRightW, nLineHeight), Qt::AlignVCenter | Qt::AlignLeft,
GBK::ToUnicode("添加量:80"));
y += 70;
pPainter->setPen(QPen(QBrush(QColor(166, 188, 222)), 3));
pPainter->drawLine(QLineF(0, y, nPdfWidth, y));
if (i > 0 && i < 19 && y < 1970)
pPainter->drawLine(QLineF(220, y, 220, y + 200));
}
delete pPainter;
}
运行效果