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

QT操作PDF文件

Qt 早期本身不提供原生的 PDF 操作功能。从 Qt 5.15 开始,Qt 提供了 PDF 模块,可以显示和提取 PDF 内容。Qt中有如下几种方式实现 PDF 文件的生成、读取和操作。

1、使用 QPrinter 生成 PDF

2、使用 Qt PDF 模块 (Qt 5.15+)

3、使用第三方库(比如:Poppler)

一、使用 QPrinter 生成 PDF

1、基本 PDF 生成

#include <QPrinter>
#include <QPainter>
#include <QApplication>

void generateSimplePdf() {
    QPrinter printer(QPrinter::PrinterResolution);
    printer.setOutputFormat(QPrinter::PdfFormat);
    printer.setOutputFileName("output.pdf");
    
    QPainter painter;
    if (!painter.begin(&printer)) {
        qDebug() << "Failed to open printer";
        return;
    }
    
    // 绘制文本
    painter.setFont(QFont("Arial", 12));
    painter.drawText(100, 100, "Hello PDF from Qt!");
    
    // 绘制图形
    painter.drawRect(50, 50, 100, 150);
    painter.drawEllipse(200, 200, 50, 50);
    
    painter.end();
    qDebug() << "PDF generated successfully";
}

2、生成多页 PDF

void generateMultiPagePdf() {
    QPrinter printer(QPrinter::PrinterResolution);
    printer.setOutputFormat(QPrinter::PdfFormat);
    printer.setOutputFileName("multipage.pdf");
    
    QPainter painter;
    painter.begin(&printer);
    
    // 第一页
    painter.drawText(100, 100, "Page 1");
    printer.newPage();
    
    // 第二页
    painter.drawText(100, 100, "Page 2");
    printer.newPage();
    
    // 第三页
    painter.drawText(100, 100, "Page 3");
    
    painter.end();
}

3、高级PDF生成(含页眉页脚)

void generatePdfWithHeaderFooter(const QString &filePath) {
    QPrinter printer(QPrinter::PrinterResolution);
    printer.setOutputFormat(QPrinter::PdfFormat);
    printer.setOutputFileName(filePath);
    
    QPainter painter(&printer);
    
    // 设置页面边距
    const int margin = 50;
    QRect contentRect(margin, margin, 
                     printer.width() - 2*margin, 
                     printer.height() - 2*margin);
    
    // 页眉区域
    QRect headerRect(contentRect.left(), contentRect.top()-40, 
                    contentRect.width(), 30);
    
    // 页脚区域
    QRect footerRect(contentRect.left(), contentRect.bottom()+10, 
                    contentRect.width(), 30);
    
    // 内容
    QString content = "这里是文档的主要内容...\n";
    for (int i = 0; i < 50; i++) {
        content += QString("这是第 %1 行内容\n").arg(i+1);
    }
    
    // 分页绘制
    int yPos = contentRect.top();
    bool firstPage = true;
    
    foreach (const QString &line, content.split('\n')) {
        // 检查是否需要新页
        if (yPos + 20 > contentRect.bottom()) {
            // 绘制页脚
            painter.drawText(footerRect, Qt::AlignCenter, 
                           QString("第 %1 页").arg(printer.pageNum()));
            
            printer.newPage();
            yPos = contentRect.top();
            firstPage = false;
            
            // 绘制新页的页眉
            painter.drawText(headerRect, Qt::AlignCenter, "文档标题");
        }
        
        painter.drawText(contentRect.left(), yPos, line);
        yPos += 20;
    }
    
    // 最后一页的页脚
    painter.drawText(footerRect, Qt::AlignCenter, 
                   QString("第 %1 页").arg(printer.pageNum()));
    
    painter.end();
}

 

二、使用 Qt PDF 模块 

从 Qt 5.15 开始,Qt 提供了 PDF 模块,可以显示和提取 PDF 内容。

在 .pro 文件中添加

QT += pdf

1、显示 PDF

#include <QPdfDocument>
#include <QPdfView>

void displayPdf(QWidget *parent, const QString &pdfPath) {
    // 创建文档对象
    QPdfDocument *pdfDocument = new QPdfDocument(parent);
    
    // 创建视图
    QPdfView *pdfView = new QPdfView(parent);
    pdfView->setDocument(pdfDocument);
    
    // 加载PDF文件
    if (pdfDocument->load(pdfPath) != QPdfDocument::NoError) {
        qDebug() << "无法加载PDF文件";
        return;
    }
    
    pdfView->show();
}

2、提取 PDF 文本

#include <QPdfDocument>

void extractPdfText() {
    QPdfDocument doc;
    if (doc.load("document.pdf") != QPdfDocument::NoError) {
        qDebug() << "Failed to load PDF";
        return;
    }
    
    for (int i = 0; i < doc.pageCount(); ++i) {
        QString text = doc.getAllText(i).text();
        qDebug() << "Page" << i+1 << "text:" << text;
    }
}
http://www.dtcms.com/a/99123.html

相关文章:

  • 计算机视觉准备八股中
  • 多任务眼底血管与眼底血管中心线提取
  • Oracle数据库数据编程SQL<3.1 PL/SQL 匿名块 及 流程控制中的条件判断、循环、异常处理和随机函数应用>
  • CSS 美化页面(一)
  • 【Ai插件开发】Notepad++ AI插件开发进阶:集成Ai模型问答功能与流式交互实现
  • 【区块链安全 | 第九篇】基于Heimdall设计的智能合约反编译项目
  • SpringCould微服务架构之Docker(5)
  • [笔记.AI]初始向量
  • python基础学习二(列表及字典的使用)
  • 分布式ID服务实现全面解析
  • 【UE5.3.2】初学1:适合初学者的入门路线图和建议
  • 基于医疗大数据的肿瘤疾病模式分析与研究
  • MySQL 的 SQL 语句执行顺序
  • C++实现布隆过滤器
  • Linux--进程地址空间
  • Java基础关键_032_反射(二)
  • 六十天前端强化训练之第三十四天之CI/CD 大师级深度解析
  • CNN+Transformer+SE注意力机制多分类模型 + SHAP特征重要性分析,pytorch框架
  • NFS挂载异常排查记录
  • 比kubectl更好用的k8s命令行客户端kube-shell
  • 信号集操作函数
  • Object结构
  • sqli-labs靶场 less 8
  • Display Serializer、Camera Deserializer(Camera Des)和SerDes‌ 加解串应用
  • 【vllm/瞎折腾】在内网wsl上安装vllm并尝试多节点部署(失败了)
  • Java并发编程面试题:线程池Fork/Join(19题)
  • 【深度学习新浪潮】具身智能及其发展前景分析
  • 万物皆可“吉卜力”,使用 AI 创建你的作品
  • 逆向中如何判断JSVMP,及如何解决?(包括实战案例)
  • OpenAI API - Agent