pdfium_render/pdf/document/page/field/
text.rs1use std::marker::PhantomData;
5
6use crate::bindgen::{FPDF_ANNOTATION, FPDF_FORMHANDLE};
7use crate::error::PdfiumError;
8use crate::pdf::document::page::field::private::internal::{
9 PdfFormFieldFlags, PdfFormFieldPrivate,
10};
11use crate::pdfium::PdfiumLibraryBindingsAccessor;
12
13#[cfg(doc)]
14use {
15 crate::pdf::document::form::PdfForm,
16 crate::pdf::document::page::annotation::PdfPageAnnotationType,
17 crate::pdf::document::page::field::{PdfFormField, PdfFormFieldType},
18};
19
20pub struct PdfFormTextField<'a> {
28 form_handle: FPDF_FORMHANDLE,
29 annotation_handle: FPDF_ANNOTATION,
30 lifetime: PhantomData<&'a FPDF_ANNOTATION>,
31}
32
33impl<'a> PdfFormTextField<'a> {
34 #[inline]
35 pub(crate) fn from_pdfium(
36 form_handle: FPDF_FORMHANDLE,
37 annotation_handle: FPDF_ANNOTATION,
38 ) -> Self {
39 PdfFormTextField {
40 form_handle,
41 annotation_handle,
42 lifetime: PhantomData,
43 }
44 }
45
46 #[inline]
48 pub fn value(&self) -> Option<String> {
49 if self.is_rich_text() {
50 self.get_string_value("RV")
51 } else {
52 self.value_impl()
53 }
54 }
55
56 #[inline]
58 pub fn set_value(&mut self, value: &str) -> Result<(), PdfiumError> {
59 if self.is_rich_text() {
60 self.set_string_value("RV", value)
61 } else {
62 self.set_value_impl(value)
63 }
64 }
65
66 #[inline]
68 pub fn is_multiline(&self) -> bool {
69 self.get_flags_impl()
70 .contains(PdfFormFieldFlags::TextMultiline)
71 }
72
73 #[cfg(any(
74 feature = "pdfium_future",
75 feature = "pdfium_8125",
76 feature = "pdfium_7881",
77 feature = "pdfium_7763",
78 feature = "pdfium_7543",
79 feature = "pdfium_7350"
80 ))]
81 #[inline]
83 pub fn set_is_multiline(&self, is_multiline: bool) -> Result<(), PdfiumError> {
84 self.update_one_flag_impl(PdfFormFieldFlags::TextMultiline, is_multiline)
85 }
86
87 #[inline]
89 pub fn is_password(&self) -> bool {
90 self.get_flags_impl()
91 .contains(PdfFormFieldFlags::TextPassword)
92 }
93
94 #[cfg(any(
95 feature = "pdfium_future",
96 feature = "pdfium_8125",
97 feature = "pdfium_7881",
98 feature = "pdfium_7763",
99 feature = "pdfium_7543",
100 feature = "pdfium_7350"
101 ))]
102 #[inline]
104 pub fn set_is_password(&self, is_password: bool) -> Result<(), PdfiumError> {
105 self.update_one_flag_impl(PdfFormFieldFlags::TextPassword, is_password)
106 }
107
108 pub fn is_file_select(&self) -> bool {
113 self.get_flags_impl()
114 .contains(PdfFormFieldFlags::TextFileSelect)
115 }
116
117 #[cfg(any(
118 feature = "pdfium_future",
119 feature = "pdfium_8125",
120 feature = "pdfium_7881",
121 feature = "pdfium_7763",
122 feature = "pdfium_7543",
123 feature = "pdfium_7350"
124 ))]
125 pub fn set_is_file_select(&mut self, is_file_select: bool) -> Result<(), PdfiumError> {
130 self.update_one_flag_impl(PdfFormFieldFlags::TextFileSelect, is_file_select)
131 }
132
133 pub fn is_spell_checked(&self) -> bool {
135 !self
136 .get_flags_impl()
137 .contains(PdfFormFieldFlags::TextDoNotSpellCheck)
138 }
139
140 #[cfg(any(
141 feature = "pdfium_future",
142 feature = "pdfium_8125",
143 feature = "pdfium_7881",
144 feature = "pdfium_7763",
145 feature = "pdfium_7543",
146 feature = "pdfium_7350"
147 ))]
148 pub fn set_is_spell_checked(&mut self, is_spell_checked: bool) -> Result<(), PdfiumError> {
150 self.update_one_flag_impl(PdfFormFieldFlags::TextDoNotSpellCheck, !is_spell_checked)
151 }
152
153 pub fn is_scrollable(&self) -> bool {
160 !self
161 .get_flags_impl()
162 .contains(PdfFormFieldFlags::TextDoNotScroll)
163 }
164
165 #[cfg(any(
166 feature = "pdfium_future",
167 feature = "pdfium_8125",
168 feature = "pdfium_7881",
169 feature = "pdfium_7763",
170 feature = "pdfium_7543",
171 feature = "pdfium_7350"
172 ))]
173 pub fn set_is_scrollable(&mut self, is_scrollable: bool) -> Result<(), PdfiumError> {
180 self.update_one_flag_impl(PdfFormFieldFlags::TextDoNotScroll, !is_scrollable)
181 }
182
183 pub fn is_combed(&self) -> bool {
192 !self.is_multiline()
196 && !self.is_password()
197 && !self.is_file_select()
198 && self.get_flags_impl().contains(PdfFormFieldFlags::TextComb)
199 }
200
201 pub fn is_rich_text(&self) -> bool {
211 self.get_flags_impl()
212 .contains(PdfFormFieldFlags::TextRichText)
213 }
214
215 #[cfg(any(
216 feature = "pdfium_future",
217 feature = "pdfium_8125",
218 feature = "pdfium_7881",
219 feature = "pdfium_7763",
220 feature = "pdfium_7543",
221 feature = "pdfium_7350"
222 ))]
223 pub fn set_is_rich_text(&mut self, is_rich_text: bool) -> Result<(), PdfiumError> {
227 self.update_one_flag_impl(PdfFormFieldFlags::TextRichText, is_rich_text)
228 }
229}
230
231impl<'a> PdfFormFieldPrivate<'a> for PdfFormTextField<'a> {
232 #[inline]
233 fn form_handle(&self) -> FPDF_FORMHANDLE {
234 self.form_handle
235 }
236
237 #[inline]
238 fn annotation_handle(&self) -> FPDF_ANNOTATION {
239 self.annotation_handle
240 }
241}
242
243impl<'a> PdfiumLibraryBindingsAccessor<'a> for PdfFormTextField<'a> {}
244
245#[cfg(feature = "thread_safe")]
246unsafe impl<'a> Send for PdfFormTextField<'a> {}
247
248#[cfg(feature = "thread_safe")]
249unsafe impl<'a> Sync for PdfFormTextField<'a> {}