あなたの質問は、ユーザーがPDFファイルに注釈を付けることができるようにする方法とはどのようなものかということです。したがって、最善の解決策ではないかもしれませんが、ここに1つの方法があります。
実際に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
とstartPos
の2つの位置にendPos
sを使用しましたが、2つ以上の変数を使用して配列インデックス、SQLiteデータベーステーブルインデックス、単純なテキストドキュメントのchar位置を参照することもできます。実装が何であれ、それを変更して、注釈を開始する場所と注釈を終了する場所をそのAnnotationTypeで知ることができます。
また、プロパティの変更リスナーを設定して、アノテーションのプロパティが変更されたときにメソッドを起動して表示/ビューを更新することもできます。
Pdf-annotationはオープンソースであり、 https://code.google.com/p/pdf-annotation/ から始めるのが適切です。