有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在安卓中为pdf查看器制作突出显示、删除线、下划线、绘制、添加文本等注释?

  • 安卓 market中的许多应用程序(如RepliGo、Aldiko、Mantano、ezPdf)在其pdf查看器中制作了此类注释,如下图所示
  • 我尝试了很多方法来实现这个注释,但是失败了。我有一个适用于安卓的pdf查看器和单独的java代码,用于使用iText绘制线条的注释
  • 我的问题是我能否在安卓中实现iText。如果可能的话,我需要导入哪个包
  • 在某些应用程序中,画布方法也用于绘制线条。是否可以在安卓中包含此画布方法而不是使用注释?。目标是拥有与注释相同的特性
  • 在下图(RepliGo PDF Reader)中,他们使用哪种代码进行注释? enter image description here

共 (2) 个答案

  1. # 1 楼答案

    您的问题似乎是,在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;
    }
    

    因此,您只是将注释显示数据存储在这里,当您加载文件及其相应的(序列化的)注释对象时,您可以使用每个注释来影响在文档中startPosendPos之间显示字符的方式

    虽然我已经对两个位置startPosendPos使用了int,但是您也可以使用两个或更多变量来引用数组索引、SQLite数据库表索引、简单文本文档的字符位置;无论您的实现是什么,您都可以更改它,以便知道从何处开始注释,以及在何处使用该注释类型结束注释

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