1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
use std::convert::TryFrom; use std::ffi::{CStr, CString}; use mupdf_sys::*; use num_enum::TryFromPrimitive; use crate::{context, Error}; #[derive(Debug, Clone, Copy, PartialEq, TryFromPrimitive)] #[repr(i32)] pub enum PdfAnnotationType { Text = 0, Link = 1, FreeText = 2, Line = 3, Square = 4, Circle = 5, Polygon = 6, PloyLine = 7, Highlight = 8, Underline = 9, Squiggly = 10, StrikeOut = 11, Redact = 12, Stamp = 13, Caret = 14, Ink = 15, Popup = 16, FileAttachment = 17, Sound = 18, Movie = 19, Widget = 20, Screen = 21, PrinterMark = 22, TrapNet = 23, Watermark = 24, ThreeD = 25, Unknown = -1, } #[derive(Debug, Clone, Copy, PartialEq, TryFromPrimitive)] #[repr(i32)] pub enum LineEndingStyle { None = 0, Square = 1, Circle = 2, Diamond = 3, OpenArrow = 4, ClosedArrow = 5, Butt = 6, ROpenArrow = 7, RClosedArrow = 8, Slash = 9, } #[derive(Debug)] pub struct PdfAnnotation { pub(crate) inner: *mut pdf_annot, } impl PdfAnnotation { pub(crate) unsafe fn from_raw(ptr: *mut pdf_annot) -> Self { Self { inner: ptr } } pub fn r#type(&self) -> Result<PdfAnnotationType, Error> { let subtype = unsafe { ffi_try!(mupdf_pdf_annot_type(context(), self.inner)) }; let typ = PdfAnnotationType::try_from(subtype).unwrap_or(PdfAnnotationType::Unknown); Ok(typ) } pub fn is_hot(&self) -> bool { unsafe { (*self.inner).is_hot > 0 } } pub fn is_active(&self) -> bool { unsafe { (*self.inner).is_active > 0 } } pub fn author(&self) -> Result<Option<&str>, Error> { unsafe { let ptr = ffi_try!(mupdf_pdf_annot_author(context(), self.inner)); if ptr.is_null() { return Ok(None); } let c_str = CStr::from_ptr(ptr); Ok(Some(c_str.to_str().unwrap())) } } pub fn set_author(&mut self, author: &str) -> Result<(), Error> { let c_author = CString::new(author)?; unsafe { ffi_try!(mupdf_pdf_set_annot_author( context(), self.inner, c_author.as_ptr() )); } Ok(()) } } impl Drop for PdfAnnotation { fn drop(&mut self) { if !self.inner.is_null() { unsafe { pdf_drop_annot(context(), self.inner); } } } }