Android中PDF目录,搜索(包含中文),文字选择,高亮等实现

最近折腾了一个Android平台上PDF解析的一个项目,涉及到PDF中一些常见的问题,例如PDF的目录,搜索(包含中文),文字选择,高亮等实现,先借此地分享一下自己的一些成果。

参考文档

Adobe的官方文档 

https://resources.infosecinstitute.com/pdf-file-format-basic-structure/#gref

参考项目

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;
};

 

 

Voyeur中目录的层级结构

 

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平板上的选择效果。可以拖动前后的大头针重新选择区域。 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 36
    评论
Android平台上的音频文字高亮可以通过使用SpannableString类来实现。SpannableString是一个可以在文本上添加样式和格式的类。 首先,我们需要创建一个SpannableString对象,该对象是用于控制文字的样式和格式的。然后,使用setSpan方法来设置需要高亮文字部分以及对应的样式。 要高亮文字,可以使用ForegroundColorSpan类来设置文字的前景色。例如,可以使用下面的代码将文字的前景色设置为红色: ```java SpannableString spannableString = new SpannableString("这是一段需要高亮文字"); ForegroundColorSpan colorSpan = new ForegroundColorSpan(Color.RED); spannableString.setSpan(colorSpan, 0, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); ``` 以上代码,"这是一段需要高亮文字"这段文字的前8个字符将会被设置为红色。其,第三个参数0表示要设置样式的文字的起始位置,第四个参数8表示要设置样式的文字的结束位置。最后一个参数Spanned.SPAN_EXCLUSIVE_EXCLUSIVE表示设置的样式只作用于起始和结束位置之间的文字。 除了设置前景色之外,还可以使用其他的样式类来实现不同的高亮效果,比如BackgroundColorSpan来设置文字的背景色,ClickableSpan来设置文字的点击效果等等。 最后,将高亮后的SpannableString对象应用到相应的UI控件上,比如TextView,这样高亮文字就会在界面上显示出来。 以上就是使用SpannableString类来实现Android音频文字高亮的一种方式。根据实际需求,还可以结合其他的样式类来实现更多的效果。
评论 36
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值