pub struct DocumentModel {
pub page_count: u32,
pub path: String,
pub url: String,
pub page_words: Vec<Vec<String>>,
pub info: Vec<(String, String)>,
pub has_info: bool,
pub fields: Vec<FieldModel>,
pub named_destinations: Vec<(String, u32)>,
pub annotations: Vec<AnnotModel>,
pub calculate: bool,
}javascript only.Expand description
Everything the Doc object answers from.
Every field has a defined answer when the caller says nothing, and that
answer is the oracle’s for a document with no /Info, no /Fields and no
path: empty strings, zero counts, and a page count of zero.
Fields§
§page_count: u32Doc.numPages. The page count as the viewer knows it.
path: StringDoc.path — the system path, with the oracle’s leading separator.
A leading / is prefixed when there is not one already, which is why
path reads /myfile.pdf where URL reads a bare myfile.pdf.
url: StringDoc.URL — the same path, unprefixed. JS_docGetFilePath().
page_words: Vec<Vec<String>>The words each page draws, in content order.
Installed by the caller, like everything else here: counting them
needs a parsed content stream, which this model deliberately does not
hold. pdfrum_text::content_words is the reader for a pdfrum page, and an
empty list is the honest answer for a caller that did not supply one —
getPageNumWords then answers 0, which is what an empty page gives.
info: Vec<(String, String)>The /Info entries, in the order the dictionary writes them.
A Vec rather than a map because Doc.info enumerates the whole
dictionary after its nine fixed keys, in the file’s own order, and a
sorted map would reorder what a golden pins.
has_info: boolWhether the document has an /Info dictionary at all.
The distinction is load-bearing and is not “is info empty”: with no
/Info at all, every metadata getter and Doc.info itself throw
Object no longer exists., where an /Info present but empty answers
"" for each. GetPropertyInternal returns kBadObjectError the
moment GetInfoDict() is null.
fields: Vec<FieldModel>Every terminal field, in /AcroForm /Fields order.
The list Doc.numFields counts and Doc.getNthFieldName(n) indexes,
and the space FieldRef::index names.
named_destinations: Vec<(String, u32)>The named destinations Doc.gotoNamedDest can reach, and the page
each lands on.
annotations: Vec<AnnotModel>Every annotation Doc.getAnnot and Doc.getAnnots can see, by page.
Pop-ups and widgets are already excluded: getAnnots skips both
subtypes, so a caller that includes them would make
bug_421304870’s count wrong. Filtering here rather than in the
binding keeps the rule beside the /Annots walk that can see the
subtypes.
calculate: boolDoc.calculate — whether a recalculation sweep runs at all.
true is the oracle’s initial state
(CPDFSDK_InteractiveForm’s calculate_ defaults on), and a script
may turn it off.
Implementations§
Source§impl DocumentModel
impl DocumentModel
Sourcepub fn empty() -> DocumentModel
pub fn empty() -> DocumentModel
The model for a document with nothing in it — no pages, no fields, no
/Info.
Not Default, because calculate defaults on upstream and a
derived Default would say otherwise. Every other field’s zero value
is already the right answer.
Sourcepub fn field_at(&self, index: usize) -> Option<&FieldModel>
pub fn field_at(&self, index: usize) -> Option<&FieldModel>
The field at a /Fields position.
Sourcepub fn fields_named<'a>(
&'a self,
name: &str,
) -> impl Iterator<Item = &'a FieldModel> + 'a
pub fn fields_named<'a>( &'a self, name: &str, ) -> impl Iterator<Item = &'a FieldModel> + 'a
Every terminal field a name reaches, in /Fields order.
CountFields(name) is this list’s length and GetField(j, name) is
its jth entry, so a name that is a whole subtree answers every leaf
under it rather than one — which is what makes
AFSimple_Calculate('SUM', ['Group']) add a group’s fields.
Sourcepub fn field_named(&self, name: &str) -> Option<usize>
pub fn field_named(&self, name: &str) -> Option<usize>
The position of the field Doc.getField(name) resolves to.
§A name may be a whole subtree, and it answers the first leaf under it
The field tree has a node per name segment, not per terminal
field. So a name that only names structure — one whose kids each carry
their own /T — is still a node, and the answer is the first terminal
field beneath it.
The object’s .name still reads the name the caller asked for rather
than the field’s own, which is why the Field object carries the lookup
name on the object.
A prefix that is not a whole segment matches nothing: MyFie is not
a node.
Sourcepub fn count_fields(&self, name: &str) -> usize
pub fn count_fields(&self, name: &str) -> usize
How many terminal fields sit under the node a name reaches.
Zero means Doc.getField answers undefined.
Trait Implementations§
Source§impl Clone for DocumentModel
impl Clone for DocumentModel
Source§impl Debug for DocumentModel
impl Debug for DocumentModel
Source§impl Default for DocumentModel
impl Default for DocumentModel
Source§impl PartialEq for DocumentModel
impl PartialEq for DocumentModel
impl StructuralPartialEq for DocumentModel
Auto Trait Implementations§
impl Freeze for DocumentModel
impl RefUnwindSafe for DocumentModel
impl Send for DocumentModel
impl Sync for DocumentModel
impl Unpin for DocumentModel
impl UnsafeUnpin for DocumentModel
impl UnwindSafe for DocumentModel
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.