问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

制作安卓PDF阅读器:三、实现文本选择

发布网友 发布时间:2022-09-25 19:48

我来回答

1个回答

热心网友 时间:2023-09-20 20:15

我为什么要开启这个系列,努力试着从源头开始,用 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 没有这个问题。

热心网友 时间:2023-09-20 20:15

我为什么要开启这个系列,努力试着从源头开始,用 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 没有这个问题。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
为什么一些男性喜欢要求伴侣叫自己爸爸? proteus8中怎么放置引脚标号 ...在proteus里不知道用什么表示?有没有什么proteus中专门的中英文对照... 甜蜜家园郑毅铭是什么身份 甜蜜家园第二季郑毅铭喜欢谁 瑞梦喜智能空调床垫适合人群 小孩可以用智能床垫吗 智能床垫适合哪些人用 我父亲今年59岁,有高血压和颈椎病的病史,最近一段时间感觉一躺下就偏... ...刚从医院治疗回来。我想买个枕头给他,不知买怎样的比较好?_百度知 ... 有什么正规的外汇平台吗 美味又下饭的酱骨头,大厨们是如何烹饪出来的? 木耳的吃法 木耳的吃法介绍 佛教有多少法门/佛教有多少法门 佛法有多少个法门谁主导? 佛教一共有几个法门?分别意思? 请问佛教一共有多少个法门? 吃油奈有好处吗 别想太多,真的没有什么用 往事不堪回首,想太多没用 无法改变的事情想多了也没有用? 想太多对自己有好处吗? 凡事发生的事情都是必然的,想多了也没有用的意思 什么胶水耐高温又粘得牢 如何评价演员句号在《面具》中扮演的陈老师这个角色 你是如何看待杜志国在《面具》中饰演的魏一平这一角色的? 想问一下分水器专用集成灶都有哪些品牌,建议选哪个? 想问一下分水器专用集成灶真的好用吗? 分水器墙面之间怎么处理 地暖专用分水器的工作温度是多少啊? 地暖分水器什么品牌好 酱骨头的做法及配料 谁知道哪个物联网开发靠谱啊? 如何理解尊重世界文化的多样性是发展本民族文化的内在要求 急求初三的*复习的几个答案1.宽容的含义 2.文化多样性与丰富性的含义3.为什么要相互尊重 今天要啊!! 如何清除杯子里的醋味 在另外一台电脑上登陆百度账号会不会出现原电脑的百度搜索记录 现代周公解梦梦到和离婚的妻子孩子一起吃饭好吗 梦见我和老婆孩子做客不任识回家 印度尼西亚生产的建伍喇叭怎样 健伍A85的低音炮是多大喇叭 苹果6手机进水了没声音怎么办 希沃白板怎么把图片像素压缩 种的稻苗,后秧苗黄是怎么回事 北京的公交车,出租车,地铁,都是怎么收费啊? 鱼胶上有灰尘,怎么去清洗 夏天邮寄火锅怎样保鲜和防泄露 火锅店夏季是怎样保存那些蔬菜、肉类等食物的? 炸葱花饼的做法和配方窍门 炸葱花饼怎么做 水稻苗床喷生根剂后2天稻苗整个全都变黄透亮黄是什么原因那位知道 你好请问苗床的刚生长的稻苗有的发黄 还有刚一出点苗就死了 是什么