Detect if an annotation has changed on Android
After loading a document, you can access its annotations via the AnnotationProvider
returned by PdfDocument#getAnnotationProvider
. The annotation provider supports reading, adding, and removing annotations to and from the document associated with it:
val pageIndex = 0 val annotations: List<Annotation> = document.annotationsProvider.getAnnotations(pageIndex)
final int pageIndex = 0; final List<Annotation> annotations = document.getAnnotationsProvider().getAnnotations(pageIndex);
Listening for annotation changes
The PdfFragment
implements the AnnotationManager
interface, allowing you to register listeners that are notified whenever an annotation is selected, modified, or deselected:
override fun onCreate(savedInstanceState : Bundle?) { super.onCreate(savedInstanceState) pdfFragment.addOnAnnotationSelectedListener(object :AnnotationManager.OnAnnotationSelectedListener { override fun onPrepareAnnotationSelection(controller: AnnotationSelectionController, annotation: Annotation, annotationCreated: Boolean): Boolean { // Returning `false` here would prevent the annotation from being selected. return true } override fun onAnnotationSelected(annotation: Annotation, annotationCreated: Boolean) { Log.i(TAG, "The annotation was selected.") } }) pdfFragment.addOnAnnotationDeselectedListener { annotation, reselected -> Log.i(TAG, "The annotation was deselected.") } pdfFragment.addOnAnnotationUpdatedListener(object: OnAnnotationUpdatedListener { override fun onAnnotationCreated(annotation: Annotation) { Log.i(TAG, "The annotation was created.") } override fun onAnnotationUpdated(annotation: Annotation) { Log.i(TAG, "The annotation was updated.") } override fun onAnnotationRemoved(annotation: Annotation) { Log.i(TAG, "The annotation was removed.") } }) // This will remove all previously registered listeners. Instead, you could unregister them selectively. pdfFragment.clearAnnotationListeners() }
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getPdfFragment().addOnAnnotationSelectedListener(new AnnotationManager.OnAnnotationSelectedListener() { @Override public boolean onPrepareAnnotationSelection(@NonNull AnnotationSelectionController controller, @NonNull Annotation annotation, boolean annotationCreated) { // Returning `false` here would prevent the annotation from being selected. return true; } @Override public void onAnnotationSelected(@NonNull Annotation annotation, boolean annotationCreated) { Log.i(TAG, "The annotation was selected"); } }); getPdfFragment().addOnAnnotationDeselectedListener(new AnnotationManager.OnAnnotationDeselectedListener() { @Override public void onAnnotationDeselected(@NonNull Annotation annotation, boolean reselected) { Log.i(TAG, "The annotation was deselected"); } }); getPdfFragment().addOnAnnotationUpdatedListener(new AnnotationProvider.OnAnnotationUpdatedListener() { @Override public void onAnnotationCreated(@NonNull Annotation annotation) { Log.i(TAG, "The annotation was created."); } @Override public void onAnnotationUpdated(@NonNull Annotation annotation) { Log.i(TAG, "The annotation was updated."); } @Override public void onAnnotationRemoved(@NonNull Annotation annotation) { Log.i(TAG, "The annotation was removed."); } }); // This will remove all previously registered listeners. Instead, you could unregister them selectively. getPdfFragment().clearAnnotationListeners(); }
Modifying and saving annotations
If an annotation is modified (i.e. if it has been changed since the document has been loaded) a call to Annotation#isModified
will return true
. Furthermore, the PdfDocument#wasModified
method will return true
if annotations were added, changed, or removed. Once you save the document and its annotations, they’re no longer marked as modified.
If you’re editing annotations using one of the annotation tools, modifications to the edited annotation and document will only be visible after you exit the current tool mode by calling
PdfFragment#exitCurrentlyActiveMode
. If the annotation tool is still active (i.e. the tool is selected in the annotation creation toolbar),PdfDocument#wasModified
will still returnfalse
.
To save a document and its annotations, you can use any of the synchronous or asynchronous save methods on the PdfDocument
class. The following example uses PdfDocument#saveIfModified
, which writes the document back to its original location after testing if it has been modified:
override fun onDocumentLoaded(document : PdfDocument) { assert(document.wasModified() == false) // Add an annotation to the document. val annotation = NoteAnnotation(0, RectF(100, 132, 132, 100), "Test annotation", NoteAnnotation.CROSS) document.annotationProvider.addAnnotationToPage(annotation) assert(annotation.isModified() == true) assert(document.wasModified() == true) // This will write the document back to its original location. document.saveIfModified() assert(annotation.isModified() == false) assert(document.wasModified() == false) }
@Override public void onDocumentLoaded(@NonNull PdfDocument document) { assert document.wasModified() == false; // Add an annotation to the document. NoteAnnotation annotation = new NoteAnnotation(0, new RectF(100, 132, 132, 100), "Test annotation", NoteAnnotation.CROSS); document.getAnnotationProvider().addAnnotationToPage(annotation); assert annotation.isModified() == true; assert document.wasModified() == true; // This will write the document back to its original location. document.saveIfModified(); assert annotation.isModified() == false; assert document.wasModified() == false; }