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_7763",
76 feature = "pdfium_7543",
77 feature = "pdfium_7350"
78 ))]
79 #[inline]
81 pub fn set_is_multiline(&self, is_multiline: bool) -> Result<(), PdfiumError> {
82 self.update_one_flag_impl(PdfFormFieldFlags::TextMultiline, is_multiline)
83 }
84
85 #[inline]
87 pub fn is_password(&self) -> bool {
88 self.get_flags_impl()
89 .contains(PdfFormFieldFlags::TextPassword)
90 }
91
92 #[cfg(any(
93 feature = "pdfium_future",
94 feature = "pdfium_7763",
95 feature = "pdfium_7543",
96 feature = "pdfium_7350"
97 ))]
98 #[inline]
100 pub fn set_is_password(&self, is_password: bool) -> Result<(), PdfiumError> {
101 self.update_one_flag_impl(PdfFormFieldFlags::TextPassword, is_password)
102 }
103
104 pub fn is_file_select(&self) -> bool {
109 self.get_flags_impl()
110 .contains(PdfFormFieldFlags::TextFileSelect)
111 }
112
113 #[cfg(any(
114 feature = "pdfium_future",
115 feature = "pdfium_7763",
116 feature = "pdfium_7543",
117 feature = "pdfium_7350"
118 ))]
119 pub fn set_is_file_select(&mut self, is_file_select: bool) -> Result<(), PdfiumError> {
124 self.update_one_flag_impl(PdfFormFieldFlags::TextFileSelect, is_file_select)
125 }
126
127 pub fn is_spell_checked(&self) -> bool {
129 !self
130 .get_flags_impl()
131 .contains(PdfFormFieldFlags::TextDoNotSpellCheck)
132 }
133
134 #[cfg(any(
135 feature = "pdfium_future",
136 feature = "pdfium_7763",
137 feature = "pdfium_7543",
138 feature = "pdfium_7350"
139 ))]
140 pub fn set_is_spell_checked(&mut self, is_spell_checked: bool) -> Result<(), PdfiumError> {
142 self.update_one_flag_impl(PdfFormFieldFlags::TextDoNotSpellCheck, !is_spell_checked)
143 }
144
145 pub fn is_scrollable(&self) -> bool {
152 !self
153 .get_flags_impl()
154 .contains(PdfFormFieldFlags::TextDoNotScroll)
155 }
156
157 #[cfg(any(
158 feature = "pdfium_future",
159 feature = "pdfium_7763",
160 feature = "pdfium_7543",
161 feature = "pdfium_7350"
162 ))]
163 pub fn set_is_scrollable(&mut self, is_scrollable: bool) -> Result<(), PdfiumError> {
170 self.update_one_flag_impl(PdfFormFieldFlags::TextDoNotScroll, !is_scrollable)
171 }
172
173 pub fn is_combed(&self) -> bool {
182 !self.is_multiline()
186 && !self.is_password()
187 && !self.is_file_select()
188 && self.get_flags_impl().contains(PdfFormFieldFlags::TextComb)
189 }
190
191 pub fn is_rich_text(&self) -> bool {
201 self.get_flags_impl()
202 .contains(PdfFormFieldFlags::TextRichText)
203 }
204
205 #[cfg(any(
206 feature = "pdfium_future",
207 feature = "pdfium_7763",
208 feature = "pdfium_7543",
209 feature = "pdfium_7350"
210 ))]
211 pub fn set_is_rich_text(&mut self, is_rich_text: bool) -> Result<(), PdfiumError> {
215 self.update_one_flag_impl(PdfFormFieldFlags::TextRichText, is_rich_text)
216 }
217}
218
219impl<'a> PdfFormFieldPrivate<'a> for PdfFormTextField<'a> {
220 #[inline]
221 fn form_handle(&self) -> FPDF_FORMHANDLE {
222 self.form_handle
223 }
224
225 #[inline]
226 fn annotation_handle(&self) -> FPDF_ANNOTATION {
227 self.annotation_handle
228 }
229}
230
231impl<'a> PdfiumLibraryBindingsAccessor<'a> for PdfFormTextField<'a> {}
232
233#[cfg(feature = "thread_safe")]
234unsafe impl<'a> Send for PdfFormTextField<'a> {}
235
236#[cfg(feature = "thread_safe")]
237unsafe impl<'a> Sync for PdfFormTextField<'a> {}