qt pdf 模块简介

文章目录

  • 1. 技术平台
  • 2. Qt pdf 模块
  • 3. cmake 使用模块
  • 4. 许可证
  • 5. 简单示例
    • 5.1 CMakeLists.txt
    • 5.2 main.cpp
  • 6. 总结

1. 技术平台

项目说明
OSwin10 x64
Qt6.6
compilermsvc2022
构建工具cmake

2. Qt pdf 模块

  Qt PDF模块包含用于呈现PDF文档的类和函数。

  • QPdfDocument 类加载PDF文档,并根据QPdfDocumentRenderOptions类提供的选项从中呈现页面。
  • QPdfPageRenderer 类管理一个队列,该队列收集所有呈现请求。
  • QPdfPageNavigator 类处理通过PDF文档的导航。
  • QPdfSearchModel 类搜索字符串并保存搜索结果。
  • QPdfBookmarkModel 类保存目录(如果存在)。
  • QPdfLinkModel 保存有关页面上超链接的信息。
  • QPdfView 小部件是一个完整的PDF查看器,< PDF Viewer Widget Example> 示例展示了如何使用它。

Qt Quick 部分略过不提

  如果只需要呈现页面图像,而不需要文本选择、搜索和导航等功能,则该模块包含一个QImageIOHandler插件,该插件将PDF视为可伸缩的图像格式,类似于SVG。您可以简单地使用Image,并将currentFrame属性设置为希望显示的页面索引。如果PDF文件不呈现其自己的背景,则图像具有透明背景。

3. cmake 使用模块

 find_package(Qt6 REQUIRED COMPONENTS Pdf PdfWidgets)
 target_link_libraries(mytarget Qt6::Pdf Qt6::PdfWidgets)

4. 许可证

Qt PDF在Qt公司的商业许可下可用。此外,它在GNU较宽松通用公共许可证(版本3)或GNU通用公共许可证(版本2)下可用。有关此模块的更多详细信息,请参阅Qt PDF许可。

5. 简单示例

在这里插入图片描述

5.1 CMakeLists.txt

#CMakeLists.txt
	
cmake_minimum_required(VERSION 3.5)

project(QtPDF VERSION 0.1 LANGUAGES CXX)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets  PdfWidgets Pdf)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets  PdfWidgets Pdf)

set(PROJECT_SOURCES
        main.cpp
)

if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
    qt_add_executable(QtPDF
        MANUAL_FINALIZATION
        ${PROJECT_SOURCES}
    )
# Define target properties for Android with Qt 6 as:
#    set_property(TARGET QtPDF APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR
#                 ${CMAKE_CURRENT_SOURCE_DIR}/android)
# For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation
else()
    if(ANDROID)
        add_library(QtPDF SHARED
            ${PROJECT_SOURCES}
        )
# Define properties for Android with Qt 5 after find_package() calls as:
#    set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
    else()
        add_executable(QtPDF
            ${PROJECT_SOURCES}
        )
    endif()
endif()

target_link_libraries(QtPDF PRIVATE
  Qt${QT_VERSION_MAJOR}::Widgets
  Qt${QT_VERSION_MAJOR}::PdfWidgets
  Qt${QT_VERSION_MAJOR}::Pdf
)

# Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1.
# If you are developing for iOS or macOS you should consider setting an
# explicit, fixed bundle identifier manually though.
if(${QT_VERSION} VERSION_LESS 6.1.0)
  set(BUNDLE_ID_OPTION MACOSX_BUNDLE_GUI_IDENTIFIER com.example.QtPDF)
endif()
set_target_properties(QtPDF PROPERTIES
    ${BUNDLE_ID_OPTION}
    MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
    MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
    MACOSX_BUNDLE TRUE
    WIN32_EXECUTABLE TRUE
)

