当前位置: 首页 > news >正文

Qt中txt文件输出为PDF格式

 main.cpp

    PdfReportGenerator pdfReportGenerator;
    // 加载中文字体
    if (QFontDatabase::addApplicationFont(":/new/prefix1/simsun.ttf") == -1) {
        QMessageBox::warning(nullptr, "警告", "无法加载中文字体");
    }

    // 解析日志文件
    QVector<LogEntry> entries;
    if (!pdfReportGenerator.parseLogFile("1.txt", entries)) {
        QMessageBox::critical(nullptr, "错误", "无法打开日志文件");
        return ;
    }

    // 生成PDF表格
    pdfReportGenerator.createPdfWithTable(entries);
    QMessageBox::information(nullptr, "完成", "PDF表格已生成: output_table.pdf");

 

字体文件放入资源路径,字体下载网站GitCode - 全球开发者的开源社区,开源代码托管平台

 类实现

.cpp文件

#include "PdfReportGenerator.h"

bool PdfReportGenerator::parseLogFile(const QString &filename, QVector<LogEntry> &entries) {
    QFile file(filename);
    if (!file.open(QIODevice::ReadOnly)) return false;

    QTextStream in(&file);
    in.setCodec("UTF-8");
    in.readLine(); // 跳过标题行

    while (!in.atEnd()) {
        QString line = in.readLine().trimmed();
        if (line.isEmpty()) continue;

        QStringList parts = line.split("\t", Qt::SkipEmptyParts);
        if (parts.size() < 6) continue;

        LogEntry entry;
        entry.command = parts[0].trimmed();
        entry.frame = parts[1].trimmed();
        entry.success = parts[2].trimmed().toInt();
        entry.fail = parts[3].trimmed().toInt();
        entry.timeout = parts[4].trimmed();
        entry.duration = parts[5].replace("ms", "").trimmed().toInt();
        entry.gapPos = (parts.size() > 6) ? parts[6].trimmed() : "";

        entries.append(entry);
    }
    return true;
}

void PdfReportGenerator::createPdfWithTable(const QVector<LogEntry> &entries) {
    // 创建文档对象
    QTextDocument doc;
    QTextCursor cursor(&doc);

    // 设置中文字体
    QFont font("SimSun", 10);
    doc.setDefaultFont(font);

    // 添加标题
    cursor.insertText("日志数据报表\n", QTextCharFormat());
    cursor.insertBlock();

    // 创建表格(列数=7,行数=数据行数+1)
    QTextTable *table = cursor.insertTable(entries.size() + 1, 7);

    // 设置表头
    QStringList headers = {"命令", "帧/时间/次数", "成功次数",
                           "失败次数", "是否超时", "消耗时间", "缝隙位置"};
    for (int i = 0; i < headers.size(); ++i) {
        QTextTableCell cell = table->cellAt(0, i);
        QTextCursor cellCursor = cell.firstCursorPosition();
        cellCursor.insertText(headers[i]);
        cell.format().setBackground(Qt::lightGray); // 表头背景色
    }

    // 填充数据
    for (int row = 0; row < entries.size(); ++row) {
        const LogEntry &entry = entries[row];
        QStringList rowData = {
            entry.command,
            entry.frame,
            QString::number(entry.success),
            QString::number(entry.fail),
            entry.timeout,
            QString::number(entry.duration) + "ms",
            entry.gapPos
        };

        for (int col = 0; col < rowData.size(); ++col) {
            QTextTableCell cell = table->cellAt(row + 1, col);
            QTextCursor cellCursor = cell.firstCursorPosition();
            cellCursor.insertText(rowData[col]);

            // 数字列右对齐
            if (col >= 2 && col <= 5) {
                QTextBlockFormat format;
                format.setAlignment(Qt::AlignRight);
                cellCursor.setBlockFormat(format);
            }
        }
    }

    // 设置表格样式
    QTextTableFormat tableFormat;
    tableFormat.setHeaderRowCount(1);
    tableFormat.setBorderStyle(QTextFrameFormat::BorderStyle_Solid);
    tableFormat.setBorder(1);
    table->setFormat(tableFormat);

    // 导出PDF
    QPrinter printer(QPrinter::HighResolution);
    printer.setOutputFormat(QPrinter::PdfFormat);
    printer.setOutputFileName("output_table.pdf");
    printer.setPageSize(QPageSize(QPageSize::A4));
    doc.print(&printer);
}

.h文件 

#ifndef PDFREPORTGENERATOR_H
#define PDFREPORTGENERATOR_H
#include <QApplication>
#include <QFile>
#include <QTextStream>
#include <QTextDocument>
#include <QTextTable>
#include <QPrinter>
#include <QFontDatabase>
#include <QPdfWriter>
#include <QPainter>
#include "qcustomplot.h"

struct LogEntry {
    QString command;
    QString frame;
    int success;
    int fail;
    QString timeout;
    int duration;
    QString gapPos;
};

class PdfReportGenerator : public QObject {
public:
    void createPdfWithTable(const QVector<LogEntry> &entries);
    bool parseLogFile(const QString &filename, QVector<LogEntry> &entries);
};

#endif // PDFREPORTGENERATOR_H

实现效果

相关文章:

  • 嵌入式学习-EXTI外部中断
  • Java UDP 通信:实现简单的 Echo 服务器与客户端
  • R JSON 文件
  • 私有化部署DeepSeek并SpringBoot集成使用(附UI界面使用教程-支持语音、图片)
  • 石基大商:OceanBase + Flink CDC,搭建连锁零售系统数据湖
  • IDEA 接入 Deepseek
  • comfyui使用ComfyUI-AnimateDiff-Evolved, ComfyUI-Advanced-ControlNet节点报错解决
  • 网络安全域的划分与隔离
  • 基于RKNN的嵌入式深度学习开发(1)
  • 青蛙跳杯子(BFS)
  • 如何将hf-mirror.com作为vllm默认的下载源? conda如何移除虚拟环境?conda 如何复制一份虚拟环境?
  • 15-YOLOV8OBB损失函数详解
  • Spring(三)容器-注入
  • 玩转大模型——Trae AI IDE国内版使用教程
  • 【我的Android进阶之旅】如何使用NanoHttpd在Android端快速部署一个HTTP服务器?
  • GPU、NPU与LPU:大语言模型(LLM)硬件加速器全面对比分析
  • 20241130 RocketMQ本机安装与SpringBoot整合
  • CSS2.1基础学习
  • STM32——DMA详解
  • 似然函数与极大似然估计
  • 忻府网站建设排名/谷歌网页版入口在线
  • asp网站开发/线上营销策略
  • 做网站公司找哪家公司/百度推广视频
  • 河南网站建设/搜一搜排名点击软件
  • 做网站开发需要学那些东西/上海最新新闻
  • 视频网站建设 方案/阿里云模板建站