VS2017+Qt5.9.1 生成PDF文件
- 参考连接https://blog.csdn.net/sunatmine/article/details/110489151
- 自定义pdf
`#pragma once
include <qobject.h>
include <qpainter.h>
include <qcoreapplication.h>
include <qdir.h>
include <qdatetime.h>
include "QPdfWriter"
include <QtPrintSupport/QPrinter>
class MyPDF : public QObject
{
Q_OBJECT
public:
MyPDF();
~MyPDF();
public:
void pdfDrawForm(QPainter* paint, int y, int horzBorder, int row, int column, int unitHeight, QFont &font, QStringList& list);
void pdfCreate(QString info);
public:
QString m_strError;
};
#include "pdf.h"
MyPDF::MyPDF()
{
}
MyPDF::~MyPDF()
{
}
//y:表单的Y坐标
//horzBorder:水平外边距,写0表示没有边距
//row,column:行数和列数
//unitHeight:单元高度
//font:字体大小
//list:要写入的单元数据
void MyPDF::pdfDrawForm(QPainter * paint, int y, int horzBorder, int row, int column, int unitHeight, QFont & font, QStringList & list)
{
paint->setFont(font);
paint->setPen(QPen(QBrush(QColor(0, 0, 0)), 2));
int Width = paint->viewport().width() - horzBorder * 2;
int unitWidth = Width / column;
for (int i = 0; i < row; i++)
{
int x = horzBorder;
for (int j = 0; j < column; j++)
{
paint->drawText(QRect(x, y, unitWidth, unitHeight), Qt::AlignCenter, list[i*column + j]);
paint->drawRect(QRect(x, y, unitWidth, unitHeight));
x += unitWidth;
}
y += unitHeight;
}
}
void MyPDF::pdfCreate(QString info)
{
QString qscurpath = QCoreApplication::applicationDirPath();
QString qsGlobalConfig = qscurpath + "\CheckReport";
QString finalPath = qsGlobalConfig;
QDir qDir1(finalPath);
/// 判断路径是否存在
if (!qDir1.exists())
{
// 文件路径不在则创建
qDir1.mkdir(finalPath);
}
/// 获取当前时间
QDateTime curDateTime = QDateTime::currentDateTime();
QString strDate = curDateTime.toString("yyyyMMddhhmmsszzz");
QString fullName = finalPath + "\\" + strDate + "_report" + ".pdf";
QFile qfile(fullName);
bool ok = qfile.open(QIODevice::ReadWrite | QIODevice::Append);
if (!ok)
{
m_strError = "打开或创建csv文件" + (fullName)+"失败!";
return;
}
QPdfWriter* pWriter = new QPdfWriter(&qfile);
//Init Page
pWriter->setPageSize(QPagedPaintDevice::A4);
pWriter->setResolution(300); //设置dpi 每个平方英寸像素为300
pWriter->setPageMargins(QMarginsF(30, 30, 30, 30));
QPainter* pPainter = new QPainter(pWriter);
//Init Font
QFont font[5] = { QFont("宋体",26,60),QFont("宋体",26,61),QFont("宋体",26,QFont::Normal),QFont("宋体",26,QFont::Normal),QFont("宋体",26,QFont::Normal) };
font[0].setPixelSize(86);
font[1].setPixelSize(61);
font[2].setPixelSize(61);
font[3].setPixelSize(42);
font[4].setPixelSize(54);
//Painter PDF
pPainter->viewport();
int nPDFWidth = pPainter->viewport().width();
int nPDFHeight = pPainter->viewport().height();
QStringList list = info.split("\n");
QStringList listHeader = list[0].split(",");
if (listHeader.size() != 10)
{
return;
}
QString timer = listHeader[0].append(":").append(listHeader[1]);
QString worker = listHeader[2].append(":").append(listHeader[3]);
QString sptpath = listHeader[4].append(":").append(listHeader[5]);
QString csvpath = listHeader[6].append(":").append(listHeader[7]);
QString result = listHeader[8].append(":").append(listHeader[9]);
//在10%的头部居中显示
int y = 10;
pPainter->setFont(font[0]);
pPainter->drawText(QRect(0, y, nPDFWidth, 100), Qt::AlignCenter,"点检报告");
y += 140;
pPainter->setPen(QPen(QBrush(QColor(0, 0, 0)), 5));
pPainter->drawLine(0, y, nPDFWidth, y);
pPainter->drawLine(0, y + 18, nPDFWidth, y + 18);
y += 60;
pPainter->setFont(font[2]);
pPainter->drawText(QRect(100, y, nPDFWidth / 2, 70), Qt::AlignVCenter | Qt::AlignLeft,
timer);
pPainter->setFont(font[2]);
pPainter->drawText(QRect(nPDFWidth / 2 + 100, y, nPDFWidth / 2 - 100, 70), Qt::AlignVCenter | Qt::AlignLeft,
worker);
y += 90;
pPainter->setFont(font[2]);
pPainter->drawText(QRect(100, y, nPDFWidth / 2, 70), Qt::AlignVCenter | Qt::AlignLeft,
sptpath);
pPainter->setFont(font[2]);
pPainter->drawText(QRect(nPDFWidth / 2 + 100, y, nPDFWidth / 2 - 100, 70), Qt::AlignVCenter | Qt::AlignLeft,
csvpath);
y += 110;
pPainter->setFont(font[1]);
pPainter->drawText(QRect(0, y, nPDFWidth, 80), Qt::AlignVCenter | Qt::AlignLeft,
"标准数据");
y += 120;
int count = 0;
QStringList goldHeader = list[1].split(",");
int col = goldHeader.size();
int row = 1;
for (size_t i = 2; i < list.size(); i++)
{
QStringList var = list[i].split(",");
if (var[0] == "金样值")
{
goldHeader.append(var);
row++;
continue;
}
if (var[0] == "启用项目")
{
count = i;
break;
}
}
pdfDrawForm(pPainter, y, 0, row, col, 100, font[3], goldHeader);
y += 260;
pPainter->setFont(font[1]);
pPainter->drawText(QRect(0, y, nPDFWidth, 80), Qt::AlignVCenter | Qt::AlignLeft,
"点检数据");
y += 120;
QStringList checkHeader = list[count].split(",");
col = checkHeader.size();
row = 1;
for (size_t i = count + 1; i < list.size(); i++)
{
QStringList var = list[i].split(",");
if (var[0]=="点检值")
{
checkHeader.append(var);
row++;
continue;
}
if (var[0] == "规格列表")
{
count = i;
break;
}
}
pdfDrawForm(pPainter, y, 0, row, col, 100, font[3], checkHeader);
y += 260;
pPainter->setFont(font[1]);
pPainter->drawText(QRect(0, y, nPDFWidth, 80), Qt::AlignVCenter | Qt::AlignLeft,
"规格信息");
y += 120;
QStringList threashold = list[count].split(",");
col = threashold.size();
row = 1;
for (size_t i = count + 1; i < list.size(); i++)
{
QStringList var = list[i].split(",");
if (var[0] == "规格信息")
{
threashold.append(var);
row++;
continue;
}
}
pdfDrawForm(pPainter, y, 0, row, col, 100, font[3], threashold);
y += 260;
//绘制完毕
delete pPainter;
delete pWriter;
qfile.close();
}
`

浙公网安备 33010602011771号