制作安卓PDF阅读器:三、实现文本选择
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了制作安卓PDF阅读器:三、实现文本选择相关的知识,希望对你有一定的参考价值。
参考技术A我为什么要开启这个系列,努力试着从源头开始,用 PDFium 制作一款阅读器?有人喜欢问这个做了有什么用,这个是唯一的吗?
当然不是唯一的,底层技术更不是我的。不过我认为在维护者的推动下,PDFium 越来越完善,功能越来越多,不 真正 拿来做些什么实在是可惜了。另一个重要原因则是,其他APP要么臃肿或者简陋,要么用着磕手、滑动卡顿、误触频发,而且大多还不免费。( 更正,近年来倒是多了好多免费的PDF阅读器 )
目标期望:
热身运动:当检测到单击( GestureDetector )时,若点击处存在超链接,则打印出超链接的对象。
头文件:fpdf_doc.h
需要将屏幕坐标转换为页面坐标,然后再次在native层转换为所谓的user space、page space。别问我那是啥我也不知道。不过在论坛提问后,有人替我指出了相关文档所在,有时间去看看!
屏幕坐标:[event.getX(), event.getY()]
页面坐标:先前提过将整本PDF当作一张超级大图,subsampling-scale-imageview 有一系列的 viewToSource 坐标转换方法。屏幕转换得到 source 坐标后,减去点击页面的左上角坐标,就是页面坐标。
原始页面坐标需用 FPDF_DeviceToPage 再次转换,才能传给FPDFLink_GetLinkAtPoint,获取坐标处的链接指针。
超链接对象统一返回字符串,可以是Uri地址,也可以是页码 @页码 。
热身运动2:在单击处获取一个英文单词或者汉语词组,需要用到安卓的 BreakIterator。
头文件:fpdf_text.h
首先实现 nativeGetCharIndexAtCoord 方法,获取单击附近的文字索引,需进行同样的坐标转换。
若返回的文字index大于等于零,则此 index 指向该页面全部文本当中的一个字符。全部文本用 FPDFText_GetText 获取(实现 nativeGetText):
接下来就可以用 BreakIterator 分词了:
与绘制PDF本身差不多,不过 bitmap 换成 rect 而已。用到的API依次是FPDFText_CountRects、FPDFText_GetRect。
直接将选框覆盖绘制在前。若要绘制在后面的背景上,就需要三层透明视图了,那么加载铺块和缩略图的时候就要用透明色清空 bitmap,页面的白色背景等也需要另外绘制(Google PDF Viewer应该就是这样,还给背景加了阴影)。这些较为复杂,到时候再说。
有个问题可能需要解决:同一行的选框,部分没有合并。
都是小事儿,暂时不在这上面花时间。
之前做过类似的事情,将普通 TextView 自带的文本选择功能禁用了,然后用API自己做出一个来,包括单击选词,长按托选,放大镜等等。所以相关的内容还是熟悉的。
绘制 Selection Handle 可以用 AppCompat 支持库中的图标资源:
控点的触控操作也很简单,在 Action_Down 中检测落点是否在其中一个 handle 内。若是,则在 Action_Move 中一边移动该 handle,一边检测新的字符索引,作为文本选择的新边界。
由于PDF的复杂性,页面上的字符索引可能间杂排列,比如头一段开头是100,下一段开头50,再下一段150。这就造成先前简单的选择系统“失效”了:
没什么解决方案,API 就这么点。而且,静读天下、Google PDF 查看器都是这样的,唯有 ezpdfreader 没有这个问题。
一键给PDF文档加注释,简单免费!
福昕PDF阅读器是我们阅读PDF文档比较常用的工具,阅读的时候,我们经常会做一些注释,但你知道如何做PDF注释才是最快的吗?
打开“定制功能区”
在福昕阅读器导航栏的空白区域,点击鼠标右键,选择“定制功能区”:
设置、操作、批量删除注释
弹出弹窗“自定义工具栏”,点击“键盘”-“注释”,设置常用注释的快捷键:
选中文本,按下设置的快捷键即可快速注释,如需要批量删除注释,可点击“选择”--“选择标注”,选中需要删除的注释,点击鼠标右键,选择“删除”即可。
福昕PDF阅读器下载:https://www.foxitsoftware.cn/products/reader/
以上是关于制作安卓PDF阅读器:三、实现文本选择的主要内容,如果未能解决你的问题,请参考以下文章