Qt PDF模块详解 - 实践

news/2026/1/19 21:45:12/文章来源:https://www.cnblogs.com/gccbuaa/p/19503810

Qt PDF模块详解

  • 一、Qt PDF模块详解
    • 1、核心模块:`QtPdf` 和 `QtPdfWidgets`
    • 2、底层技术:PDFium
    • 3、关键功能详解
    • 4、平台支持
    • 5、使用注意事项
    • 6、简单示例 (QML)
    • 7、简单示例 (Widgets - C++)
    • 8、总结
  • 二、示例
    • 1、源码分享
    • 2、效果展示

一、Qt PDF模块详解

Qt 6 引入了一个原生、跨平台的模块来处理 PDF 文档,大大简化了在应用程序中显示和操作 PDF 文件的需求。

1、核心模块:QtPdfQtPdfWidgets

Qt 6 的 PDF 功能主要通过两个模块提供:

  1. QtPdf

  2. QtPdfWidgets (可选):

2、底层技术:PDFium

Qt 的 PDF 模块是基于 Google 的 PDFium 库构建的。PDFium 是一个开源、轻量级、功能强大的 PDF 渲染器和解析器库。Qt 在其基础上提供了一个更符合 Qt 开发习惯和 API 设计风格的封装层。

3、关键功能详解

  1. 加载 PDF 文档:

    • 使用 QPdfDocument 类。
    • 主要方法:
      QPdfDocument *doc = new QPdfDocument(this);
      doc->load("path/to/document.pdf"); // 同步加载
      // 或者
      doc->loadAsync("path/to/document.pdf"); // 异步加载
    • 可以处理密码保护的文档:
      doc->load("encrypted.pdf", "password");
    • 加载状态通过 status() 属性(枚举 QPdfDocument::Status)和 statusChanged() 信号通知。
  2. 获取文档信息:

    int pageCount = doc->pageCount();
    QString title = doc->metaData(QPdfDocument::MetaDataField::Title);
    QString author = doc->metaData(QPdfDocument::MetaDataField::Author);
  3. 渲染 PDF 页面:

    • QtPdf (QML/通用):
      • 使用 QQuickPdfRenderer
      • 在 QML 中:
        import QtPdf
        PdfDocument {id: pdfDocsource: "doc.pdf"
        }
        Image {source: PdfImageRenderer {document: pdfDocpage: 0 // 页码resolution: 144 // DPI}
        }
      • 在 C++ 中,也可以通过 QPdfDocument::render 方法渲染到 QImage
        QImage image = doc->render(pageIndex, size, QPdfDocument::RenderFlag::Annotations);
    • QtPdfWidgets (Widgets):
      • 使用 QPdfView
        QPdfView *pdfView = new QPdfView(this);
        pdfView->setDocument(doc);
  4. 页面导航:

    • 通过 QPdfDocument::pageCount() 和当前页码(通常由视图控件管理)实现。
    • QPdfView 提供了内置的导航控件(上一页/下一页/跳转)。
  5. 缩放:

    • QPdfView 支持鼠标滚轮缩放、手势缩放(触摸屏)以及通过 API (zoomIn(), zoomOut(), resetZoom()) 控制。
    • 缩放因子可通过 zoomFactor() 属性访问。
  6. 文本搜索:

    • 使用 QPdfDocument::search() 方法进行异步搜索。
    • 指定搜索字符串、起始页码、搜索方向(向前/向后)、是否区分大小写等。
    • 结果通过 searchFinished() 信号返回,包含匹配的位置(页码和边界矩形)。
    • QPdfView 可以高亮显示搜索结果。QPdfSearchBar 提供了搜索 UI。
  7. 获取页面内容:

    • 可以获取页面的文本内容(作为字符串):
      QString pageText = doc->page(pageIndex).text();
    • 可以获取页面大小(以点为单位,1 点 = 1/72 英寸):
      QSizeF pageSize = doc->pageSize(pageIndex);
  8. 批注和表单(高级):

    • PDFium 支持渲染和交互 PDF 表单字段(如文本框、按钮、复选框)以及注释(如高亮、下划线、便签)。
    • Qt 的封装层目前对表单和注释的交互支持还在发展中。QPdfDocument::renderRenderFlags 参数可以控制是否渲染注释。
    • QPdfView 可能提供一些基本的表单交互功能(具体取决于 Qt 版本)。
  9. 链接导航:

    • PDF 文档可能包含超链接(指向其他页面、外部 URL 或文件)。
    • QPdfView 通常能识别这些链接,用户点击后可以触发导航(跳转到指定页面)或发出信号(如 linkActivated)让应用程序处理外部链接。

4、平台支持

  • 桌面 (Windows, Linux, macOS): 完全支持。
  • 移动 (iOS, Android): 支持,但需要注意:
    • Android 需要 QT_ANDROID_PDF_PROVIDER 环境变量设置为 "pdfium" (或在 android/src/.../QtActivity.java 中设置)。
    • 渲染性能和内存占用在资源有限的设备上可能是个问题,需要优化(如降低渲染分辨率、只渲染当前视图区域)。

5、使用注意事项

  1. 性能: 渲染大型或复杂的 PDF 页面可能消耗大量 CPU 和内存。使用异步渲染 (QQuickPdfRendererloadAsync) 避免阻塞 UI 线程。考虑只渲染当前可见的页面区域。
  2. 内存管理: 及时释放不再需要的 QPdfDocument 和渲染资源,尤其是在移动设备上。
  3. 依赖:QtPdfQtPdfWidgets 模块需要正确配置和链接到项目中。
  4. 版本差异: 关注不同 Qt 6 小版本之间 PDF 模块 API 的改进和变化。
  5. QML 使用: 在 QML 中,PdfDocumentPdfImageRenderer 提供了声明式接口。注意资源释放,可以使用 Component.onDestructionConnections 监听文档卸载。

6、简单示例 (QML)

import QtQuick
import QtQuick.Controls
import QtPdf
ApplicationWindow {visible: truewidth: 800height: 600PdfDocument {id: pdfDocsource: Qt.resolvedUrl("sample.pdf")}ScrollView {anchors.fill: parentColumn {Repeater {model: pdfDoc.pageCountImage {source: PdfImageRenderer {document: pdfDocpage: indexresolution: 96 // 根据需要调整 DPI}width: parent.width // 宽度适应视图height: width * (pdfDoc.pageSize(index).height / pdfDoc.pageSize(index).width) // 保持宽高比}}}}
}

7、简单示例 (Widgets - C++)

#include <QApplication>#include <QPdfDocument>#include <QPdfView>int main(int argc, char *argv[]) {QApplication app(argc, argv);QPdfDocument *doc = new QPdfDocument();doc->load("sample.pdf");QPdfView *view = new QPdfView();view->setDocument(doc);view->show();return app.exec();}

8、总结

Qt 6 的 PDF 模块 (QtPdfQtPdfWidgets) 提供了一个强大且相对易用的原生解决方案,用于在 Qt 应用程序中集成 PDF 功能。它涵盖了加载、渲染、导航、缩放、搜索等核心需求,并具有良好的跨平台支持。开发者可以根据应用场景选择使用底层的 QPdfDocument API 进行精细控制,或者利用方便的 QPdfView / QML 组件快速实现 PDF 查看器功能。

二、示例

1、源码分享

下面是一个生成PDF的示例

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPdfWriter>#include <QPainter>#include <QTextDocument>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow){ui->setupUi(this);}MainWindow::~MainWindow(){delete ui;}void MainWindow::on_pushButton_clicked(){// 初始化 PDF 写入器,指定输出文件名QPdfWriter writer("output.pdf");writer.setPageSize(QPageSize::A4); // 设置页面大小writer.setTitle("由 Qt 生成的 PDF 示例"); // 设置文档标题writer.setCreator("我的 Qt 应用"); // 设置创建者// 初始化画家,并指定在 QPdfWriter 上绘制QPainter painter(&writer);painter.setRenderHint(QPainter::Antialiasing); // 开启抗锯齿,让图形和文字更平滑// 1. 使用 QPainter 直接绘制简单图形和文本painter.drawText(100, 100, "你好,这是由 QPdfWriter 生成的 PDF!"); // 在指定坐标绘制文本painter.drawRect(50, 150, 200, 100); // 绘制矩形// 2. 使用 QTextDocument 处理富文本和复杂格式QTextDocument textDoc;textDoc.setHtml("<h1>这是一个标题</h1>""<p>这是一个<strong>加粗</strong>和<em>斜体</em>的段落。</p>""<ul><li>列表项一</li><li>列表项二</li></ul>");// 将 QTextDocument 的内容绘制到 PDF 的指定区域textDoc.drawContents(&painter, QRectF(50, 300, 500, 500));// 结束绘制,确保所有内容已写入文件painter.end();}

2、效果展示

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1185246.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

保姆级教程:25个降AI提示词大全,手把手教你去AI味

保姆级教程&#xff1a;25个降AI提示词大全&#xff0c;手把手教你去AI味 TL;DR&#xff1a;本文整理了25个实测有效的降AI提示词&#xff0c;涵盖角色设定法、语义重构法、口语化改写法等多种技巧&#xff0c;配合嘎嘎降AI等专业工具使用&#xff0c;可以把AI率从92%降到5%以下…

2026国内最新虾青素保健品企业top5推荐!中青年抗衰品牌权威榜单发布,科学配方与品质保障助力健康年轻态 - 品牌推荐2026

随着社会节奏加快与压力加剧,中青年群体面临氧化衰老加速、亚健康问题凸显的挑战。据《中国居民健康素养监测报告》显示,我国25-55岁人群中,76%存在不同程度的抗氧化需求,而虾青素作为强效抗氧化剂,其市场需求年增…

保姆级教程:DeepSeek降AI指令怎么写(附20个实用Prompt)

保姆级教程&#xff1a;DeepSeek降AI指令怎么写&#xff08;附20个实用Prompt&#xff09; TL;DR&#xff1a;DeepSeek可以免费降AI&#xff0c;但需要掌握正确的Prompt写法。本文整理20个实测有效的降AI指令&#xff0c;覆盖句式改写、逻辑重构、口语化转换等场景&#xff0c;…

AI 变声器在视频本地化中的应用:2026 年最佳工具与选型分析

视频内容中最具影响力的元素之一便是声音。声音不仅富有情感和目的感&#xff0c;而且具有权威性。随着视频本地化成为全球传播的关键需求&#xff0c;创作者和企业已经不再仅仅依赖字幕的使用。语音变换技术已经成为调整视频内容、适配不同语言、地区和文化观点的重要工具。 …

云原生时代的Nginx:从反向代理到基础设施核心

云原生时代的Nginx&#xff1a;从反向代理到基础设施核心 文章目录 云原生时代的Nginx&#xff1a;从反向代理到基础设施核心云原生架构的本质与Nginx的角色转变 服务网格与Nginx&#xff1a;分布式流量治理的实践Nginx Ingress Controller&#xff1a;云原生流量入口的标准实现…

“吉瓦时代”来临:Meta 核电协议引爆 AI 数据中心能源竞赛

近期&#xff0c;Meta Platforms 推出全新 “Meta Compute” 计划&#xff0c;围绕 AI 数据中心展开全球性基础设施扩张&#xff0c;并大规模锁定能源供给资源。该计划的核心之一&#xff0c;是通过与核能企业签订长期供电协议&#xff0c;为未来大规模 AI 运算提供稳定、可持续…

AI智能客服系统重塑医药电商服务生态

一、行业核心矛盾&#xff1a;专业与效能的双重瓶颈 医药电商兼具专业性与合规性&#xff0c;药品咨询、器械操作、滋补品适配等诉求对专业度要求极高。人工客服专业知识检索精准度不足62%&#xff0c;新员工培训周期1-2个月&#xff1b;用户模糊诉求的意图判断偏差率超23%&am…

手把手教你把论文AI率从90%降到10%以下

手把手教你把论文AI率从90%降到10%以下 TL;DR&#xff1a;论文AI率90%不用慌&#xff0c;按照「粗改→精调→工具收尾」三步走&#xff0c;20分钟就能降到10%以下。本文提供完整操作流程和每一步的具体指令&#xff0c;实测有效。如果想省时间&#xff0c;直接用嘎嘎降AI&#…

Linux 搭建SVN服务

检查SVN服务版本svnserve --version[rooteason ~]# svnserve --version svnserve&#xff0c;版本 1.7.14 (r1542130)编译于 Sep 30 2020&#xff0c;17:44:04版权所有 (C) 2013 Apache 软件基金会。 此软件包含了许多人的贡献&#xff0c;请查看文件 NOTICE 以获得更多信息。 …

保姆级教程:DeepSeek降AI指令怎么写才有效

保姆级教程&#xff1a;DeepSeek降AI指令怎么写才有效 TL;DR&#xff1a;DeepSeek降AI指令的核心是打破AI生成的「规整感」——把长句拆短句、去掉「首先其次」等连接词、加入个人化表达。但DeepSeek只能做粗处理&#xff08;降到50%-60%&#xff09;&#xff0c;要降到10%以下…

学霸同款8个一键生成论文工具,MBA毕业论文轻松搞定!

学霸同款8个一键生成论文工具&#xff0c;MBA毕业论文轻松搞定&#xff01; AI 工具如何让论文写作更高效 在当今信息爆炸的时代&#xff0c;MBA 学生和科研工作者面临着越来越高的学术要求。无论是撰写毕业论文还是发表学术文章&#xff0c;内容的原创性、逻辑性和专业性都显得…

数字赋能,防患未然——水利大坝智能监测与报警一体化平台

水利大坝作为防洪、发电、供水等核心水利基础设施&#xff0c;其安全稳定运行直接关系到下游区域人民生命财产安全与生态平衡。 水利大坝自动化监测系统解决方案&#xff0c;融合物联网、北斗定位、云计算、人工智能及数字孪生技术&#xff0c;构建天空地一体化全要素自动化监测…

查找oracle,存储过程包含某个单词的存储过程名称

在Oracle中&#xff0c;您可以查询数据字典视图来查找包含特定文本的存储过程。以下是几种方法&#xff1a;方法1&#xff1a;查询 USER_SOURCE 视图&#xff08;当前用户&#xff09;SELECT DISTINCT s.name AS 存储过程名称 FROM user_source s WHERE UPPER(s.text) LIKE UPP…

在Oracle中,包分为包头(PACKAGE)和包体(PACKAGE BODY),存储过程的实现代码在包体中。以下是几种查找方法

在Oracle中&#xff0c;包分为包头&#xff08;PACKAGE&#xff09;和包体&#xff08;PACKAGE BODY&#xff09;&#xff0c;存储过程的实现代码在包体中。以下是几种查找方法&#xff1a;方法1&#xff1a;查找包中包含关键字的存储过程-- 查找包体&#xff08;PACKAGE BODY&…

2026年8款免费降AI率工具实测推荐,毕业论文党必收藏

2026年8款免费降AI率工具实测推荐&#xff0c;毕业论文党必收藏 TL;DR&#xff1a;2026年知网等平台AIGC检测算法大升级&#xff0c;传统降重手段已经失效。本文实测8款免费降AI率工具&#xff0c;重点推荐嘎嘎降AI&#xff08;达标率99.26%&#xff09;和比话降AI&#xff08;…

4-16路 AC10/50A 互感变送通讯一体电流模块

交流电流监测采集模块是工业物联网(IoT)与自动化领域的专用数据采集设备&#xff0c;核心功能是实时采集交流电路中的电流数据&#xff0c;经过信号调理、模数转换后&#xff0c;将数据上传至云端平台、PLC或工控系统&#xff0c;为能耗管理、设备状态监控、故障报警提供数据支…

真有效值+多通道覆盖!4-16路交流电流监测模块,赋能各行业电气管控

交流电流监测采集模块的应用场景覆盖工业、电力、建筑、新能源、民生等数十个细分领域&#xff0c;核心是通过实时采集交流电流数据&#xff0c;实现设备状态监测、能耗管理、故障报警、安全防护等目标。一、工业自动化与智能制造 这是模块的核心应用领域&#xff0c;几乎所有工…

手把手教你用逻辑重构法降AI,不伤文不伤术语

手把手教你用逻辑重构法降AI&#xff0c;不伤文不伤术语 TL;DR&#xff1a;逻辑重构是降AI的高级技巧&#xff0c;核心是保留专业术语、重组句式逻辑、调整论述顺序。本文详细拆解5个步骤&#xff1a;定位AI特征段落、主被动语态转换、长句拆分短句合并、段落逻辑重组、嵌入批判…

AI助力Alphabet市值突破4万亿美元,竞争依然激烈

谷歌母公司Alphabet本周市值突破4万亿美元大关&#xff0c;仅次于英伟达&#xff0c;位居市场第二&#xff0c;这并不令人意外。该公司持续展示其在AI领域的新实力&#xff0c;苹果将在Siri后台使用Gemini模型&#xff0c;谷歌还为Gemini发布了新的个性化工具以及用于智能体购物…

AEON Environmental Foundation与《生物多样性公约》秘书处联合启动2026年MIDORI生物多样性奖提名

MIDORI奖旨在表彰为生物多样性保护和可持续利用做出杰出贡献的个人 这一独特奖项有助于提升公众意识&#xff0c;让人们认识到生物多样性对人类福祉以及在应对气候变化等全球挑战方面的重要作用 颁奖典礼暨获奖者论坛将于2026年8月27日在日本东京举行 2026年MIDORI生物多样性奖…