VS2017+Qt5.9.1 生成PDF文件

  1. 参考连接https://blog.csdn.net/sunatmine/article/details/110489151
  2. 自定义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();

}
`

posted @ 2024-05-06 20:03  小徐的小菜园  阅读(46)  评论(0)    收藏  举报