如何在android中为pdf查看器进行注释,例如突出显示,删除线,下划线,绘制,添加文本等?


69
  • 下图显示了Android市场中的RepliGo,Aldiko,Mantano,ezPdf等许多应用程序在其pdf查看器中进行这种注释的方式。
  • 我尝试了多种方法来实现此注释,但失败了。我有一个用于Android的pdf查看器,并使用了iText绘制线条来为注释使用单独的Java代码。
  • 我的问题是我可以在android中实现iText吗?如果可能,我必须导入哪个软件包?
  • 同样在某些应用中,画布方法用于绘制线条。是否可以在Android中包含此canvas方法,而不使用注释?目标是具有与批注相同的功能。
  • 在下图中(RepliGo PDF Reader),他们使用了哪种代码进行注释? 在此处输入图片说明

8
@yadab:无论是否可以使用,我只需要有关注释,画布和iText的想法。在发表评论或回答之前,请先阅读并尝试理解问题。
BobDroid '02

1
我正在回覆我的评论。
yadab


5
有一些商业PDF SDK,例如PDFTRON支持注释。您还可以检查开源android项目,例如:Android PDF ViewerAPDFViewer。您可能还需要检查一些相关问题:Android的PDF解析库?[Android:是否有适用于Android的免费PDF库](stackoverflow.com/questions/4665957/pdf-parsing-libr
Lenciel 2012年

14
由于其范围广泛,该问题不太可能得到有用的答案。您应该将其分为更小的,更详细的和更具体的问题。例如,“如何创建带有标注的弹出窗口...”或“如何实现拖放...”
Roman Nurik

Answers:


6

您的问题似乎是允许用户在android / java中对PDF文件进行注释的方法是什么,因此尽管这可能不是最佳解决方案,但这是您的一种方法。

我想指出的是,实际上只是为了允许用户添加和查看注释而不必编辑实际的PDF文件。您的应用程序可以只为注释单独存储数据,为每个文件存储这些注释,并在加载文件时加载它们。

这意味着它不会创建带有这些注释的新PDF文件,而是只会存储每个已加载到您应用中的PDF文件的用户数据,并在用户再次加载该PDF文件时显示。(因此它似乎带有注释)。

例:

  1. 将PDF文件的文本,文本格式和图像读入您的应用程序
  2. 显示文档(如文字处理器)
  3. 允许用户编辑和注释文档
  4. 将更改和注释数据保存在您的应用中(不是PDF文件)
  5. 再次加载文件时,应用以前存储的更改和注释。

您的注释类可能看起来像这样:

class Annotations implements Serializable {

    public Annotations() {
        annotations = new HashSet<Annotation>();
    }

    public ArrayList<Annotation> getAnnotations() {
        return new ArrayList<Annotation>(annotations);
    }

    public Annotation annotate(int starpos, int endpos) {
        Annotation a = new Annotation(startpos, endpos);
        annotations.add(a);
        return a;
    }

    public void unannotate(Annotation a) {
        annotations.remove(a);
    }

    static enum AnnotationTypes {
        HIGHLIGHT, UNDERLINE;
    }

    class Annotation {
        int startPos, endPos;
        AnnotationTypes type;
        Color color;
        Annotation(int start, int end) {
          startPos = start;
          endPos = end;
        }
        public void update(int start, int end) {
          startPos = start;
          endPos = end;
        }
        public void highlight(int red, int green, int blue) {
            type = AnnotationTypes.HIGHLIGHT;
            color = new Color(red, green, blue);
        }
        public void underline(int red, int green, int blue) {
            type = AnnotationTypes.UNDERLINE;
            color = new Color(red, green, blue);
        }
        // getters
        ...
    }

    private Set<Annotation> annotations;
}

因此,您只是在此处存储注释显示数据,并且在加载文件及其相应的(序列化的)注释对象时,可以使用每个注释来影响在startPos和之间的字符显示方式endPos

尽管我在和int的两个位置使用s,但您也可以使用两个或多个变量来引用数组索引,SQLite数据库表索引,简单文本文档的char位置;不管您的实现是什么,您都可以对其进行更改,以便您知道在何处开始使用该AnnotationType进行注释,何处结束使用该AnnotationType进行注释。startPosendPos

另外,您可以设置属性更改侦听器,以便在注释属性更改时,它们会触发方法来更新显示/视图。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.