Android中PDF目录,搜索(包含中文),文字选择,高亮等实现
来源:互联网 发布:北京java工资水平 编辑:程序博客网 时间:2024/06/14 20:01
最近折腾了一个Android平台上PDF解析的一个项目,涉及到PDF中一些常见的问题,例如PDF的目录,搜索(包含中文),文字选择,高亮等实现,先借此地分享一下自己的一些成果。代码后期会开源出来,供大家分析,有好的建议也欢迎提出。。
参考文档
Adobe的官方文档
百度上的一篇PDF结构的分析
参考项目
Mupdf http://www.mupdf.com/
APV http://code.google.com/p/apv/
APV是基于Mupdf做了一个英文搜索以及显示方面的优化。
本文也主要基于Mupdf对各种模块进行相关的分析。
PDF的GUI分析工具
Voyeur https://github.com/below/PDF-Voyeur 它能帮你从繁杂的pdf spec中解脱出来,比较直观地了解PDF的内部结构,貌似只有Mac版的。。
Mupdf中的一些基础类
fz_obj 使用一个内联结构体代表了PDF中的基本数据类型
PDF支持8种基本对象类型为:布尔值,整型和浮点数(real numbers),字符串,名字,数组,词典,流,空对象
PDF目录
mupdf.h中目录的定义
- struct pdf_outline_s
- {
- char *title;
- pdf_link *link;
- int count;
- pdf_outline *child;
- pdf_outline *next;
- };
Outlines节点为目录的跟节点,它包含的信息为目录的其实页的字典编号以及尾页的字典编号。 /Count为与First节点平行的节点数目(不过看C++ Primer这边书怎么数都不是39)。
<<
/First dictionary
/Count 39
/Last dictionary
>>
其中/Title对应pdf_outline_s中的 *title
/First /Last 对应 *child
/Next 对应 *next
/Dest 对应 *link ,想知道当前的目录对应于PDF中的哪一页,需要用到此结构 (不同PDF版本此结构有差异,有兴趣的可以自己找找,mupdf适配了不同的差异)
获取pdf_outline的方法
- pdf_outline *outline = pdf_load_outline(xref);
- //获取pdf当前目录对应的页码,需要遍历outline,将outline->link->dest中的refrence与交叉应用表中的page refrence做一个比较。
- int currentPageNum = 0;
- while (outline) {
- for (currentPageNum; currentPageNum < totalPages; currentPageNum++) {
- if (fz_is_array(outline->link->dest)) {
- if (fz_objcmp(pdf_resolve_indirect(fz_array_get(outline->link->dest, 0)),
- xref->page_objs[currentPageNum]) == 0) {
- //currentPageNum为当前outline对应的pdf页码(从0开始)
- LOGE("Got the outline page %d", currentPageNum);
- break;
- }
- }
- }
- outline = outline->next;
- }
搜索(包含中文)
文字选择
文字高亮
(待续。。)
先上一个XOOM平板上的选择效果。可以拖动前后的大头针重新选择区域。
- Android中PDF目录,搜索(包含中文),文字选择,高亮等实现
- Android中PDF目录,搜索(包含中文),文字选择,高亮等实现
- android中文字高亮设置案例
- android中文字高亮+表情
- Android端解压zip文件(包含中文目录)
- 实现google和迅雷等网站在搜索文本框中输入文字后能自动提示(模糊查询)
- eclipse中搜索包含中文字和字符的文件
- android中搜索关键字高亮
- android中搜索关键字高亮
- (android文件下载)下载链接中包含特殊字符--空格,中文等,导致无法识别处理方案
- Android TextView文字设置超链接、背景高亮、关键字高亮等用法
- JS判断字符串中包含中文字个数(去除掉中文符号)
- android 实现城市选择、联系人等功能的易拓展 RecyclerView 库,包含自动索引,粘性等功能
- 关于Android HTTP请求URI中包含特殊字符,例如中文,空格等,请求400
- android 树形目录结构的实现(包含源码)
- 文本输入框等字数统计【文字可包含中文/英文/符号/标点等】
- android 设置字符串中包含相关文字设置文字颜色
- android使用html实现部分文字高亮
- C语言,为什么要用int main不用void吗?
- SQL SERVER2005 使用<>与!= 查询结果不一样的问题
- Android TextView自动换行文字排版参差不齐的原因
- [python]关于元祖 字符串 链表
- 小Q系列故事——屌丝的逆袭
- Android中PDF目录,搜索(包含中文),文字选择,高亮等实现
- 转载_进程、轻量级进程(LWP)、线程
- 注意virtual的几点!
- Android 实时获取麦克风输入音量的代码
- setsid()
- AndroidSDKManager无法更新问题
- 创建表格(Table)
- Ural 1706. Cipher Message 2 后缀数组
- 各个平台的mysql重启命令