pdf阅读器开发

文章基于sumatrapdf的实现(其中mupdf中的内容不会太多涉及),以及自己在此基础上做的
优化,扩展,具体效果可以参考百度阅读器精简版。


最NB的还是得属于foxit,渲染速度一流,展示大图片时很快。


第一部分:PDF基础


第二部分:PDF功能实现


1.展示模式和坐标变换
pdf原生支持一些展示模式,在sumatrapdf的实现中又有一些展示模式,可以实现
pdf原生支持的这些模模式,并在此基础上扩展出一些展示模式。


而模式大概分为两类:
一类模式是有一个虚拟的Canvas,每个页面一行一行地排列在上面,每行可能有一个,两个,甚至
多个页面。Canvas有上下左右边距,页面间有水平和垂直的边距。这个时候,所有的页面都处于
可见状态。然后使用一个矩形框,矩形的边平行于Canvas的边,矩形框被称为Screen矩形,其中的
内容为用户可见。将Canvas的信息提供给上层,于是就可以控制ScreenRect在Canvas上移动,看其中
的pdf。当页面旋转,缩放时,Canvas的大小发生变化,这个时候通知上层Canvas发生变化。


另一类模式是Canvas中只包含有限的页面,典型的是只有两个页面,用来模拟读书的效果。这样Screen
矩形中只能看到Canvas中的页面,通过点击页面,使得Canvas中包含的页面发生变化,达到切换页面的
目的。这样做可以减少Canvas排版时的开销。


在后面,只讨论第一类模式下的pdf展示。


页面在Canvas上占据一个矩形,这个矩形称为Device。在页面内部,有一个坐标系,称
之为User坐标系,该坐标系在pdf文件内部使用。一个User坐标系中的点可以变换到Device矩形中,
其中Device的左上角为原点。而Device中的点可以变换到Canvas中,以Canvas的左上角为原点。
同样的,以Screen矩形的左上角为原点,点的坐标又发生变化。更进一步,Screen相对于窗口的位置
知道,还可以计算出点在窗口中的坐标(一般而言Screen在窗口中铺满)。这样,可以通过
鼠标位置计算出来pdf内部的元素,进而实现一些功能。


在sumatrapdf中提供了一些基础的变换工具,通过一个A矩阵,
A = [a b 0;c d 0;e f 1]
来描述变化。同时在高层实现时还提供了Device,Canvas等坐标系之间的高层次抽象的变换工具,其
实现是用较底层的实现的变换,比如:fz_concat,fz_translate,fz_scale等。。。


2.基本的pdf展示
pdf展示可以按下面的层次组织api:


最底层应该是"Canvas布局",通过PageInfo数组来表示,PageInfo中记录了Page在Canvas中的所有信息。


接着一个层次称为"可见区域":给出了Screen在Canvas中的位置,以及Screen本身的大小,PageInfo中
含有更多的信息,比如可见部分的比例(用于计算),页面在Screen中的位置,第一个可见页面和最
后一个可见页面(自己加的用于优化)


在"可见区域"上是"渲染请求",用于向渲染器请求开始渲染页面。


再接着就是"导航":上一页,下一页,最前一页,最后一页,缩放,滚动,旋转。
"导航"层依赖于其它层次,适当的时候发起渲染请求,窗口重绘请求。


在需要绘制时根据当前绘制信息("可见区域"层计算出来的东西),从页面图像缓存中取出图像,
然后绘制。一般会先绘制Canvas背
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值