使用Qt + mupdf 实现PDF阅读器,支持翻页(上一页、下一页)

思路:

PDF阅读器:使用mupdf,将PDF文件拆分成单个page页,将page页转为QImage图像,使用QListWidget来装载所有的QImage,这样Qt就可以显示出所有图像(完整的PDF)。

翻页:根据滚动条,确认当前是哪一页,然后实现【上一页、下一页】功能

代码:

// pro文件设置
INCLUDEPATH += mupdf
LIBS += -L$$PWD/lib -llibextract -llibmupdf -llibmuthreads -llibthirdparty QMAKE_CFLAGS_DEBUG += -MTd
QMAKE_CXXFLAGS_DEBUG += -MTd
// 显示PDF文件--PDF阅读器
#include <QListWidget>
#include <QListWidgetItem>
#include <QImage>
#include <QIcon>
#include <QSize>
#include "pdf.h"
#include "fitz.h" // 对控件 QListWidget 属性进行设置
/**
* 1. 使用Qt Create编写的demo,所以 QListWidget 控件是直接在ui文件拉进入的
* 2. 需要对每个 QListWidgetItem 加10px的间隔,不然翻页计算不准,或者是 px_num+1 也行
*/
ui->listWidget->setViewMode(QListView::IconMode);
ui->listWidget->setIconSize(QSize(1050, 1485));
ui->listWidget->setSpacing(10);
ui->listWidget->setResizeMode(QListView::Adjust);
ui->listWidget->setMovement(QListView::Static); // 显示 PDF
fz_context* ctx = fz_new_context(NULL, NULL, FZ_STORE_DEFAULT);
fz_register_document_handlers(ctx); // *:这里报错,就需要设置 MTD 或者 MDD
fz_document* doc = fz_open_document(ctx, "F:\\1.pdf"); int pageCount = fz_count_pages(ctx, doc); float zoom = (float)300 / (float)72;
fz_matrix ctm = fz_scale(zoom, zoom); for(int i=0; i<pageCount; i++)
{
fz_pixmap* pix = fz_new_pixmap_from_page_number(ctx, doc, i, ctm, fz_device_rgb(ctx), 0); float b = (float)pix->w / (float)1050;
int t_h = pix->h / b;
QSize t_size(1050, t_h); QImage img(pix->samples, pix->w, pix->h, pix->stride, QImage::Format_RGB888);
img = img.scaled(1050, t_h); QListWidgetItem *tempImageItem = new QListWidgetItem;
tempImageItem->setIcon(QIcon(QPixmap::fromImage(img)));
tempImageItem->setSizeHint(t_size);
ui->listWidget->addItem(tempImageItem); fz_drop_pixmap(ctx, pix);
} fz_drop_document(ctx, doc);
fz_drop_context(ctx);
// 获取当前是哪一页
int getShowPageIndex()
{
// image_height 是 1485,在最开始设置 QListWidget 时就有用到
int px_num = ui->listWidget->verticalScrollBar()->value();
double page_num = ceil(px_num / image_height);
return page_num;
} // 上一页
int page_num = getShowPageIndex();
if(page_num > 0)
ui->listWidget->setCurrentRow(page_num-1, QItemSelectionModel::Current); // 下一页
int page_num = getShowPageIndex();
int page_count = ui->listWidget->count(); if(page_num < page_count-1)
ui->listWidget->setCurrentRow(page_num+1, QItemSelectionModel::Current);

代码比较简单,但是研究mupdf这个库还是花了点时间的,实属不易

另:公司使用的时候,可能还需要讲签名图片贴到PDF上,请参考另一篇文章:mupdf实用操作