include(GNUInstallDirs)
install(TARGETS QtPDF
    BUNDLE DESTINATION .
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

if(QT_VERSION_MAJOR EQUAL 6)
    qt_finalize_executable(QtPDF)
endif()

5.2 main.cpp

#include <QtWidgets>
#include <QtPdfWidgets>
#include "qout.hpp"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QMainWindow w;

    // 分割器
    auto splitter  = new QSplitter(&w);
    w.setCentralWidget(splitter);

    // PDF查看器控件
    auto *pdf_view = new QPdfView(splitter);
    pdf_view->setPageMode(QPdfView::PageMode::MultiPage); // 多页浏览模式
    pdf_view->setZoomMode(QPdfView::ZoomMode::FitToWidth);// 适合宽度模式

    // QPdfDocument类 加载PDF文档并呈现页面
    auto pdf_doc = new QPdfDocument(pdf_view);
    pdf_view->setDocument(pdf_doc);

    pdf_doc->load("E:/00_Download/Compressed/现代 C   教程:高速上手 C  11_14_17_20.pdf");

    // QPdfBookmarkModel类 保存PDF文档中的链接树(锚点),例如目录。
    QPdfBookmarkModel *pdfBookmarkModel = new QPdfBookmarkModel(splitter);
    pdfBookmarkModel->setDocument(pdf_doc);

    // 使用TreeView 来显示目录
    auto bookMarkTreeView = new  QTreeView(splitter);
    QFont serifFont("Times", 10, QFont::Normal);
    bookMarkTreeView->setModel(pdfBookmarkModel);
    bookMarkTreeView->setFont(serifFont);
    bookMarkTreeView->header()->hide();

    splitter->addWidget(bookMarkTreeView);
    splitter->addWidget(pdf_view);
    splitter->setStretchFactor(1,1); // pdf_view 获取最大的可用空间

    w.showMaximized();

    // 打印书签的角色名称
    qout << pdfBookmarkModel->roleNames();
    qout << pdfBookmarkModel->rowCount() << pdfBookmarkModel->columnCount();


    auto index = pdfBookmarkModel->index(0,0);
    qout << index;

    qout << pdfBookmarkModel->data(index,(int)QPdfBookmarkModel::Role::Title);
    qout << pdfBookmarkModel->data(index,(int)QPdfBookmarkModel::Role::Level);
    qout << pdfBookmarkModel->data(index,(int)QPdfBookmarkModel::Role::Page);
    qout << pdfBookmarkModel->data(index,(int)QPdfBookmarkModel::Role::Location);
    qout << pdfBookmarkModel->data(index,(int)QPdfBookmarkModel::Role::Zoom);

    QObject::connect(bookMarkTreeView,&QTreeView::clicked,bookMarkTreeView,[pdf_view,pdfBookmarkModel](const QModelIndex &index){
        QPdfPageNavigator* nav = pdf_view->pageNavigator();
        auto page = pdfBookmarkModel->data(index,(int)QPdfBookmarkModel::Role::Page).toInt();
        nav->jump(page, {}, nav->currentZoom());
    });

    return a.exec();
}

6. 总结

Qt pdf 模块 底层使用的是PDFium库, 不知道是不是PDFium库的版本问题,在解析书签目录的时候,还是有点问题, 没有location,所以没必要深究这个模块,不是太理想

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

浏览器中实现可视化的方式有哪几种?带你盘点一下

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热衷分享有趣实用的文章&#xff0c;希望大家多多支持&#xff0c;一起进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 目录 可视化的含义 浏览器中实现可视化的4种方式 1. HTMLCSS 2. SVG …

Java小游戏 王者荣耀

GameFrame类 所需图片&#xff1a; package 王者荣耀;import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.io.File; import java.util.ArrayLis…

霍夫丁不等式(Hoeffding‘s inequality)

参考资料&#xff1a;Hoeffdings inequality | encyclopedia article by TheFreeDictionary 霍夫丁不等式&#xff08;Hoeffdings inequality&#xff09;描述了随机变量的和、与和的期望之差的上限&#xff1b;或者表述为&#xff1a;随机变量的均值、与均值的期望之差的上限。…

Node.js与npm的准备与操作

1.下载 Node.js官网&#xff1a;Node.jsNode.js is a JavaScript runtime built on Chromes V8 JavaScript engine.https://nodejs.org/en 打开后的界面如下&#xff1a; LTS&#xff08;Long Term Support&#xff09;&#xff1a;长期支持版&#xff0c;稳定版 Current&am…

IDEA出现cannot download sources解决方案

IDEA出现cannot download sources解决方案 问题描述 当我想看第三方库的源码的注释时需要下载源码。 点击Dodnload Sources后可能会出现cannot download sources的问题。 解决方案 这时我们只需在根目录下打开Terminal后执行下面一行代码 mvn dependency:resolve -Dclassi…

【element优化经验】el-dialog修改title样式

目录 前言 解决之路 1.把默认的这个图标隐藏&#xff0c;官方的api有这个属性&#xff1a;showClose值设置false. 2.title插槽定制&#xff1a;左边定制标题&#xff0c;右边定制按钮区域。 3.背景颜色修改&#xff1a;默认title是有padding的需要把它重写调&#xff0c;然…

QQ录屏保存到哪了?教你快速找到保存位置

qq录屏是许多用户常用的屏幕录制工具&#xff0c;可是一旦录制结束&#xff0c;许多人不清楚如何找到和管理录制的视频文件。那么&#xff0c;您知道qq录屏保存到哪了吗&#xff1f;本文将深入研究qq录制视频功能&#xff0c;以帮助您了解如何存储和管理这些重要的录制视频文件…

网络爬虫(Python:Selenium、Scrapy框架;爬虫与反爬虫笔记)

网络爬虫&#xff08;Python&#xff1a;Selenium、Scrapy框架&#xff1b;爬虫与反爬虫笔记&#xff09; SeleniumWebDriver 对象提供的相关方法定位元素ActionChains的基本使用selenium显示等待和隐式等待显示等待隐式等待 Scrapy&#xff08;异步网络爬虫框架&#xff09;Sc…

AIGC|LangChain新手入门指南,5分钟速读版!

