- android 市场中的许多应用程序(如 RepliGo、Aldiko、Mantano、ezPdf)在他们的 pdf 查看器中制作了这种类型的注释,如下图所示。
- 我尝试了很多方法来实现这个注释,但我失败了。我有一个用于 android 的 pdf 查看器和用于使用 iText 绘制线条的注释的单独 Java 代码。
- 我的问题是我可以在 android 中实现 iText。如果可能,我必须导入哪个包?
- 同样在某些应用程序中,画布方法用于绘制线条。是否可以在android中包含这个canvas方法而不是使用注释?目标是具有与注释相同的功能。
- 在下图(RepliGo PDF 阅读器)中,他们使用哪种代码进行注释?
2 回答
您的问题似乎是允许用户在 android/java 中对 PDF 文件进行注释的方法是什么,所以这是适合您的一种方法,尽管它可能不是最佳解决方案。
我想指出,实际上并没有必要仅仅为了允许用户添加和查看注释而编辑实际的 PDF 文件。您的应用程序可以单独存储注释数据,为每个文件存储这些注释,并在文件加载时加载它们。
这意味着它不会创建带有这些注释的新 PDF 文件,而是只会存储加载到您的应用程序中的每个 PDF 文件的用户数据,并在用户再次加载 PDF 文件时显示该数据。(所以它似乎被注释了)。
例子:
- 将 PDF 文件文本、文本格式和图像读入您的应用程序
- 显示文档(如文字处理器)
- 允许用户编辑和注释文档
- 在您的应用程序中保存更改和注释数据(不是 PDF 文件)
- 再次加载文件时,应用先前存储的更改和注释。
您的注释类可能如下所示:
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 来表示两个位置startPos
和endPos
,但您也可以使用两个或多个变量来引用数组索引、SQLite 数据库表索引、简单文本文档的字符位置;无论您的实现是什么,您都可以更改它,以便您知道从哪里开始注释以及在哪里结束使用该 AnnotationType 进行注释。
此外,您可以设置属性更改侦听器,以便在更改注释属性时触发方法来更新您的显示/视图。
Pdf-annotation 是一个开源的,从https://code.google.com/p/pdf-annotation/开始的好点子