Qt + mupdf 显示PDF,支持翻页
使用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,支持翻页的更多相关文章
- html 打印代码,支持翻页
ylbtech_html_print html打印代码,支持翻页 <html> <head> <meta name=vs_targetSchema content=&qu ...
- flex布局构建大屏框架并支持翻页动画、滚动表格功能
本文将利用flex属性构建大屏可视化界面.界面主要分标题栏.工具栏.数据可视化窗口.其中,翻页动画以及滚动表格功能分别分布在数据可视化界面两侧. 鼠标点击标题,可看到左侧窗口翻转动画: 整体布局效 ...
- iOS:UIPageViewController翻页控制器控件详细介绍
翻页控制器控件:UIPageViewController 介绍: 1.它是为我们提供了一种类似翻书效果的一种控件.我们可以通过使用UIPageViewController控件,来完成类似图书一样的翻页 ...
- PHP.25-TP框架商城应用实例-后台2-商品列表页-搜索、翻页、排序
商品列表页 1.翻页 控制器GoodsController.class.php添加方法lst(),显示列表页 在商品模型GoodsModel.class.php类中添加search方法 /** *实现 ...
- 转:在 C# 中使用 P/Invoke 调用 Mupdf 函数库显示 PDF 文档
在 C# 中使用 P/Invoke 调用 Mupdf 函数库显示 PDF 文档 一直以来,我都想为 PDF 补丁丁添加一个 PDF 渲染引擎.可是,目前并没有可以在 .NET 框架上运行的免费 PDF ...
- Qt仿Android带特效的数字时钟源码分析(滑动,翻页,旋转效果)
这个数字时钟的源码可以在Qt Demo中找到,风格是仿Android的,不过该Demo中含有三种动画效果(鉴于本人未曾用过Android的系统,因此不知道Android的数字时钟是否也含有这三种效果) ...
- 自己定义 ViewGroup 支持无限循环翻页之三(响应回调事件)
大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处,再次感谢 ################################ ...
- OpenOffice将MS docx转换成pdf文件偶数页眉不显示问题解决办法
OpenOffice版本:4.0(Windows.Linux下测试都出现问题) MS Office版本:2007 问题描述 使用OpenOffice将MS的docx文件转换为pdf文件时,docx文件 ...
- Qt编写数据库通用翻页demo(开源)
在Qt与数据库结合编程的过程中,记录一多,基本上都需要用到翻页查看记录,翻页有个好处就是可以减轻显示数据的表格的压力,不需要一次性将数据库表的记录全部显示,也基本上没有谁在一页上需要一次性显示所有记录 ...
- SharePoint 2013 自定义翻页显示列表项
项目需求:自定义开发一个能分页显示列表项的小部件,允许左右翻页,能根据用户权限来显示管理链接等. 效果如下: 技术要求:使用sharepoint rest API 来获取列表项,这样性能高,能够快速响 ...
随机推荐
- 我的第一个项目(七):(解决问题)Vue中canvas无法绘制图片
好家伙, 现在,我想要把我的飞机大战塞到我的主页里去,想办法把文件导入 然后,直接死在第一步,图片渲染都成问题 先用vue写一个测试文件 来测试canvas的绘制 <template> ...
- 【Azure 环境】ARM部署模板大于4MB的解决方案及Linked Template遇见存储账号防火墙无法访问
问题一:在ADF Pipeline部署ARM Template报错"Deployment failed -- the request content size exceeds the max ...
- 【Azure 事件中心】Spring Cloud Stream Event Hubs Binder 发送Event Hub消息遇见 Spec. Rule 1.3 - onSubscribe, onNext, onError and onComplete signaled to a Subscriber MUST be signaled serially 异常
问题描述 开发Java Spring Cloud应用,需要发送消息到Azure Event Hub中.使用 Spring Cloud Stream Event Hubs Binder 依赖,应用执行一 ...
- 【Azure 服务总线】向服务总线发送消息时,返回错误代码Error code : 50009
问题描述 使用Java SDK向服务总线(Service Bus)发送消息时,返回这个错误: org.springframework.jms.UncategorizedJmsException: Un ...
- C程序分别实现下列字符阵列的输出
C程序分别实现下列字符阵列的输出:(https://zhuanlan.zhihu.com/p/443989560 可以参考这个博主写的) 1,左下三角形(代码) 1 #include <s ...
- JAVA微服务分布式事务的几种实现方式
基础理论 CAP理论 一致性(Consistency) :在分布式系统中所有的数据备份,在同一时刻都保持一致状态,如无法保证状态一致,直接返回错误: 可用性(Availability):在集群中一部分 ...
- 2.Canal连接MQ
1. 配置文件介绍 Canal的启动,是以创建实例(instance)的方式,每个实例都有自己单独的工作环境, 而配置也分成两个部分 canal.properties (系统根配置文件) instan ...
- python 微信自动发图片,批量发送
自动发送批量的图片给微信联系人,可为自己的文件传输助手 已实现: 可设置发送时间间隔 发送图片数量 指定接收人 下载链接: python批量自动连发图片给微信好友自动发图片-Python文档类资源-C ...
- Sagas论文原文读后总结
一.引子 分布式事务组件seata最近社区很活跃,刚好公司有对接seata的计划.刚好借此机会,彻底了解下seata的价值.其中有一个比较特殊的模式叫SAGA模式,听起来就很懵逼,按照官网的介绍起源于 ...
- git 全局用户名改为英文,中文生成的git记录文件 不能有中文,现场反馈 git config user.name
设置用户名和邮箱 git config --global user.name "username" git config --global user.email useremail ...