Qt + mupdf 显示PDF,支持翻页的更多相关文章

  1. html 打印代码,支持翻页

    ylbtech_html_print html打印代码,支持翻页 <html> <head> <meta name=vs_targetSchema content=&qu ...

  2. flex布局构建大屏框架并支持翻页动画、滚动表格功能

      本文将利用flex属性构建大屏可视化界面.界面主要分标题栏.工具栏.数据可视化窗口.其中,翻页动画以及滚动表格功能分别分布在数据可视化界面两侧. 鼠标点击标题,可看到左侧窗口翻转动画: 整体布局效 ...

  3. iOS:UIPageViewController翻页控制器控件详细介绍

    翻页控制器控件:UIPageViewController 介绍: 1.它是为我们提供了一种类似翻书效果的一种控件.我们可以通过使用UIPageViewController控件,来完成类似图书一样的翻页 ...

  4. PHP.25-TP框架商城应用实例-后台2-商品列表页-搜索、翻页、排序

    商品列表页 1.翻页 控制器GoodsController.class.php添加方法lst(),显示列表页 在商品模型GoodsModel.class.php类中添加search方法 /** *实现 ...

  5. 转:在 C# 中使用 P/Invoke 调用 Mupdf 函数库显示 PDF 文档

    在 C# 中使用 P/Invoke 调用 Mupdf 函数库显示 PDF 文档 一直以来,我都想为 PDF 补丁丁添加一个 PDF 渲染引擎.可是,目前并没有可以在 .NET 框架上运行的免费 PDF ...

  6. Qt仿Android带特效的数字时钟源码分析(滑动,翻页,旋转效果)

    这个数字时钟的源码可以在Qt Demo中找到,风格是仿Android的,不过该Demo中含有三种动画效果(鉴于本人未曾用过Android的系统,因此不知道Android的数字时钟是否也含有这三种效果) ...

  7. 自己定义 ViewGroup 支持无限循环翻页之三(响应回调事件)

    大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处,再次感谢 ################################ ...

  8. OpenOffice将MS docx转换成pdf文件偶数页眉不显示问题解决办法

    OpenOffice版本:4.0(Windows.Linux下测试都出现问题) MS Office版本:2007 问题描述 使用OpenOffice将MS的docx文件转换为pdf文件时,docx文件 ...

  9. Qt编写数据库通用翻页demo(开源)

    在Qt与数据库结合编程的过程中,记录一多,基本上都需要用到翻页查看记录,翻页有个好处就是可以减轻显示数据的表格的压力,不需要一次性将数据库表的记录全部显示,也基本上没有谁在一页上需要一次性显示所有记录 ...

  10. SharePoint 2013 自定义翻页显示列表项

    项目需求:自定义开发一个能分页显示列表项的小部件,允许左右翻页,能根据用户权限来显示管理链接等. 效果如下: 技术要求:使用sharepoint rest API 来获取列表项,这样性能高,能够快速响 ...

随机推荐

  1. JAVA对象生命周期(三)-对象的销毁

    目录 从引用说起 指针直接引用 句柄引用 优缺点 如何判断对象死亡 引用计数法 可达性分析法 垃圾收集算法 标记-清除算法 复制算法 复制算法--优化 有关年轻代的JVM参数 标记-整理算法 分代收集 ...

  2. 【Azure 服务总线】向服务总线发送消息时,返回错误代码Error code : 50009

    问题描述 使用Java SDK向服务总线(Service Bus)发送消息时,返回这个错误: org.springframework.jms.UncategorizedJmsException: Un ...

  3. 【Azure API 管理】是否可以将Swagger 的API定义导入导Azure API Management中

    问题描述 是否可以将Swagger 的API定义导入导Azure API Management中? 操作步骤 是的,可以通过APIM门户导入单个的API Swagger定义文件.具体步骤如下: 第一步 ...

  4. 【Azure 事件中心】如何查看事件中心的消息中具体报文内容呢?

    问题描述 如何查看事件中心的消息中具体报文内容呢? 问题解答 正常情况是通过 Event Hub 的消费端获取消息进行处理查看,但是没有客户端代码的情况下,也可以通过微软的默认客户端Service B ...

  5. 笔记本linux问题记录

    目录 UEFI笔记本无法引导进入操作系统 grub引导错误,无法进入系统 笔记本亮度不能保存 禁用独立显卡 KVM 解决nmcli dev 中的wlan0显示unavailable 杂项 UEFI笔记 ...

  6. 「实操」适配 NebulaGraph 新版本与压测实践

    本文来自邦盛科技-知识图谱团队-繁凡,本文以 NebulaGraph v3.1.0 为例. 前言 NebulaGraph v3.1 版本已经发布有一段时间了,但是我们的项目之前是基于 v2.6.1 版 ...

  7. RabbitMQ 快速复习

    目录 RabbitMQ学习笔记 1.消息队列概述 1.1 为什么学习消息队列 1.2 什么是消息中间件 1.3 消息队列应用场景 1.3.1 异步处理 1.3.2 解耦服务 1.3.3 流量削峰 1. ...

  8. 基于STM32F407MAC与DP83848实现以太网通讯三(STM32F407MAC配置以及数据收发)

    本章实现了基于STM32F407MAC的数据收发功能,通过开发板的RJ45接口连接网线到电脑,电脑使用Wiershark工具抓包验证,工程源码.资料和软件见文末. 参考文档: DP83848IV英文 ...

  9. 摆脱鼠标系列 - vscode - 页内 Ctrl + F 搜索完 回车下一个,选到后按 Esc退回到编辑状态

    为什么 这个很基础,但是没有细细整理 摆脱鼠标系列 - vscode - 页内 Ctrl + F 搜索完 回车下一个,选到后按 Esc退回到编辑状态 之前还找了个快捷键 Alt + Enter,发现冲 ...

  10. 流数据库-RisingWave

    参考: https://docs.risingwave.com/docs/current/architecture/ https://www.risingwavetutorial.com/docs/i ...