70
  • android 市场中的许多应用程序(如 RepliGo、Aldiko、Mantano、ezPdf)在他们的 pdf 查看器中制作了这种类型的注释,如下图所示。
  • 我尝试了很多方法来实现这个注释,但我失败了。我有一个用于 android 的 pdf 查看器和用于使用 iText 绘制线条的注释的单独 Java 代码。
  • 我的问题是我可以在 android 中实现 iText。如果可能,我必须导入哪个包?
  • 同样在某些应用程序中,画布方法用于绘制线条。是否可以在android中包含这个canvas方法而不是使用注释?目标是具有与注释相同的功能。
  • 在下图(RepliGo PDF 阅读器)中,他们使用哪种代码进行注释? 在此处输入图像描述
4

2 回答 2

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

虽然我使用ints 来表示两个位置startPosendPos,但您也可以使用两个或多个变量来引用数组索引、SQLite 数据库表索引、简单文本文档的字符位置;无论您的实现是什么,您都可以更改它,以便您知道从哪里开始注释以及在哪里结束使用该 AnnotationType 进行注释。

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

于 2012-05-05T16:31:50.197 回答
0

Pdf-annotation 是一个开源的,从https://code.google.com/p/pdf-annotation/开始的好点子

于 2014-01-29T08:00:30.717 回答