制作安卓PDF阅读器:五、实现文本高亮、下划线、保存PDF

一、上下文菜单( context menu )

用 TextView 实现,通过clickaspan处理点击事件。

背景图用 Android 9-patch shadow generator 生成,参数如下:

round 8
shadow blur 8
shadow color #757575
Outline width 3
128x35
20%-30%
9%-6%

二、点击选取标注

1. 点击后绘制包裹框

头文件:fpdf_annot.h

API:FPDFPage_GetAnnotCount、FPDFAnnot_GetRect,获得标注的整体包裹Rect。

得到 Rect 后,将之绘制出来,与文本选择一样,不过绘制的是矩形方框。

2. 将标注形状转换为文本选择

标注仅是形状,无文本选择信息。需要通过 FPDFAnnot_CountAttachmentPoints、 FPDFAnnot_GetAttachmentPoints、FPDFText_GetCharIndexAtPos 恢复文本选择。

FPDFAnnot_GetRect 获得的仅仅是一个整体包裹框,并非实际形状。实际形状由 AttachmentPoints 定义,可以包含多个矩形信息,一组 AttachmentPoints 由矩形的四个顶点 (x1,y1)、 (x2,y2)、 (x3,y3)、 (x4,y4) 组成,这样的“矩形”可以是任意形状、任意旋转角度的。

2.1

在此之前需用 FPDFAnnot_GetAttachmentPoints 修改点击高亮标注的方法,因为多个高亮标注的包裹框可能有重叠,而包裹框的包裹范围大于高亮标注的实际范围。若存在多个结果,则用 FPDFAnnot_GetAttachmentPoints 剔除不符合的,并将其他符合条件(包含触点下的PDF像素)的高亮标注存储起来。若仍然存在多个结果,则需要计算出最符合条件的,可能是面积最小的,也可能是中心点距离最近的。

点击选取标注的第一步本质是在平面内用一个点选择包含该点的矩形,所有矩形的旋转为0。这样的问题可以简单迭代判断,或用R树解决达到性能最优化。

简单处理高亮标注的单击选取问题,会造成标注之间的错误遮蔽现象。

  • 反例:(静读天下)
    标注添加的先后顺序影响标注之间的错误遮蔽。


    未遮蔽
错误遮蔽,即使标注之间无实际覆盖,也无法选择较小的标注。
  • 反例:(ezpdf reader)
    较大的高亮标注覆盖并遮蔽较小的高亮标注,使其无法被选中。


2.2

AttachmentPoints 的坐标配合 FPDFText_GetCharIndexAtPos 可以用来恢复高亮标注的文本选择。


于是乎,标注选择与文本选择自然地共享几乎全部功能,都可以调用翻译、分享、查词典等菜单项。


三、新建高亮标记

关键 API:FPDFPage_CreateAnnot、FPDFAnnot_SetRect、FPDFAnnot_AppendAttachmentPoints.

FPDFAnnot_SetRect 和 FPDFAnnot_AppendAttachmentPoints 的区别参考 https://stackoverflow.com/questions/61524219/difference-between-fpdfannot-setrect-and-fpdfannot-appendattachmentpoints-when-a/64835128#64835128。(顺便帮我的回答点下赞也是好的。。。)

FPDFAnnot_AppendAttachmentPoints 定义的矩形与选区矩形差不多,但之前实现的选区矩形太过分散,可以用简单的算法,将同一行的矩形合并成大矩形。

生成的高亮标注两边没有鼓胀效果,不知如何实现。


四、保存PDF

API:FPDF_SaveAsCopy。虽然可以传入标志位FPDF_INCREMENTAL,但无法增量保存。不用增量保存的话,结果PDF文件体积较大。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容