如果你用大语言模型来构建AI应用&#xff0c;那你一定不可能绕过LangChain,LangChain是现在最热门的AI应用框架之一&#xff0c;去年年底才刚刚发布&#xff0c;它在github上已经有了4.6万颗星的点赞了&#xff0c;在github社区上&#xff0c;每天都有众多大佬&#xff0c;用它…

数据结构 | 堆排序

数据结构 | 堆排序 文章目录 数据结构 | 堆排序建立大堆排序结果以及全部代码 如果没有看过堆的实现的话可以先看前面的一章堆的实现&#xff0c;然后再来看这个堆排序&#xff0c;都是比较简单的~~ 这里堆排序首先建堆&#xff0c;建堆是要建小堆还是大堆呢&#xff1f; 在堆排…

HT97226 免输出电容立体声耳机放大器的应用与曲线

HT97226应用&#xff1a; ・耳机 ・多媒体音频接口 ・机顶盒 ・ 蓝光/DVD播放器 ・LCD电视 ・音频消费电子产品 HT97226应用图于曲线&#xff1a; HT97226是一款差分输入/单端输入、可直接输出驱动的耳机放大器。5V供…

在vue页面中添加组件到底有多方便

修改vue写的前端页面到底有多方便&#xff1f;如果熟练的话&#xff0c;出乎你想象的快。 原来的页面&#xff1a;/admin/stock 原来的文件地址&#xff1a;src\views\admin\stock\Stock.vue 另一个页面有个入库功能&#xff0c;需要转移到上面的页面中&#xff1a; 路径&…

MindStudio学习记录三:推理应用开发 acl mindx sdk

1.推理应用流程 1.1.创建工程 1.2.模型转换 1.3代码开发 1.3.1ACL代码 1.3.2MindX SDK开发 可视化模块化设计 中间的图片与处理 是基于AIPP的可视化处理 1.5.编译 交叉编译 1.6.运行与调试 1.7 调优工具 profiling性能分析 2.开发举例 resnet-50 2.1 准备工程 2.2.准备模型…

C#-基础及扩展合集(持续更新)

一、基础 Ⅰ 关键字 1、record record&#xff08;记录&#xff09;&#xff0c;编译器会在后台创建一个类。支持类似于结构的值定义&#xff0c;但被实现为一个类&#xff0c;方便创建不可变类型&#xff0c;成员在初始化后不能再被改变 &#xff08;C#9新增&#xff09; …

MT6893_天玑 1200芯片规格参数介绍_datasheet规格书

天玑 1200(MT6893)是一款专为旗舰级全新5G芯片&#xff0c;它融合了先进的AI、相机和多媒体技术&#xff0c;为用户带来令人惊叹的体验。采用先进的6纳米制程设计&#xff0c;内置各种先进技术。该芯片采用旗舰级的八核CPU架构设计&#xff0c;支持16GB强大的四通道内存以及双通…

西门子PLC与组态王无线通讯中如何设置从站

本方案主要详述了在多台西门子300PLC与组态王之间Modbus无线通讯中如何设置从站。方案中所用到的无线通讯终端是DTD434MC——欧美系PLC专用无线通讯终端。 一、方案概述 无线Modbus网络组成如下&#xff1a; 二、测试背景 ● PC端组态软件版本&#xff1a;组态王6.55 ● 默…

CRM的智能招投标对企业有什么意义?

如今CRM系统的生态系统越来越壮大&#xff0c;这些工具的集成极大地丰富了CRM系统的应用场景&#xff0c;例如CRM系统集成企业微信等社交媒体为获客提供便利&#xff1b;再比如CRM集成ChatGPT提高邮件内容质量&#xff0c;对于经常接触招投标项目的业务人员来说&#xff0c;在C…

在NAS上部署.NET版本的WOL远程开机服务

在本文中&#xff0c;我们将以部署基于.NET的WOL远程开机服务为例&#xff0c;详细介绍如何利用Docker技术在群辉部署ASP.NET服务。同时&#xff0c;我们还将展示如何对原有的控制台WOL进行改造&#xff0c;以及如何使用SignAuthorization简易URL验签类库。文章相关的代码开源地…

在PostGIS中进行点数据的等值线提取

说明 介绍在PostGIS中从点数据提取等值线。 关键字&#xff1a; raster、point、PostGIS、等值线 环境准备 Postgresql版本&#xff1a;PostgreSQL 14.0, 64-bitPostGIS版本&#xff1a;POSTGIS"3.3.2"QGIS版本&#xff1a;3.28.3-Firenze&#xff08;验证用&…

Windows系统下更新后自带的画图软件出现马赛克bug

一.bug的样子&#x1f357; 在使用橡皮后&#xff0c;原来写的内容会变成马赛克。而我们希望它是纯白色的。 二.解决方法&#x1f357; 第一步 第二步 第三步 三. 解决后的效果&#x1f357; 用橡皮擦随便擦都不会出现马赛克了。 更新过后&#xff0c;想用win自带的画图软件会出…