改进的 Okular 文本选择功能

心之所在 | 2011/08/23

Mahfuzur 的GSoc项目涉及 Okular 的文本选择特性。

当前4.7的Okular文本选择功能(工具-文本选择)很弱,是以字符块的形式,要使文档只有一列的话没问题,要是两列的文档,列间距都会被高亮选择上,不支持多列的文本选择。这个问题见下图所示:

4-7_pdf_selection

还有个问题,Okular 支持多种文档,不同文档生成文本的方式是不同的,在选定文本前 Okular 需要有继承 Generator 的类来生成文本(PDF文档是PDFgenerator类用的poppler处理文本),生成的文本存储在 TextPage 中,每页都有个 TextPage,选定文本后,具体的文字就从 TextPage 中提取出来。

但一些具体类(generators)没有考虑到文字之间的空格(比如djvu),这种情况下文本选择后复制粘贴会出现没空格没法读的悲剧。选择文本的时候很明显空格都没高亮选定,效果图:

4-7_djvu_selection

(中间省略一堆的实现算法/细节……)

最后的效果图是这样的:

selection_and_highlighting_pdf_selection

文本选择功能都够识别“列”

djvu文档的空格问题也解决了:

final-selection-removes-space-problem-in-djvu

多列的文本选择效果(左侧是当前效果,右侧是改进后的)

comaprison-four-columncomparison2comparison1

作者开发中还遇到其它问题,像是没选择文本右键也出现“复制文本”的菜单,odt、epub格式高亮色是黑色而非蓝色的bug,这些都修正了。

此外还需要改进的是报刊杂志常用的复杂布局(列覆盖/重叠,column overlaying   column overlapping),对比Adobe Reader效果(左侧是Okular,很糟,右侧是Adobe Reader):

okular_fails

和chm文档文本选择的generator返回混乱,epub文档文本选择后文字加粗的问题,文本选择/加注解后滚动页面出现随机有颜色的线之类的。

这些还需要改进的地方作者打算以后有空再搞。

via http://nightcrawlerinshadow.wordpress.com/2011/08/20/advanced-text-selection-in-okular/

    泰达希尔-德鲁伊
    Tags: ,

    8 FEEDBACKS

    1. 赞,要是真正支持PDF的批注就好了。

    2. uu

      这个问题终于解决了。由于这个问题 ,用了老长一段时间wine foxit reader. pdf批注就算不能真正写入pdf文件,也要做得人性化一些啊,而且书签没法导出。感觉还是foxit reader好使。

    3. @uu 我就觉得现有的批注比较好,对原文本无损,可控权限(想发给谁就给谁,不用担心原文档泄漏自己的批注)。

      这改进很明显实用, 虽然我非常少用文本选择功能。

    4. uu

      @黑传说 文本选择,毕业论文时用得着…… 汗。。。

    5. adaptee

      “真批注”非常有必要,不过现在的这种”伪批注”也挺有用

    6. @黑传说 无法和其他系统交流是硬伤。

    7. stecue

      这个会在KDE 4.8里实现么?反正大部分情况俺都用wine foxit reader。

    8. programmer

      貌似这个在sumatraPDF里实现了。。

    Leave a Reply

    Your email address will not be published. Required fields are marked *

    Note: Commenter is allowed to use '@User+blank' to automatically notify your reply to other commenter. e.g, if ABC is one of commenter of this post, then write '@ABC '(exclude ') will automatically send your comment to ABC. Using '@all ' to notify all previous commenters. Be sure that the value of User should exactly match with commenter's name (case sensitive).