Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(581)

Side by Side Diff: core/src/fpdfdoc/doc_form.cpp

Issue 1265503005: clang-format all pdfium code. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: sigh Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #include "../../include/fpdfdoc/fpdf_doc.h" 7 #include "../../include/fpdfdoc/fpdf_doc.h"
8 #include "doc_utils.h" 8 #include "doc_utils.h"
9 9
10 const int nMaxRecursion = 32; 10 const int nMaxRecursion = 32;
11 11
12 class _CFieldNameExtractor 12 class _CFieldNameExtractor {
13 { 13 public:
14 public: 14 _CFieldNameExtractor(const CFX_WideString& full_name) {
15 _CFieldNameExtractor(const CFX_WideString& full_name) 15 m_pStart = full_name.c_str();
16 { 16 m_pEnd = m_pStart + full_name.GetLength();
17 m_pStart = full_name.c_str(); 17 m_pCur = m_pStart;
18 m_pEnd = m_pStart + full_name.GetLength(); 18 }
19 m_pCur = m_pStart; 19 void GetNext(const FX_WCHAR*& pSubName, FX_STRSIZE& size) {
20 } 20 pSubName = m_pCur;
21 void GetNext(const FX_WCHAR* &pSubName, FX_STRSIZE& size) 21 while (m_pCur < m_pEnd && m_pCur[0] != L'.') {
22 { 22 m_pCur++;
23 pSubName = m_pCur; 23 }
24 while (m_pCur < m_pEnd && m_pCur[0] != L'.') { 24 size = (FX_STRSIZE)(m_pCur - pSubName);
25 m_pCur++; 25 if (m_pCur < m_pEnd && m_pCur[0] == L'.') {
26 m_pCur++;
27 }
28 }
29
30 protected:
31 const FX_WCHAR* m_pStart;
32 const FX_WCHAR* m_pEnd;
33 const FX_WCHAR* m_pCur;
34 };
35 class CFieldTree {
36 public:
37 struct _Node {
38 _Node* parent;
39 CFX_PtrArray children;
40 CFX_WideString short_name;
41 CPDF_FormField* field_ptr;
42 int CountFields(int nLevel = 0) {
43 if (nLevel > nMaxRecursion) {
44 return 0;
45 }
46 if (field_ptr) {
47 return 1;
48 }
49 int count = 0;
50 for (int i = 0; i < children.GetSize(); i++) {
51 count += ((_Node*)children.GetAt(i))->CountFields(nLevel + 1);
52 }
53 return count;
54 }
55 CPDF_FormField* GetField(int* fields_to_go) {
56 if (field_ptr) {
57 if (*fields_to_go == 0) {
58 return field_ptr;
26 } 59 }
27 size = (FX_STRSIZE)(m_pCur - pSubName); 60 --*fields_to_go;
28 if (m_pCur < m_pEnd && m_pCur[0] == L'.') { 61 return NULL;
29 m_pCur++; 62 }
63 for (int i = 0; i < children.GetSize(); i++) {
64 _Node* pNode = (_Node*)children.GetAt(i);
65 CPDF_FormField* pField = pNode->GetField(fields_to_go);
66 if (pField) {
67 return pField;
30 } 68 }
31 } 69 }
32 protected: 70 return NULL;
33 const FX_WCHAR* m_pStart; 71 }
34 const FX_WCHAR* m_pEnd; 72 CPDF_FormField* GetField(int index) {
35 const FX_WCHAR* m_pCur; 73 int fields_to_go = index;
74 return GetField(&fields_to_go);
75 }
76 };
77 CFieldTree();
78 ~CFieldTree();
79 void SetField(const CFX_WideString& full_name, CPDF_FormField* field_ptr);
80 CPDF_FormField* GetField(const CFX_WideString& full_name);
81 CPDF_FormField* RemoveField(const CFX_WideString& full_name);
82 void RemoveAll();
83 _Node* FindNode(const CFX_WideString& full_name);
84 _Node* AddChild(_Node* pParent,
85 const CFX_WideString& short_name,
86 CPDF_FormField* field_ptr);
87 void RemoveNode(_Node* pNode, int nLevel = 0);
88 _Node* _Lookup(_Node* pParent, const CFX_WideString& short_name);
89 _Node m_Root;
36 }; 90 };
37 class CFieldTree 91 CFieldTree::CFieldTree() {
38 { 92 m_Root.parent = NULL;
39 public: 93 m_Root.field_ptr = NULL;
40 struct _Node { 94 }
41 _Node *parent; 95 CFieldTree::~CFieldTree() {
42 CFX_PtrArray children; 96 RemoveAll();
43 CFX_WideString short_name; 97 }
44 CPDF_FormField *field_ptr; 98 CFieldTree::_Node* CFieldTree::AddChild(_Node* pParent,
45 int CountFields(int nLevel = 0) 99 const CFX_WideString& short_name,
46 { 100 CPDF_FormField* field_ptr) {
47 if (nLevel > nMaxRecursion) { 101 if (pParent == NULL) {
48 return 0; 102 return NULL;
49 } 103 }
50 if (field_ptr) { 104 _Node* pNode = new _Node;
51 return 1; 105 pNode->parent = pParent;
52 } 106 pNode->short_name = short_name;
53 int count = 0; 107 pNode->field_ptr = field_ptr;
54 for (int i = 0; i < children.GetSize(); i ++) { 108 pParent->children.Add(pNode);
55 count += ((_Node *)children.GetAt(i))->CountFields(nLevel + 1); 109 return pNode;
56 } 110 }
57 return count; 111 void CFieldTree::RemoveNode(_Node* pNode, int nLevel) {
58 } 112 if (pNode == NULL) {
59 CPDF_FormField* GetField(int* fields_to_go) 113 return;
60 { 114 }
61 if (field_ptr) { 115 if (nLevel > nMaxRecursion) {
62 if (*fields_to_go == 0) { 116 delete pNode;
63 return field_ptr; 117 return;
64 } 118 }
65 --*fields_to_go; 119 CFX_PtrArray& ptr_array = pNode->children;
66 return NULL; 120 for (int i = 0; i < ptr_array.GetSize(); i++) {
67 } 121 _Node* pChild = (_Node*)ptr_array[i];
68 for (int i = 0; i < children.GetSize(); i++) { 122 RemoveNode(pChild, nLevel + 1);
69 _Node *pNode = (_Node *)children.GetAt(i); 123 }
70 CPDF_FormField* pField = pNode->GetField(fields_to_go); 124 delete pNode;
71 if (pField) { 125 }
72 return pField; 126 CFieldTree::_Node* CFieldTree::_Lookup(_Node* pParent,
73 } 127 const CFX_WideString& short_name) {
74 } 128 if (pParent == NULL) {
75 return NULL; 129 return NULL;
76 } 130 }
77 CPDF_FormField* GetField(int index) 131 CFX_PtrArray& ptr_array = pParent->children;
78 { 132 for (int i = 0; i < ptr_array.GetSize(); i++) {
79 int fields_to_go = index; 133 _Node* pNode = (_Node*)ptr_array[i];
80 return GetField(&fields_to_go); 134 if (pNode->short_name.GetLength() == short_name.GetLength() &&
81 } 135 FXSYS_memcmp(pNode->short_name.c_str(), short_name.c_str(),
82 }; 136 short_name.GetLength() * sizeof(FX_WCHAR)) == 0) {
83 CFieldTree(); 137 return pNode;
84 ~CFieldTree(); 138 }
85 void SetField(const CFX_WideString &full_name, CPDF_FormField *field_ptr); 139 }
86 CPDF_FormField *GetField(const CFX_WideString &full_name); 140 return NULL;
87 CPDF_FormField *RemoveField(const CFX_WideString &full_name); 141 }
88 void RemoveAll(); 142 void CFieldTree::RemoveAll() {
89 _Node *FindNode(const CFX_WideString &full_name); 143 CFX_PtrArray& ptr_array = m_Root.children;
90 _Node * AddChild(_Node *pParent, const CFX_WideString &short_name, CPDF_Form Field *field_ptr); 144 for (int i = 0; i < ptr_array.GetSize(); i++) {
91 void RemoveNode(_Node *pNode, int nLevel = 0); 145 _Node* pNode = (_Node*)ptr_array[i];
92 _Node *_Lookup(_Node *pParent, const CFX_WideString &short_name); 146 RemoveNode(pNode);
93 _Node m_Root; 147 }
94 }; 148 }
95 CFieldTree::CFieldTree() 149 void CFieldTree::SetField(const CFX_WideString& full_name,
96 { 150 CPDF_FormField* field_ptr) {
97 m_Root.parent = NULL; 151 if (full_name == L"") {
98 m_Root.field_ptr = NULL; 152 return;
99 } 153 }
100 CFieldTree::~CFieldTree() 154 _CFieldNameExtractor name_extractor(full_name);
101 { 155 const FX_WCHAR* pName;
102 RemoveAll(); 156 FX_STRSIZE nLength;
103 } 157 name_extractor.GetNext(pName, nLength);
104 CFieldTree::_Node *CFieldTree::AddChild(_Node *pParent, const CFX_WideString &sh ort_name, CPDF_FormField *field_ptr) 158 _Node *pNode = &m_Root, *pLast = NULL;
105 { 159 while (nLength > 0) {
106 if (pParent == NULL) { 160 pLast = pNode;
107 return NULL; 161 CFX_WideString name = CFX_WideString(pName, nLength);
108 } 162 pNode = _Lookup(pLast, name);
109 _Node* pNode = new _Node; 163 if (pNode == NULL) {
110 pNode->parent = pParent; 164 pNode = AddChild(pLast, name, NULL);
111 pNode->short_name = short_name; 165 }
166 name_extractor.GetNext(pName, nLength);
167 }
168 if (pNode != &m_Root) {
112 pNode->field_ptr = field_ptr; 169 pNode->field_ptr = field_ptr;
113 pParent->children.Add(pNode); 170 }
114 return pNode; 171 }
115 } 172 CPDF_FormField* CFieldTree::GetField(const CFX_WideString& full_name) {
116 void CFieldTree::RemoveNode(_Node *pNode, int nLevel) 173 if (full_name == L"") {
117 { 174 return NULL;
118 if (pNode == NULL) { 175 }
119 return ; 176 _CFieldNameExtractor name_extractor(full_name);
120 } 177 const FX_WCHAR* pName;
121 if (nLevel > nMaxRecursion) { 178 FX_STRSIZE nLength;
122 delete pNode; 179 name_extractor.GetNext(pName, nLength);
123 return ; 180 _Node *pNode = &m_Root, *pLast = NULL;
124 } 181 while (nLength > 0 && pNode) {
125 CFX_PtrArray& ptr_array = pNode->children; 182 pLast = pNode;
126 for (int i = 0; i < ptr_array.GetSize(); i ++) { 183 CFX_WideString name = CFX_WideString(pName, nLength);
127 _Node *pChild = (_Node *)ptr_array[i]; 184 pNode = _Lookup(pLast, name);
128 RemoveNode(pChild, nLevel + 1);
129 }
130 delete pNode;
131 }
132 CFieldTree::_Node *CFieldTree::_Lookup(_Node *pParent, const CFX_WideString &sho rt_name)
133 {
134 if (pParent == NULL) {
135 return NULL;
136 }
137 CFX_PtrArray& ptr_array = pParent->children;
138 for (int i = 0; i < ptr_array.GetSize(); i ++) {
139 _Node *pNode = (_Node *)ptr_array[i];
140 if (pNode->short_name.GetLength() == short_name.GetLength() &&
141 FXSYS_memcmp(pNode->short_name.c_str(), short_name.c_str(), shor t_name.GetLength()*sizeof(FX_WCHAR)) == 0) {
142 return pNode;
143 }
144 }
145 return NULL;
146 }
147 void CFieldTree::RemoveAll()
148 {
149 CFX_PtrArray& ptr_array = m_Root.children;
150 for (int i = 0; i < ptr_array.GetSize(); i ++) {
151 _Node *pNode = (_Node *)ptr_array[i];
152 RemoveNode(pNode);
153 }
154 }
155 void CFieldTree::SetField(const CFX_WideString &full_name, CPDF_FormField *field _ptr)
156 {
157 if (full_name == L"") {
158 return;
159 }
160 _CFieldNameExtractor name_extractor(full_name);
161 const FX_WCHAR* pName;
162 FX_STRSIZE nLength;
163 name_extractor.GetNext(pName, nLength); 185 name_extractor.GetNext(pName, nLength);
164 _Node *pNode = &m_Root, *pLast = NULL; 186 }
165 while (nLength > 0) { 187 return pNode ? pNode->field_ptr : NULL;
166 pLast = pNode; 188 }
167 CFX_WideString name = CFX_WideString(pName, nLength); 189 CPDF_FormField* CFieldTree::RemoveField(const CFX_WideString& full_name) {
168 pNode = _Lookup(pLast, name); 190 if (full_name == L"") {
169 if (pNode == NULL) { 191 return NULL;
170 pNode = AddChild(pLast, name, NULL); 192 }
171 } 193 _CFieldNameExtractor name_extractor(full_name);
172 name_extractor.GetNext(pName, nLength); 194 const FX_WCHAR* pName;
173 } 195 FX_STRSIZE nLength;
174 if (pNode != &m_Root) { 196 name_extractor.GetNext(pName, nLength);
175 pNode->field_ptr = field_ptr; 197 _Node *pNode = &m_Root, *pLast = NULL;
176 } 198 while (nLength > 0 && pNode) {
177 } 199 pLast = pNode;
178 CPDF_FormField *CFieldTree::GetField(const CFX_WideString &full_name) 200 CFX_WideString name = CFX_WideString(pName, nLength);
179 { 201 pNode = _Lookup(pLast, name);
180 if (full_name == L"") {
181 return NULL;
182 }
183 _CFieldNameExtractor name_extractor(full_name);
184 const FX_WCHAR* pName;
185 FX_STRSIZE nLength;
186 name_extractor.GetNext(pName, nLength); 202 name_extractor.GetNext(pName, nLength);
187 _Node *pNode = &m_Root, *pLast = NULL; 203 }
188 while (nLength > 0 && pNode) { 204 if (pNode && pNode != &m_Root) {
189 pLast = pNode; 205 CFX_PtrArray& ptr_array = pLast->children;
190 CFX_WideString name = CFX_WideString(pName, nLength); 206 for (int i = 0; i < ptr_array.GetSize(); i++) {
191 pNode = _Lookup(pLast, name); 207 if (pNode == (_Node*)ptr_array[i]) {
192 name_extractor.GetNext(pName, nLength); 208 ptr_array.RemoveAt(i);
193 } 209 break;
194 return pNode ? pNode->field_ptr : NULL; 210 }
195 } 211 }
196 CPDF_FormField *CFieldTree::RemoveField(const CFX_WideString & full_name) 212 CPDF_FormField* pField = pNode->field_ptr;
197 { 213 RemoveNode(pNode);
198 if (full_name == L"") { 214 return pField;
199 return NULL; 215 }
200 } 216 return NULL;
201 _CFieldNameExtractor name_extractor(full_name); 217 }
202 const FX_WCHAR* pName; 218 CFieldTree::_Node* CFieldTree::FindNode(const CFX_WideString& full_name) {
203 FX_STRSIZE nLength; 219 if (full_name == L"") {
220 return NULL;
221 }
222 _CFieldNameExtractor name_extractor(full_name);
223 const FX_WCHAR* pName;
224 FX_STRSIZE nLength;
225 name_extractor.GetNext(pName, nLength);
226 _Node *pNode = &m_Root, *pLast = NULL;
227 while (nLength > 0 && pNode) {
228 pLast = pNode;
229 CFX_WideString name = CFX_WideString(pName, nLength);
230 pNode = _Lookup(pLast, name);
204 name_extractor.GetNext(pName, nLength); 231 name_extractor.GetNext(pName, nLength);
205 _Node *pNode = &m_Root, *pLast = NULL; 232 }
206 while (nLength > 0 && pNode) { 233 return pNode;
207 pLast = pNode; 234 }
208 CFX_WideString name = CFX_WideString(pName, nLength); 235 CPDF_InterForm::CPDF_InterForm(CPDF_Document* pDocument, FX_BOOL bGenerateAP)
209 pNode = _Lookup(pLast, name); 236 : CFX_PrivateData() {
210 name_extractor.GetNext(pName, nLength); 237 m_pDocument = pDocument;
211 } 238 m_bGenerateAP = bGenerateAP;
212 if (pNode && pNode != &m_Root) { 239 m_pFormNotify = NULL;
213 CFX_PtrArray& ptr_array = pLast->children; 240 m_bUpdated = FALSE;
214 for (int i = 0; i < ptr_array.GetSize(); i ++) { 241 m_pFieldTree = new CFieldTree;
215 if (pNode == (_Node *)ptr_array[i]) { 242 CPDF_Dictionary* pRoot = m_pDocument->GetRoot();
216 ptr_array.RemoveAt(i); 243 m_pFormDict = pRoot->GetDict("AcroForm");
217 break; 244 if (m_pFormDict == NULL) {
218 } 245 return;
219 } 246 }
220 CPDF_FormField *pField = pNode->field_ptr; 247 CPDF_Array* pFields = m_pFormDict->GetArray("Fields");
221 RemoveNode(pNode); 248 if (pFields == NULL) {
222 return pField; 249 return;
223 } 250 }
224 return NULL; 251 int count = pFields->GetCount();
225 } 252 for (int i = 0; i < count; i++) {
226 CFieldTree::_Node *CFieldTree::FindNode(const CFX_WideString& full_name) 253 LoadField(pFields->GetDict(i));
227 { 254 }
228 if (full_name == L"") { 255 }
229 return NULL; 256 CPDF_InterForm::~CPDF_InterForm() {
230 } 257 FX_POSITION pos = m_ControlMap.GetStartPosition();
231 _CFieldNameExtractor name_extractor(full_name); 258 while (pos) {
232 const FX_WCHAR* pName; 259 void* key;
233 FX_STRSIZE nLength; 260 void* value;
234 name_extractor.GetNext(pName, nLength); 261 m_ControlMap.GetNextAssoc(pos, key, value);
235 _Node *pNode = &m_Root, *pLast = NULL; 262 delete (CPDF_FormControl*)value;
236 while (nLength > 0 && pNode) { 263 }
237 pLast = pNode; 264 if (m_pFieldTree != NULL) {
238 CFX_WideString name = CFX_WideString(pName, nLength); 265 int nCount = m_pFieldTree->m_Root.CountFields();
239 pNode = _Lookup(pLast, name); 266 for (int i = 0; i < nCount; i++) {
240 name_extractor.GetNext(pName, nLength); 267 CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
241 } 268 delete pField;
242 return pNode; 269 }
243 } 270 delete m_pFieldTree;
244 CPDF_InterForm::CPDF_InterForm(CPDF_Document* pDocument, FX_BOOL bGenerateAP) : CFX_PrivateData() 271 }
245 { 272 }
246 m_pDocument = pDocument; 273 FX_BOOL CPDF_InterForm::m_bUpdateAP = TRUE;
247 m_bGenerateAP = bGenerateAP; 274 FX_BOOL CPDF_InterForm::UpdatingAPEnabled() {
248 m_pFormNotify = NULL; 275 return m_bUpdateAP;
249 m_bUpdated = FALSE; 276 }
250 m_pFieldTree = new CFieldTree; 277 void CPDF_InterForm::EnableUpdateAP(FX_BOOL bUpdateAP) {
251 CPDF_Dictionary* pRoot = m_pDocument->GetRoot(); 278 m_bUpdateAP = bUpdateAP;
252 m_pFormDict = pRoot->GetDict("AcroForm"); 279 }
253 if (m_pFormDict == NULL) { 280 CFX_ByteString CPDF_InterForm::GenerateNewResourceName(
254 return; 281 const CPDF_Dictionary* pResDict,
255 } 282 const FX_CHAR* csType,
256 CPDF_Array* pFields = m_pFormDict->GetArray("Fields"); 283 int iMinLen,
257 if (pFields == NULL) { 284 const FX_CHAR* csPrefix) {
258 return; 285 CFX_ByteString csStr = csPrefix;
259 } 286 CFX_ByteString csBType = csType;
260 int count = pFields->GetCount(); 287 if (csStr.IsEmpty()) {
261 for (int i = 0; i < count; i ++) { 288 if (csBType == "ExtGState") {
262 LoadField(pFields->GetDict(i)); 289 csStr = "GS";
263 } 290 } else if (csBType == "ColorSpace") {
264 } 291 csStr = "CS";
265 CPDF_InterForm::~CPDF_InterForm() 292 } else if (csBType == "Font") {
266 { 293 csStr = "ZiTi";
267 FX_POSITION pos = m_ControlMap.GetStartPosition();
268 while (pos) {
269 void* key;
270 void* value;
271 m_ControlMap.GetNextAssoc(pos, key, value);
272 delete (CPDF_FormControl*)value;
273 }
274 if (m_pFieldTree != NULL) {
275 int nCount = m_pFieldTree->m_Root.CountFields();
276 for (int i = 0; i < nCount; i++) {
277 CPDF_FormField *pField = m_pFieldTree->m_Root.GetField(i);
278 delete pField;
279 }
280 delete m_pFieldTree;
281 }
282 }
283 FX_BOOL»CPDF_InterForm::m_bUpdateAP = TRUE;
284 FX_BOOL CPDF_InterForm::UpdatingAPEnabled()
285 {
286 return m_bUpdateAP;
287 }
288 void CPDF_InterForm::EnableUpdateAP(FX_BOOL bUpdateAP)
289 {
290 m_bUpdateAP = bUpdateAP;
291 }
292 CFX_ByteString CPDF_InterForm::GenerateNewResourceName(const CPDF_Dictionary* pR esDict, const FX_CHAR* csType, int iMinLen, const FX_CHAR* csPrefix)
293 {
294 CFX_ByteString csStr = csPrefix;
295 CFX_ByteString csBType = csType;
296 if (csStr.IsEmpty()) {
297 if (csBType == "ExtGState") {
298 csStr = "GS";
299 } else if (csBType == "ColorSpace") {
300 csStr = "CS";
301 } else if (csBType == "Font") {
302 csStr = "ZiTi";
303 } else {
304 csStr = "Res";
305 }
306 }
307 CFX_ByteString csTmp = csStr;
308 int iCount = csStr.GetLength();
309 int m = 0;
310 if (iMinLen > 0) {
311 csTmp = "";
312 while (m < iMinLen && m < iCount) {
313 csTmp += csStr[m ++];
314 }
315 while (m < iMinLen) {
316 csTmp += '0' + m % 10;
317 m ++;
318 }
319 } else { 294 } else {
320 m = iCount; 295 csStr = "Res";
321 } 296 }
322 if (pResDict == NULL) { 297 }
323 return csTmp; 298 CFX_ByteString csTmp = csStr;
324 } 299 int iCount = csStr.GetLength();
325 CPDF_Dictionary* pDict = pResDict->GetDict(csType); 300 int m = 0;
326 if (pDict == NULL) { 301 if (iMinLen > 0) {
327 return csTmp; 302 csTmp = "";
328 } 303 while (m < iMinLen && m < iCount) {
329 int num = 0; 304 csTmp += csStr[m++];
330 CFX_ByteString bsNum; 305 }
331 while (TRUE) { 306 while (m < iMinLen) {
332 if (!pDict->KeyExist(csTmp + bsNum)) { 307 csTmp += '0' + m % 10;
333 return csTmp + bsNum; 308 m++;
334 } 309 }
335 if (m < iCount) { 310 } else {
336 csTmp += csStr[m ++]; 311 m = iCount;
337 } else { 312 }
338 bsNum.Format("%d", num++); 313 if (pResDict == NULL) {
339 }
340 m ++;
341 }
342 return csTmp; 314 return csTmp;
315 }
316 CPDF_Dictionary* pDict = pResDict->GetDict(csType);
317 if (pDict == NULL) {
318 return csTmp;
319 }
320 int num = 0;
321 CFX_ByteString bsNum;
322 while (TRUE) {
323 if (!pDict->KeyExist(csTmp + bsNum)) {
324 return csTmp + bsNum;
325 }
326 if (m < iCount) {
327 csTmp += csStr[m++];
328 } else {
329 bsNum.Format("%d", num++);
330 }
331 m++;
332 }
333 return csTmp;
343 } 334 }
344 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 335 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
345 typedef struct _PDF_FONTDATA { 336 typedef struct _PDF_FONTDATA {
346 FX_BOOL» » bFind; 337 FX_BOOL bFind;
347 LOGFONTA» lf; 338 LOGFONTA lf;
348 } PDF_FONTDATA, FAR* LPDF_FONTDATA; 339 } PDF_FONTDATA, FAR* LPDF_FONTDATA;
349 static int CALLBACK EnumFontFamExProc( ENUMLOGFONTEXA *lpelfe, 340 static int CALLBACK EnumFontFamExProc(ENUMLOGFONTEXA* lpelfe,
350 NEWTEXTMETRICEX *lpntme, 341 NEWTEXTMETRICEX* lpntme,
351 DWORD FontType, 342 DWORD FontType,
352 LPARAM lParam 343 LPARAM lParam) {
353 ) 344 if (FontType != 0x004 || strchr(lpelfe->elfLogFont.lfFaceName, '@') != NULL) {
354 { 345 return 1;
355 if (FontType != 0x004 || strchr(lpelfe->elfLogFont.lfFaceName, '@') != NULL) { 346 }
356 return 1; 347 LPDF_FONTDATA pData = (LPDF_FONTDATA)lParam;
357 } 348 memcpy(&pData->lf, &lpelfe->elfLogFont, sizeof(LOGFONTA));
358 LPDF_FONTDATA pData = (LPDF_FONTDATA)lParam; 349 pData->bFind = TRUE;
359 memcpy(&pData->lf, &lpelfe->elfLogFont, sizeof(LOGFONTA)); 350 return 0;
360 pData->bFind = TRUE; 351 }
352 static FX_BOOL RetrieveSpecificFont(LOGFONTA& lf) {
353 PDF_FONTDATA fd;
354 memset(&fd, 0, sizeof(PDF_FONTDATA));
355 HDC hDC = ::GetDC(NULL);
356 EnumFontFamiliesExA(hDC, &lf, (FONTENUMPROCA)EnumFontFamExProc, (LPARAM)&fd,
357 0);
358 ::ReleaseDC(NULL, hDC);
359 if (fd.bFind) {
360 memcpy(&lf, &fd.lf, sizeof(LOGFONTA));
361 }
362 return fd.bFind;
363 }
364 static FX_BOOL RetrieveSpecificFont(uint8_t charSet,
365 uint8_t pitchAndFamily,
366 LPCSTR pcsFontName,
367 LOGFONTA& lf) {
368 memset(&lf, 0, sizeof(LOGFONTA));
369 lf.lfCharSet = charSet;
370 lf.lfPitchAndFamily = pitchAndFamily;
371 if (pcsFontName != NULL) {
372 strcpy(lf.lfFaceName, pcsFontName);
373 }
374 return RetrieveSpecificFont(lf);
375 }
376 static FX_BOOL RetrieveStockFont(int iFontObject,
377 uint8_t charSet,
378 LOGFONTA& lf) {
379 HFONT hFont = (HFONT)::GetStockObject(iFontObject);
380 if (hFont != NULL) {
381 memset(&lf, 0, sizeof(LOGFONTA));
382 int iRet = ::GetObject(hFont, sizeof(LOGFONTA), &lf);
383 if (iRet > 0 && (lf.lfCharSet == charSet || charSet == 255)) {
384 return RetrieveSpecificFont(lf);
385 }
386 }
387 return FALSE;
388 }
389 #endif
390 CPDF_Font* CPDF_InterForm::AddSystemDefaultFont(
391 const CPDF_Document* pDocument) {
392 if (pDocument == NULL) {
393 return NULL;
394 }
395 CPDF_Font* pFont = NULL;
396 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
397 LOGFONTA lf;
398 FX_BOOL bRet;
399 bRet = RetrieveStockFont(DEFAULT_GUI_FONT, 255, lf);
400 if (!bRet) {
401 bRet = RetrieveStockFont(SYSTEM_FONT, 255, lf);
402 }
403 if (bRet) {
404 pFont = ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE);
405 }
406 #endif
407 return pFont;
408 }
409 CPDF_Font* CPDF_InterForm::AddSystemFont(const CPDF_Document* pDocument,
410 CFX_ByteString csFontName,
411 uint8_t iCharSet) {
412 if (pDocument == NULL || csFontName.IsEmpty()) {
413 return NULL;
414 }
415 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
416 if (iCharSet == 1) {
417 iCharSet = GetNativeCharSet();
418 }
419 HFONT hFont = ::CreateFontA(
420 0, 0, 0, 0, 0, 0, 0, 0, iCharSet, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
421 DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, csFontName.c_str());
422 if (hFont != NULL) {
423 LOGFONTA lf;
424 memset(&lf, 0, sizeof(LOGFONTA));
425 ::GetObjectA(hFont, sizeof(LOGFONTA), &lf);
426 ::DeleteObject(hFont);
427 if (strlen(lf.lfFaceName) > 0) {
428 return ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE);
429 }
430 }
431 #endif
432 return NULL;
433 }
434 CPDF_Font* CPDF_InterForm::AddSystemFont(const CPDF_Document* pDocument,
435 CFX_WideString csFontName,
436 uint8_t iCharSet) {
437 if (pDocument == NULL || csFontName.IsEmpty()) {
438 return NULL;
439 }
440 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
441 if (iCharSet == 1) {
442 iCharSet = GetNativeCharSet();
443 }
444 HFONT hFont = ::CreateFontW(
445 0, 0, 0, 0, 0, 0, 0, 0, iCharSet, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
446 DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, csFontName.c_str());
447 if (hFont != NULL) {
448 LOGFONTA lf;
449 memset(&lf, 0, sizeof(LOGFONTA));
450 ::GetObject(hFont, sizeof(LOGFONTA), &lf);
451 ::DeleteObject(hFont);
452 if (strlen(lf.lfFaceName) > 0) {
453 return ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE);
454 }
455 }
456 #endif
457 return NULL;
458 }
459 CPDF_Font* CPDF_InterForm::AddStandardFont(const CPDF_Document* pDocument,
460 CFX_ByteString csFontName) {
461 if (pDocument == NULL || csFontName.IsEmpty()) {
462 return NULL;
463 }
464 CPDF_Font* pFont = NULL;
465 if (csFontName == "ZapfDingbats") {
466 pFont = ((CPDF_Document*)pDocument)->AddStandardFont(csFontName, NULL);
467 } else {
468 CPDF_FontEncoding encoding(PDFFONT_ENCODING_WINANSI);
469 pFont = ((CPDF_Document*)pDocument)->AddStandardFont(csFontName, &encoding);
470 }
471 return pFont;
472 }
473 CFX_ByteString CPDF_InterForm::GetNativeFont(uint8_t charSet, void* pLogFont) {
474 CFX_ByteString csFontName;
475 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
476 LOGFONTA lf;
477 FX_BOOL bRet;
478 if (charSet == ANSI_CHARSET) {
479 csFontName = "Helvetica";
480 return csFontName;
481 }
482 bRet = FALSE;
483 if (charSet == SHIFTJIS_CHARSET) {
484 bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE,
485 "MS Mincho", lf);
486 } else if (charSet == GB2312_CHARSET) {
487 bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "SimSun",
488 lf);
489 } else if (charSet == CHINESEBIG5_CHARSET) {
490 bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "MingLiU",
491 lf);
492 }
493 if (!bRet) {
494 bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE,
495 "Arial Unicode MS", lf);
496 }
497 if (!bRet) {
498 bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE,
499 "Microsoft Sans Serif", lf);
500 }
501 if (!bRet) {
502 bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, NULL, lf);
503 }
504 if (bRet) {
505 if (pLogFont != NULL) {
506 memcpy(pLogFont, &lf, sizeof(LOGFONTA));
507 }
508 csFontName = lf.lfFaceName;
509 return csFontName;
510 }
511 #endif
512 return csFontName;
513 }
514 CFX_ByteString CPDF_InterForm::GetNativeFont(void* pLogFont) {
515 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
516 uint8_t charSet = GetNativeCharSet();
517 return GetNativeFont(charSet, pLogFont);
518 #else
519 return CFX_ByteString();
520 #endif
521 }
522 uint8_t CPDF_InterForm::GetNativeCharSet() {
523 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
524 uint8_t charSet = ANSI_CHARSET;
525 UINT iCodePage = ::GetACP();
526 switch (iCodePage) {
527 case 932:
528 charSet = SHIFTJIS_CHARSET;
529 break;
530 case 936:
531 charSet = GB2312_CHARSET;
532 break;
533 case 950:
534 charSet = CHINESEBIG5_CHARSET;
535 break;
536 case 1252:
537 charSet = ANSI_CHARSET;
538 break;
539 case 874:
540 charSet = THAI_CHARSET;
541 break;
542 case 949:
543 charSet = HANGUL_CHARSET;
544 break;
545 case 1200:
546 charSet = ANSI_CHARSET;
547 break;
548 case 1250:
549 charSet = EASTEUROPE_CHARSET;
550 break;
551 case 1251:
552 charSet = RUSSIAN_CHARSET;
553 break;
554 case 1253:
555 charSet = GREEK_CHARSET;
556 break;
557 case 1254:
558 charSet = TURKISH_CHARSET;
559 break;
560 case 1255:
561 charSet = HEBREW_CHARSET;
562 break;
563 case 1256:
564 charSet = ARABIC_CHARSET;
565 break;
566 case 1257:
567 charSet = BALTIC_CHARSET;
568 break;
569 case 1258:
570 charSet = VIETNAMESE_CHARSET;
571 break;
572 case 1361:
573 charSet = JOHAB_CHARSET;
574 break;
575 }
576 return charSet;
577 #else
578 return 0;
579 #endif
580 }
581 CPDF_Font* CPDF_InterForm::AddNativeFont(uint8_t charSet,
582 const CPDF_Document* pDocument) {
583 if (pDocument == NULL) {
584 return NULL;
585 }
586 CPDF_Font* pFont = NULL;
587 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
588 LOGFONTA lf;
589 CFX_ByteString csFontName = GetNativeFont(charSet, &lf);
590 if (!csFontName.IsEmpty()) {
591 if (csFontName == "Helvetica") {
592 pFont = AddStandardFont(pDocument, csFontName);
593 } else {
594 pFont = ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE);
595 }
596 }
597 #endif
598 return pFont;
599 }
600 CPDF_Font* CPDF_InterForm::AddNativeFont(const CPDF_Document* pDocument) {
601 if (pDocument == NULL) {
602 return NULL;
603 }
604 CPDF_Font* pFont = NULL;
605 uint8_t charSet = GetNativeCharSet();
606 pFont = AddNativeFont(charSet, pDocument);
607 return pFont;
608 }
609 FX_BOOL CPDF_InterForm::ValidateFieldName(
610 CFX_WideString& csNewFieldName,
611 int iType,
612 const CPDF_FormField* pExcludedField,
613 const CPDF_FormControl* pExcludedControl) {
614 if (csNewFieldName.IsEmpty()) {
615 return FALSE;
616 }
617 int iPos = 0;
618 int iLength = csNewFieldName.GetLength();
619 CFX_WideString csSub;
620 while (TRUE) {
621 while (iPos < iLength &&
622 (csNewFieldName[iPos] == L'.' || csNewFieldName[iPos] == L' ')) {
623 iPos++;
624 }
625 if (iPos < iLength && !csSub.IsEmpty()) {
626 csSub += L'.';
627 }
628 while (iPos < iLength && csNewFieldName[iPos] != L'.') {
629 csSub += csNewFieldName[iPos++];
630 }
631 for (int i = csSub.GetLength() - 1; i > -1; i--) {
632 if (csSub[i] == L' ' || csSub[i] == L'.') {
633 csSub.SetAt(i, L'\0');
634 } else {
635 break;
636 }
637 }
638 FX_DWORD dwCount = m_pFieldTree->m_Root.CountFields();
639 for (FX_DWORD m = 0; m < dwCount; m++) {
640 CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(m);
641 if (pField == NULL) {
642 continue;
643 }
644 if (pField == pExcludedField) {
645 if (pExcludedControl != NULL) {
646 if (pField->CountControls() < 2) {
647 continue;
648 }
649 } else {
650 continue;
651 }
652 }
653 CFX_WideString csFullName = pField->GetFullName();
654 int iRet = CompareFieldName(csSub, csFullName);
655 if (iRet == 1) {
656 if (pField->GetFieldType() != iType) {
657 return FALSE;
658 }
659 } else if (iRet == 2 && csSub == csNewFieldName) {
660 if (csFullName[iPos] == L'.') {
661 return FALSE;
662 }
663 } else if (iRet == 3 && csSub == csNewFieldName) {
664 if (csNewFieldName[csFullName.GetLength()] == L'.') {
665 return FALSE;
666 }
667 }
668 }
669 if (iPos >= iLength) {
670 break;
671 }
672 }
673 if (csSub.IsEmpty()) {
674 return FALSE;
675 }
676 csNewFieldName = csSub;
677 return TRUE;
678 }
679 FX_BOOL CPDF_InterForm::ValidateFieldName(CFX_WideString& csNewFieldName,
680 int iType) {
681 return ValidateFieldName(csNewFieldName, iType, NULL, NULL);
682 }
683 FX_BOOL CPDF_InterForm::ValidateFieldName(const CPDF_FormField* pField,
684 CFX_WideString& csNewFieldName) {
685 if (pField == NULL || csNewFieldName.IsEmpty()) {
686 return FALSE;
687 }
688 return ValidateFieldName(
689 csNewFieldName, ((CPDF_FormField*)pField)->GetFieldType(), pField, NULL);
690 }
691 FX_BOOL CPDF_InterForm::ValidateFieldName(const CPDF_FormControl* pControl,
692 CFX_WideString& csNewFieldName) {
693 if (pControl == NULL || csNewFieldName.IsEmpty()) {
694 return FALSE;
695 }
696 CPDF_FormField* pField = ((CPDF_FormControl*)pControl)->GetField();
697 return ValidateFieldName(csNewFieldName, pField->GetFieldType(), pField,
698 pControl);
699 }
700 int CPDF_InterForm::CompareFieldName(const CFX_ByteString& name1,
701 const CFX_ByteString& name2) {
702 const FX_CHAR* ptr1 = name1;
703 const FX_CHAR* ptr2 = name2;
704 if (name1.GetLength() == name2.GetLength()) {
705 return name1 == name2 ? 1 : 0;
706 }
707 int i = 0;
708 while (ptr1[i] == ptr2[i]) {
709 i++;
710 }
711 if (i == name1.GetLength()) {
712 return 2;
713 }
714 if (i == name2.GetLength()) {
715 return 3;
716 }
717 return 0;
718 }
719 int CPDF_InterForm::CompareFieldName(const CFX_WideString& name1,
720 const CFX_WideString& name2) {
721 const FX_WCHAR* ptr1 = name1.c_str();
722 const FX_WCHAR* ptr2 = name2.c_str();
723 if (name1.GetLength() == name2.GetLength()) {
724 return name1 == name2 ? 1 : 0;
725 }
726 int i = 0;
727 while (ptr1[i] == ptr2[i]) {
728 i++;
729 }
730 if (i == name1.GetLength()) {
731 return 2;
732 }
733 if (i == name2.GetLength()) {
734 return 3;
735 }
736 return 0;
737 }
738 FX_DWORD CPDF_InterForm::CountFields(const CFX_WideString& csFieldName) {
739 if (csFieldName.IsEmpty()) {
740 return (FX_DWORD)m_pFieldTree->m_Root.CountFields();
741 }
742 CFieldTree::_Node* pNode = m_pFieldTree->FindNode(csFieldName);
743 if (pNode == NULL) {
361 return 0; 744 return 0;
362 } 745 }
363 static FX_BOOL RetrieveSpecificFont(LOGFONTA& lf) 746 return pNode->CountFields();
364 { 747 }
365 PDF_FONTDATA fd; 748 CPDF_FormField* CPDF_InterForm::GetField(FX_DWORD index,
366 memset(&fd, 0, sizeof(PDF_FONTDATA)); 749 const CFX_WideString& csFieldName) {
367 HDC hDC = ::GetDC(NULL); 750 if (csFieldName == L"") {
368 EnumFontFamiliesExA(hDC, &lf, (FONTENUMPROCA)EnumFontFamExProc, (LPARAM)&fd, 0); 751 return m_pFieldTree->m_Root.GetField(index);
369 ::ReleaseDC(NULL, hDC); 752 }
370 if (fd.bFind) { 753 CFieldTree::_Node* pNode = m_pFieldTree->FindNode(csFieldName);
371 memcpy(&lf, &fd.lf, sizeof(LOGFONTA)); 754 if (pNode == NULL) {
372 } 755 return NULL;
373 return fd.bFind; 756 }
374 } 757 return pNode->GetField(index);
375 static FX_BOOL RetrieveSpecificFont(uint8_t charSet, uint8_t pitchAndFamily, LPC STR pcsFontName, LOGFONTA& lf) 758 }
376 { 759 void CPDF_InterForm::GetAllFieldNames(CFX_WideStringArray& allFieldNames) {
377 memset(&lf, 0, sizeof(LOGFONTA)); 760 allFieldNames.RemoveAll();
378 lf.lfCharSet = charSet; 761 int nCount = m_pFieldTree->m_Root.CountFields();
379 lf.lfPitchAndFamily = pitchAndFamily; 762 for (int i = 0; i < nCount; i++) {
380 if (pcsFontName != NULL) { 763 CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
381 strcpy(lf.lfFaceName, pcsFontName); 764 if (pField) {
382 } 765 CFX_WideString full_name = GetFullName(pField->GetFieldDict());
383 return RetrieveSpecificFont(lf); 766 allFieldNames.Add(full_name);
384 } 767 }
385 static FX_BOOL RetrieveStockFont(int iFontObject, uint8_t charSet, LOGFONTA& lf) 768 }
386 { 769 }
387 HFONT hFont = (HFONT)::GetStockObject(iFontObject); 770 FX_BOOL CPDF_InterForm::IsValidFormField(const void* pField) {
388 if (hFont != NULL) { 771 if (pField == NULL) {
389 memset(&lf, 0, sizeof(LOGFONTA)); 772 return FALSE;
390 int iRet = ::GetObject(hFont, sizeof(LOGFONTA), &lf); 773 }
391 if (iRet > 0 && (lf.lfCharSet == charSet || charSet == 255)) { 774 int nCount = m_pFieldTree->m_Root.CountFields();
392 return RetrieveSpecificFont(lf); 775 for (int i = 0; i < nCount; i++) {
776 CPDF_FormField* pFormField = m_pFieldTree->m_Root.GetField(i);
777 if (pField == pFormField) {
778 return TRUE;
779 }
780 }
781 return FALSE;
782 }
783 CPDF_FormField* CPDF_InterForm::GetFieldByDict(
784 CPDF_Dictionary* pFieldDict) const {
785 if (pFieldDict == NULL) {
786 return NULL;
787 }
788 CFX_WideString csWName = GetFullName(pFieldDict);
789 return m_pFieldTree->GetField(csWName);
790 }
791 FX_DWORD CPDF_InterForm::CountControls(CFX_WideString csFieldName) {
792 if (csFieldName.IsEmpty()) {
793 return (FX_DWORD)m_ControlMap.GetCount();
794 }
795 CPDF_FormField* pField = m_pFieldTree->GetField(csFieldName);
796 if (pField == NULL) {
797 return 0;
798 }
799 return pField->m_ControlList.GetSize();
800 }
801 CPDF_FormControl* CPDF_InterForm::GetControl(FX_DWORD index,
802 CFX_WideString csFieldName) {
803 CPDF_FormField* pField = m_pFieldTree->GetField(csFieldName);
804 if (pField == NULL) {
805 return NULL;
806 }
807 if (index < (FX_DWORD)pField->m_ControlList.GetSize()) {
808 return (CPDF_FormControl*)pField->m_ControlList.GetAt(index);
809 }
810 return NULL;
811 }
812 FX_BOOL CPDF_InterForm::IsValidFormControl(const void* pControl) {
813 if (pControl == NULL) {
814 return FALSE;
815 }
816 FX_POSITION pos = m_ControlMap.GetStartPosition();
817 while (pos) {
818 CPDF_Dictionary* pWidgetDict = NULL;
819 void* pFormControl = NULL;
820 m_ControlMap.GetNextAssoc(pos, (void*&)pWidgetDict, pFormControl);
821 if (pControl == pFormControl) {
822 return TRUE;
823 }
824 }
825 return FALSE;
826 }
827 int CPDF_InterForm::CountPageControls(CPDF_Page* pPage) const {
828 CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArray("Annots");
829 if (pAnnotList == NULL) {
830 return 0;
831 }
832 int count = 0;
833 for (FX_DWORD i = 0; i < pAnnotList->GetCount(); i++) {
834 CPDF_Dictionary* pAnnot = pAnnotList->GetDict(i);
835 if (pAnnot == NULL) {
836 continue;
837 }
838 CPDF_FormControl* pControl;
839 if (!m_ControlMap.Lookup(pAnnot, (void*&)pControl)) {
840 continue;
841 }
842 count++;
843 }
844 return count;
845 }
846 CPDF_FormControl* CPDF_InterForm::GetPageControl(CPDF_Page* pPage,
847 int index) const {
848 CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArray("Annots");
849 if (pAnnotList == NULL) {
850 return NULL;
851 }
852 int count = 0;
853 for (FX_DWORD i = 0; i < pAnnotList->GetCount(); i++) {
854 CPDF_Dictionary* pAnnot = pAnnotList->GetDict(i);
855 if (pAnnot == NULL) {
856 continue;
857 }
858 CPDF_FormControl* pControl;
859 if (!m_ControlMap.Lookup(pAnnot, (void*&)pControl)) {
860 continue;
861 }
862 if (index == count) {
863 return pControl;
864 }
865 count++;
866 }
867 return NULL;
868 }
869 CPDF_FormControl* CPDF_InterForm::GetControlAtPoint(CPDF_Page* pPage,
870 FX_FLOAT pdf_x,
871 FX_FLOAT pdf_y) const {
872 CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArray("Annots");
873 if (pAnnotList == NULL) {
874 return NULL;
875 }
876 for (FX_DWORD i = pAnnotList->GetCount(); i > 0; i--) {
877 CPDF_Dictionary* pAnnot = pAnnotList->GetDict(i - 1);
878 if (pAnnot == NULL) {
879 continue;
880 }
881 CPDF_FormControl* pControl;
882 if (!m_ControlMap.Lookup(pAnnot, (void*&)pControl)) {
883 continue;
884 }
885 CFX_FloatRect rect = pControl->GetRect();
886 if (rect.Contains(pdf_x, pdf_y)) {
887 return pControl;
888 }
889 }
890 return NULL;
891 }
892 CPDF_FormControl* CPDF_InterForm::GetControlByDict(
893 CPDF_Dictionary* pWidgetDict) const {
894 CPDF_FormControl* pControl = NULL;
895 m_ControlMap.Lookup(pWidgetDict, (void*&)pControl);
896 return pControl;
897 }
898 FX_DWORD CPDF_InterForm::CountInternalFields(
899 const CFX_WideString& csFieldName) const {
900 if (!m_pFormDict) {
901 return 0;
902 }
903 CPDF_Array* pArray = m_pFormDict->GetArray("Fields");
904 if (!pArray) {
905 return 0;
906 }
907 if (csFieldName.IsEmpty()) {
908 return pArray->GetCount();
909 }
910 int iLength = csFieldName.GetLength();
911 int iPos = 0;
912 CPDF_Dictionary* pDict = NULL;
913 while (pArray != NULL) {
914 CFX_WideString csSub;
915 if (iPos < iLength && csFieldName[iPos] == L'.') {
916 iPos++;
917 }
918 while (iPos < iLength && csFieldName[iPos] != L'.') {
919 csSub += csFieldName[iPos++];
920 }
921 int iCount = pArray->GetCount();
922 FX_BOOL bFind = FALSE;
923 for (int i = 0; i < iCount; i++) {
924 pDict = pArray->GetDict(i);
925 if (pDict == NULL) {
926 continue;
927 }
928 CFX_WideString csT = pDict->GetUnicodeText("T");
929 if (csT == csSub) {
930 bFind = TRUE;
931 break;
932 }
933 }
934 if (!bFind) {
935 return 0;
936 }
937 if (iPos >= iLength) {
938 break;
939 }
940 pArray = pDict->GetArray("Kids");
941 }
942 if (!pDict) {
943 return 0;
944 }
945 pArray = pDict->GetArray("Kids");
946 return pArray ? pArray->GetCount() : 1;
947 }
948
949 CPDF_Dictionary* CPDF_InterForm::GetInternalField(
950 FX_DWORD index,
951 const CFX_WideString& csFieldName) const {
952 if (!m_pFormDict) {
953 return nullptr;
954 }
955 CPDF_Array* pArray = m_pFormDict->GetArray("Fields");
956 if (!pArray) {
957 return nullptr;
958 }
959 if (csFieldName.IsEmpty()) {
960 return pArray->GetDict(index);
961 }
962 int iLength = csFieldName.GetLength();
963 int iPos = 0;
964 CPDF_Dictionary* pDict = NULL;
965 while (pArray != NULL) {
966 CFX_WideString csSub;
967 if (iPos < iLength && csFieldName[iPos] == L'.') {
968 iPos++;
969 }
970 while (iPos < iLength && csFieldName[iPos] != L'.') {
971 csSub += csFieldName[iPos++];
972 }
973 int iCount = pArray->GetCount();
974 FX_BOOL bFind = FALSE;
975 for (int i = 0; i < iCount; i++) {
976 pDict = pArray->GetDict(i);
977 if (pDict == NULL) {
978 continue;
979 }
980 CFX_WideString csT = pDict->GetUnicodeText("T");
981 if (csT == csSub) {
982 bFind = TRUE;
983 break;
984 }
985 }
986 if (!bFind) {
987 return NULL;
988 }
989 if (iPos >= iLength) {
990 break;
991 }
992 pArray = pDict->GetArray("Kids");
993 }
994 if (!pDict) {
995 return nullptr;
996 }
997 pArray = pDict->GetArray("Kids");
998 return pArray ? pArray->GetDict(index) : pDict;
999 }
1000 FX_BOOL CPDF_InterForm::NeedConstructAP() {
1001 if (m_pFormDict == NULL) {
1002 return FALSE;
1003 }
1004 return m_pFormDict->GetBoolean("NeedAppearances");
1005 }
1006 void CPDF_InterForm::NeedConstructAP(FX_BOOL bNeedAP) {
1007 if (m_pFormDict == NULL) {
1008 InitInterFormDict(m_pFormDict, m_pDocument);
1009 }
1010 m_pFormDict->SetAtBoolean("NeedAppearances", bNeedAP);
1011 m_bGenerateAP = bNeedAP;
1012 }
1013 int CPDF_InterForm::CountFieldsInCalculationOrder() {
1014 if (m_pFormDict == NULL) {
1015 return 0;
1016 }
1017 CPDF_Array* pArray = m_pFormDict->GetArray("CO");
1018 if (pArray == NULL) {
1019 return 0;
1020 }
1021 return pArray->GetCount();
1022 }
1023 CPDF_FormField* CPDF_InterForm::GetFieldInCalculationOrder(int index) {
1024 if (m_pFormDict == NULL || index < 0) {
1025 return NULL;
1026 }
1027 CPDF_Array* pArray = m_pFormDict->GetArray("CO");
1028 if (pArray == NULL) {
1029 return NULL;
1030 }
1031 CPDF_Object* pElement = pArray->GetElementValue(index);
1032 if (pElement != NULL && pElement->GetType() == PDFOBJ_DICTIONARY) {
1033 return GetFieldByDict((CPDF_Dictionary*)pElement);
1034 }
1035 return NULL;
1036 }
1037 int CPDF_InterForm::FindFieldInCalculationOrder(const CPDF_FormField* pField) {
1038 if (m_pFormDict == NULL || pField == NULL) {
1039 return -1;
1040 }
1041 CPDF_Array* pArray = m_pFormDict->GetArray("CO");
1042 if (pArray == NULL) {
1043 return -1;
1044 }
1045 for (FX_DWORD i = 0; i < pArray->GetCount(); i++) {
1046 CPDF_Object* pElement = pArray->GetElementValue(i);
1047 if (pElement == pField->m_pDict) {
1048 return i;
1049 }
1050 }
1051 return -1;
1052 }
1053 FX_DWORD CPDF_InterForm::CountFormFonts() {
1054 return CountInterFormFonts(m_pFormDict);
1055 }
1056 CPDF_Font* CPDF_InterForm::GetFormFont(FX_DWORD index,
1057 CFX_ByteString& csNameTag) {
1058 return GetInterFormFont(m_pFormDict, m_pDocument, index, csNameTag);
1059 }
1060 CPDF_Font* CPDF_InterForm::GetFormFont(CFX_ByteString csNameTag) {
1061 return GetInterFormFont(m_pFormDict, m_pDocument, csNameTag);
1062 }
1063 CPDF_Font* CPDF_InterForm::GetFormFont(CFX_ByteString csFontName,
1064 CFX_ByteString& csNameTag) {
1065 return GetInterFormFont(m_pFormDict, m_pDocument, csFontName, csNameTag);
1066 }
1067 CPDF_Font* CPDF_InterForm::GetNativeFormFont(uint8_t charSet,
1068 CFX_ByteString& csNameTag) {
1069 return GetNativeInterFormFont(m_pFormDict, m_pDocument, charSet, csNameTag);
1070 }
1071 CPDF_Font* CPDF_InterForm::GetNativeFormFont(CFX_ByteString& csNameTag) {
1072 return GetNativeInterFormFont(m_pFormDict, m_pDocument, csNameTag);
1073 }
1074 FX_BOOL CPDF_InterForm::FindFormFont(const CPDF_Font* pFont,
1075 CFX_ByteString& csNameTag) {
1076 return FindInterFormFont(m_pFormDict, pFont, csNameTag);
1077 }
1078 FX_BOOL CPDF_InterForm::FindFormFont(CFX_ByteString csFontName,
1079 CPDF_Font*& pFont,
1080 CFX_ByteString& csNameTag) {
1081 return FindInterFormFont(m_pFormDict, m_pDocument, csFontName, pFont,
1082 csNameTag);
1083 }
1084 void CPDF_InterForm::AddFormFont(const CPDF_Font* pFont,
1085 CFX_ByteString& csNameTag) {
1086 AddInterFormFont(m_pFormDict, m_pDocument, pFont, csNameTag);
1087 m_bUpdated = TRUE;
1088 }
1089 CPDF_Font* CPDF_InterForm::AddNativeFormFont(uint8_t charSet,
1090 CFX_ByteString& csNameTag) {
1091 m_bUpdated = TRUE;
1092 return AddNativeInterFormFont(m_pFormDict, m_pDocument, charSet, csNameTag);
1093 }
1094 CPDF_Font* CPDF_InterForm::AddNativeFormFont(CFX_ByteString& csNameTag) {
1095 m_bUpdated = TRUE;
1096 return AddNativeInterFormFont(m_pFormDict, m_pDocument, csNameTag);
1097 }
1098 void CPDF_InterForm::RemoveFormFont(const CPDF_Font* pFont) {
1099 m_bUpdated = TRUE;
1100 RemoveInterFormFont(m_pFormDict, pFont);
1101 }
1102 void CPDF_InterForm::RemoveFormFont(CFX_ByteString csNameTag) {
1103 m_bUpdated = TRUE;
1104 RemoveInterFormFont(m_pFormDict, csNameTag);
1105 }
1106 CPDF_DefaultAppearance CPDF_InterForm::GetDefaultAppearance() {
1107 CFX_ByteString csDA;
1108 if (m_pFormDict == NULL) {
1109 return csDA;
1110 }
1111 csDA = m_pFormDict->GetString("DA");
1112 return csDA;
1113 }
1114 CPDF_Font* CPDF_InterForm::GetDefaultFormFont() {
1115 return GetDefaultInterFormFont(m_pFormDict, m_pDocument);
1116 }
1117 int CPDF_InterForm::GetFormAlignment() {
1118 if (m_pFormDict == NULL) {
1119 return 0;
1120 }
1121 return m_pFormDict->GetInteger("Q", 0);
1122 }
1123 FX_BOOL CPDF_InterForm::ResetForm(const CFX_PtrArray& fields,
1124 FX_BOOL bIncludeOrExclude,
1125 FX_BOOL bNotify) {
1126 if (bNotify && m_pFormNotify != NULL) {
1127 int iRet = m_pFormNotify->BeforeFormReset(this);
1128 if (iRet < 0) {
1129 return FALSE;
1130 }
1131 }
1132 int nCount = m_pFieldTree->m_Root.CountFields();
1133 for (int i = 0; i < nCount; i++) {
1134 CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
1135 if (pField == NULL) {
1136 continue;
1137 }
1138 FX_BOOL bFind = FALSE;
1139 int iCount = fields.GetSize();
1140 for (int i = 0; i < iCount; i++) {
1141 if (pField == (CPDF_FormField*)fields[i]) {
1142 bFind = TRUE;
1143 break;
1144 }
1145 }
1146 if ((bIncludeOrExclude && bFind) || (!bIncludeOrExclude && !bFind)) {
1147 pField->ResetField(bNotify);
1148 }
1149 }
1150 if (bNotify && m_pFormNotify != NULL) {
1151 m_pFormNotify->AfterFormReset(this);
1152 }
1153 return TRUE;
1154 }
1155 FX_BOOL CPDF_InterForm::ResetForm(FX_BOOL bNotify) {
1156 if (bNotify && m_pFormNotify != NULL) {
1157 int iRet = m_pFormNotify->BeforeFormReset(this);
1158 if (iRet < 0) {
1159 return FALSE;
1160 }
1161 }
1162 int nCount = m_pFieldTree->m_Root.CountFields();
1163 for (int i = 0; i < nCount; i++) {
1164 CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
1165 if (pField == NULL) {
1166 continue;
1167 }
1168 pField->ResetField(bNotify);
1169 }
1170 if (bNotify && m_pFormNotify != NULL) {
1171 m_pFormNotify->AfterFormReset(this);
1172 }
1173 return TRUE;
1174 }
1175 void CPDF_InterForm::ReloadForm() {
1176 FX_POSITION pos = m_ControlMap.GetStartPosition();
1177 while (pos) {
1178 CPDF_Dictionary* pWidgetDict;
1179 CPDF_FormControl* pControl;
1180 m_ControlMap.GetNextAssoc(pos, (void*&)pWidgetDict, (void*&)pControl);
1181 delete pControl;
1182 }
1183 m_ControlMap.RemoveAll();
1184 int nCount = m_pFieldTree->m_Root.CountFields();
1185 for (int k = 0; k < nCount; k++) {
1186 CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(k);
1187 delete pField;
1188 }
1189 m_pFieldTree->RemoveAll();
1190 if (m_pFormDict == NULL) {
1191 return;
1192 }
1193 CPDF_Array* pFields = m_pFormDict->GetArray("Fields");
1194 if (pFields == NULL) {
1195 return;
1196 }
1197 int iCount = pFields->GetCount();
1198 for (int i = 0; i < iCount; i++) {
1199 LoadField(pFields->GetDict(i));
1200 }
1201 }
1202 void CPDF_InterForm::LoadField(CPDF_Dictionary* pFieldDict, int nLevel) {
1203 if (nLevel > nMaxRecursion) {
1204 return;
1205 }
1206 if (pFieldDict == NULL) {
1207 return;
1208 }
1209 FX_DWORD dwParentObjNum = pFieldDict->GetObjNum();
1210 CPDF_Array* pKids = pFieldDict->GetArray("Kids");
1211 if (!pKids) {
1212 AddTerminalField(pFieldDict);
1213 return;
1214 }
1215 CPDF_Dictionary* pFirstKid = pKids->GetDict(0);
1216 if (pFirstKid == NULL) {
1217 return;
1218 }
1219 if (pFirstKid->KeyExist("T") || pFirstKid->KeyExist("Kids")) {
1220 for (FX_DWORD i = 0; i < pKids->GetCount(); i++) {
1221 CPDF_Dictionary* pChildDict = pKids->GetDict(i);
1222 if (pChildDict) {
1223 if (pChildDict->GetObjNum() != dwParentObjNum) {
1224 LoadField(pChildDict, nLevel + 1);
393 } 1225 }
394 } 1226 }
1227 }
1228 } else {
1229 AddTerminalField(pFieldDict);
1230 }
1231 }
1232 FX_BOOL CPDF_InterForm::HasXFAForm() const {
1233 return m_pFormDict && m_pFormDict->GetArray(FX_BSTRC("XFA")) != NULL;
1234 }
1235 void CPDF_InterForm::FixPageFields(const CPDF_Page* pPage) {
1236 ASSERT(pPage != NULL);
1237 CPDF_Dictionary* pPageDict = pPage->m_pFormDict;
1238 if (pPageDict == NULL) {
1239 return;
1240 }
1241 CPDF_Array* pAnnots = pPageDict->GetArray(FX_BSTRC("Annots"));
1242 if (pAnnots == NULL) {
1243 return;
1244 }
1245 int iAnnotCount = pAnnots->GetCount();
1246 for (int i = 0; i < iAnnotCount; i++) {
1247 CPDF_Dictionary* pAnnot = pAnnots->GetDict(i);
1248 if (pAnnot != NULL && pAnnot->GetString(FX_BSTRC("Subtype")) == "Widget") {
1249 LoadField(pAnnot);
1250 }
1251 }
1252 }
1253 CPDF_FormField* CPDF_InterForm::AddTerminalField(
1254 const CPDF_Dictionary* pFieldDict) {
1255 if (!pFieldDict->KeyExist(FX_BSTRC("T"))) {
1256 return NULL;
1257 }
1258 CPDF_Dictionary* pDict = (CPDF_Dictionary*)pFieldDict;
1259 CFX_WideString csWName = GetFullName(pDict);
1260 if (csWName.IsEmpty()) {
1261 return NULL;
1262 }
1263 CPDF_FormField* pField = NULL;
1264 pField = m_pFieldTree->GetField(csWName);
1265 if (pField == NULL) {
1266 CPDF_Dictionary* pParent = (CPDF_Dictionary*)pFieldDict;
1267 if (!pFieldDict->KeyExist(FX_BSTRC("T")) &&
1268 pFieldDict->GetString(FX_BSTRC("Subtype")) == FX_BSTRC("Widget")) {
1269 pParent = pFieldDict->GetDict(FX_BSTRC("Parent"));
1270 if (!pParent) {
1271 pParent = (CPDF_Dictionary*)pFieldDict;
1272 }
1273 }
1274 if (pParent && pParent != pFieldDict &&
1275 !pParent->KeyExist(FX_BSTRC("FT"))) {
1276 if (pFieldDict->KeyExist(FX_BSTRC("FT"))) {
1277 CPDF_Object* pFTValue = pFieldDict->GetElementValue(FX_BSTRC("FT"));
1278 if (pFTValue) {
1279 pParent->SetAt(FX_BSTRC("FT"), pFTValue->Clone());
1280 }
1281 }
1282 if (pFieldDict->KeyExist(FX_BSTRC("Ff"))) {
1283 CPDF_Object* pFfValue = pFieldDict->GetElementValue(FX_BSTRC("Ff"));
1284 if (pFfValue) {
1285 pParent->SetAt(FX_BSTRC("Ff"), pFfValue->Clone());
1286 }
1287 }
1288 }
1289 pField = new CPDF_FormField(this, pParent);
1290 CPDF_Object* pTObj = pDict->GetElement("T");
1291 if (pTObj && pTObj->GetType() == PDFOBJ_REFERENCE) {
1292 CPDF_Object* pClone = pTObj->Clone(TRUE);
1293 if (pClone) {
1294 pDict->SetAt("T", pClone);
1295 } else {
1296 pDict->SetAtName("T", "");
1297 }
1298 }
1299 m_pFieldTree->SetField(csWName, pField);
1300 }
1301 CPDF_Array* pKids = pFieldDict->GetArray("Kids");
1302 if (pKids == NULL) {
1303 if (pFieldDict->GetString("Subtype") == "Widget") {
1304 AddControl(pField, pFieldDict);
1305 }
1306 } else {
1307 for (FX_DWORD i = 0; i < pKids->GetCount(); i++) {
1308 CPDF_Dictionary* pKid = pKids->GetDict(i);
1309 if (pKid == NULL) {
1310 continue;
1311 }
1312 if (pKid->GetString("Subtype") != "Widget") {
1313 continue;
1314 }
1315 AddControl(pField, pKid);
1316 }
1317 }
1318 return pField;
1319 }
1320 CPDF_FormControl* CPDF_InterForm::AddControl(
1321 const CPDF_FormField* pField,
1322 const CPDF_Dictionary* pWidgetDict) {
1323 void* rValue = NULL;
1324 if (m_ControlMap.Lookup((CPDF_Dictionary*)pWidgetDict, rValue)) {
1325 return (CPDF_FormControl*)rValue;
1326 }
1327 CPDF_FormControl* pControl = new CPDF_FormControl(
1328 (CPDF_FormField*)pField, (CPDF_Dictionary*)pWidgetDict);
1329 m_ControlMap.SetAt((CPDF_Dictionary*)pWidgetDict, pControl);
1330 ((CPDF_FormField*)pField)->m_ControlList.Add(pControl);
1331 return pControl;
1332 }
1333 CPDF_FormField* CPDF_InterForm::CheckRequiredFields(
1334 const CFX_PtrArray* fields,
1335 FX_BOOL bIncludeOrExclude) const {
1336 int nCount = m_pFieldTree->m_Root.CountFields();
1337 for (int i = 0; i < nCount; i++) {
1338 CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
1339 if (pField == NULL) {
1340 continue;
1341 }
1342 int32_t iType = pField->GetType();
1343 if (iType == CPDF_FormField::PushButton ||
1344 iType == CPDF_FormField::CheckBox || iType == CPDF_FormField::ListBox) {
1345 continue;
1346 }
1347 FX_DWORD dwFlags = pField->GetFieldFlags();
1348 if (dwFlags & 0x04) {
1349 continue;
1350 }
1351 FX_BOOL bFind = TRUE;
1352 if (fields != NULL) {
1353 bFind = fields->Find(pField, 0) >= 0;
1354 }
1355 if ((bIncludeOrExclude && bFind) || (!bIncludeOrExclude && !bFind)) {
1356 CPDF_Dictionary* pFieldDict = pField->m_pDict;
1357 if ((dwFlags & 0x02) != 0 && pFieldDict->GetString("V").IsEmpty()) {
1358 return pField;
1359 }
1360 }
1361 }
1362 return NULL;
1363 }
1364 CFDF_Document* CPDF_InterForm::ExportToFDF(const CFX_WideStringC& pdf_path,
1365 FX_BOOL bSimpleFileSpec) const {
1366 CFX_PtrArray fields;
1367 int nCount = m_pFieldTree->m_Root.CountFields();
1368 for (int i = 0; i < nCount; i++) {
1369 CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
1370 fields.Add(pField);
1371 }
1372 return ExportToFDF(pdf_path, fields, TRUE, bSimpleFileSpec);
1373 }
1374 CFX_WideString FILESPEC_EncodeFileName(const CFX_WideStringC& filepath);
1375 CFDF_Document* CPDF_InterForm::ExportToFDF(const CFX_WideStringC& pdf_path,
1376 CFX_PtrArray& fields,
1377 FX_BOOL bIncludeOrExclude,
1378 FX_BOOL bSimpleFileSpec) const {
1379 CFDF_Document* pDoc = CFDF_Document::CreateNewDoc();
1380 if (pDoc == NULL) {
1381 return NULL;
1382 }
1383 CPDF_Dictionary* pMainDict = pDoc->GetRoot()->GetDict("FDF");
1384 if (!pdf_path.IsEmpty()) {
1385 if (bSimpleFileSpec) {
1386 CFX_WideString wsFilePath = FILESPEC_EncodeFileName(pdf_path);
1387 pMainDict->SetAtString(FX_BSTRC("F"),
1388 CFX_ByteString::FromUnicode(wsFilePath));
1389 pMainDict->SetAtString(FX_BSTRC("UF"), PDF_EncodeText(wsFilePath));
1390 } else {
1391 CPDF_FileSpec filespec;
1392 filespec.SetFileName(pdf_path);
1393 pMainDict->SetAt("F", (CPDF_Object*)filespec);
1394 }
1395 }
1396 CPDF_Array* pFields = CPDF_Array::Create();
1397 if (pFields == NULL) {
1398 return NULL;
1399 }
1400 pMainDict->SetAt("Fields", pFields);
1401 int nCount = m_pFieldTree->m_Root.CountFields();
1402 for (int i = 0; i < nCount; i++) {
1403 CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
1404 if (pField == NULL || pField->GetType() == CPDF_FormField::PushButton) {
1405 continue;
1406 }
1407 FX_DWORD dwFlags = pField->GetFieldFlags();
1408 if (dwFlags & 0x04) {
1409 continue;
1410 }
1411 FX_BOOL bFind = fields.Find(pField, 0) >= 0;
1412 if ((bIncludeOrExclude && bFind) || (!bIncludeOrExclude && !bFind)) {
1413 if ((dwFlags & 0x02) != 0 && pField->m_pDict->GetString("V").IsEmpty()) {
1414 continue;
1415 }
1416 CFX_WideString fullname = GetFullName(pField->GetFieldDict());
1417 CPDF_Dictionary* pFieldDict = CPDF_Dictionary::Create();
1418 if (pFieldDict == NULL) {
1419 return NULL;
1420 }
1421 CPDF_String* pString = CPDF_String::Create(fullname);
1422 if (pString == NULL) {
1423 pFieldDict->Release();
1424 return NULL;
1425 }
1426 pFieldDict->SetAt("T", pString);
1427 if (pField->GetType() == CPDF_FormField::CheckBox ||
1428 pField->GetType() == CPDF_FormField::RadioButton) {
1429 CFX_WideString csExport = pField->GetCheckValue(FALSE);
1430 CFX_ByteString csBExport = PDF_EncodeText(csExport);
1431 CPDF_Object* pOpt = FPDF_GetFieldAttr(pField->m_pDict, "Opt");
1432 if (pOpt == NULL) {
1433 pFieldDict->SetAtName("V", csBExport);
1434 } else {
1435 pFieldDict->SetAtString("V", csBExport);
1436 }
1437 } else {
1438 CPDF_Object* pV = FPDF_GetFieldAttr(pField->m_pDict, "V");
1439 if (pV != NULL) {
1440 pFieldDict->SetAt("V", pV->Clone(TRUE));
1441 }
1442 }
1443 pFields->Add(pFieldDict);
1444 }
1445 }
1446 return pDoc;
1447 }
1448 const struct _SupportFieldEncoding {
1449 const FX_CHAR* m_name;
1450 int32_t m_codePage;
1451 } g_fieldEncoding[] = {
1452 {"BigFive", 950},
1453 {"GBK", 936},
1454 {"Shift-JIS", 932},
1455 {"UHC", 949},
1456 };
1457 static void FPDFDOC_FDF_GetFieldValue(CPDF_Dictionary* pFieldDict,
1458 CFX_WideString& csValue,
1459 CFX_ByteString& bsEncoding) {
1460 ASSERT(pFieldDict != NULL);
1461 CFX_ByteString csBValue = pFieldDict->GetString("V");
1462 int32_t iCount = sizeof(g_fieldEncoding) / sizeof(g_fieldEncoding[0]);
1463 int32_t i = 0;
1464 for (; i < iCount; ++i)
1465 if (bsEncoding == g_fieldEncoding[i].m_name) {
1466 break;
1467 }
1468 if (i < iCount) {
1469 CFX_CharMap* pCharMap =
1470 CFX_CharMap::GetDefaultMapper(g_fieldEncoding[i].m_codePage);
1471 FXSYS_assert(pCharMap != NULL);
1472 csValue.ConvertFrom(csBValue, pCharMap);
1473 return;
1474 }
1475 CFX_ByteString csTemp = csBValue.Left(2);
1476 if (csTemp == "\xFF\xFE" || csTemp == "\xFE\xFF") {
1477 csValue = PDF_DecodeText(csBValue);
1478 } else {
1479 csValue = CFX_WideString::FromLocal(csBValue);
1480 }
1481 }
1482 void CPDF_InterForm::FDF_ImportField(CPDF_Dictionary* pFieldDict,
1483 const CFX_WideString& parent_name,
1484 FX_BOOL bNotify,
1485 int nLevel) {
1486 CFX_WideString name;
1487 if (!parent_name.IsEmpty()) {
1488 name = parent_name + L".";
1489 }
1490 name += pFieldDict->GetUnicodeText("T");
1491 CPDF_Array* pKids = pFieldDict->GetArray("Kids");
1492 if (pKids) {
1493 for (FX_DWORD i = 0; i < pKids->GetCount(); i++) {
1494 CPDF_Dictionary* pKid = pKids->GetDict(i);
1495 if (pKid == NULL) {
1496 continue;
1497 }
1498 if (nLevel <= nMaxRecursion) {
1499 FDF_ImportField(pKid, name, bNotify, nLevel + 1);
1500 }
1501 }
1502 return;
1503 }
1504 if (!pFieldDict->KeyExist("V")) {
1505 return;
1506 }
1507 CPDF_FormField* pField = m_pFieldTree->GetField(name);
1508 if (pField == NULL) {
1509 return;
1510 }
1511 CFX_WideString csWValue;
1512 FPDFDOC_FDF_GetFieldValue(pFieldDict, csWValue, m_bsEncoding);
1513 int iType = pField->GetFieldType();
1514 if (bNotify && m_pFormNotify != NULL) {
1515 int iRet = 0;
1516 if (iType == FIELDTYPE_LISTBOX) {
1517 iRet = m_pFormNotify->BeforeSelectionChange(pField, csWValue);
1518 } else if (iType == FIELDTYPE_COMBOBOX || iType == FIELDTYPE_TEXTFIELD) {
1519 iRet = m_pFormNotify->BeforeValueChange(pField, csWValue);
1520 }
1521 if (iRet < 0) {
1522 return;
1523 }
1524 }
1525 CFX_ByteArray statusArray;
1526 if (iType == FIELDTYPE_CHECKBOX || iType == FIELDTYPE_RADIOBUTTON) {
1527 SaveCheckedFieldStatus(pField, statusArray);
1528 }
1529 pField->SetValue(csWValue);
1530 CPDF_FormField::Type eType = pField->GetType();
1531 if ((eType == CPDF_FormField::ListBox || eType == CPDF_FormField::ComboBox) &&
1532 pFieldDict->KeyExist("Opt")) {
1533 pField->m_pDict->SetAt("Opt",
1534 pFieldDict->GetElementValue("Opt")->Clone(TRUE));
1535 }
1536 if (bNotify && m_pFormNotify != NULL) {
1537 if (iType == FIELDTYPE_CHECKBOX || iType == FIELDTYPE_RADIOBUTTON) {
1538 m_pFormNotify->AfterCheckedStatusChange(pField, statusArray);
1539 } else if (iType == FIELDTYPE_LISTBOX) {
1540 m_pFormNotify->AfterSelectionChange(pField);
1541 } else if (iType == FIELDTYPE_COMBOBOX || iType == FIELDTYPE_TEXTFIELD) {
1542 m_pFormNotify->AfterValueChange(pField);
1543 }
1544 }
1545 if (CPDF_InterForm::m_bUpdateAP) {
1546 pField->UpdateAP(NULL);
1547 }
1548 }
1549 FX_BOOL CPDF_InterForm::ImportFromFDF(const CFDF_Document* pFDF,
1550 FX_BOOL bNotify) {
1551 if (pFDF == NULL) {
395 return FALSE; 1552 return FALSE;
396 } 1553 }
397 #endif 1554 CPDF_Dictionary* pMainDict = pFDF->GetRoot()->GetDict("FDF");
398 CPDF_Font* CPDF_InterForm::AddSystemDefaultFont(const CPDF_Document* pDocument) 1555 if (pMainDict == NULL) {
399 { 1556 return FALSE;
400 if (pDocument == NULL) { 1557 }
401 return NULL; 1558 CPDF_Array* pFields = pMainDict->GetArray("Fields");
402 } 1559 if (pFields == NULL) {
403 CPDF_Font* pFont = NULL; 1560 return FALSE;
404 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 1561 }
405 LOGFONTA lf; 1562 m_bsEncoding = pMainDict->GetString(FX_BSTRC("Encoding"));
406 FX_BOOL bRet; 1563 if (bNotify && m_pFormNotify != NULL) {
407 bRet = RetrieveStockFont(DEFAULT_GUI_FONT, 255, lf); 1564 int iRet = m_pFormNotify->BeforeFormImportData(this);
408 if (!bRet) { 1565 if (iRet < 0) {
409 bRet = RetrieveStockFont(SYSTEM_FONT, 255, lf); 1566 return FALSE;
410 } 1567 }
411 if (bRet) { 1568 }
412 pFont = ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE); 1569 for (FX_DWORD i = 0; i < pFields->GetCount(); i++) {
413 } 1570 CPDF_Dictionary* pField = pFields->GetDict(i);
414 #endif
415 return pFont;
416 }
417 CPDF_Font* CPDF_InterForm::AddSystemFont(const CPDF_Document* pDocument, CFX_Byt eString csFontName, uint8_t iCharSet)
418 {
419 if (pDocument == NULL || csFontName.IsEmpty()) {
420 return NULL;
421 }
422 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
423 if (iCharSet == 1) {
424 iCharSet = GetNativeCharSet();
425 }
426 HFONT hFont = ::CreateFontA(0, 0, 0, 0, 0, 0, 0, 0, iCharSet, OUT_DEFAULT_PR ECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, csFontN ame.c_str());
427 if (hFont != NULL) {
428 LOGFONTA lf;
429 memset(&lf, 0, sizeof(LOGFONTA));
430 ::GetObjectA(hFont, sizeof(LOGFONTA), &lf);
431 ::DeleteObject(hFont);
432 if (strlen(lf.lfFaceName) > 0) {
433 return ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE) ;
434 }
435 }
436 #endif
437 return NULL;
438 }
439 CPDF_Font* CPDF_InterForm::AddSystemFont(const CPDF_Document* pDocument, CFX_Wid eString csFontName, uint8_t iCharSet)
440 {
441 if (pDocument == NULL || csFontName.IsEmpty()) {
442 return NULL;
443 }
444 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
445 if (iCharSet == 1) {
446 iCharSet = GetNativeCharSet();
447 }
448 HFONT hFont = ::CreateFontW(0, 0, 0, 0, 0, 0, 0, 0, iCharSet, OUT_DEFAULT_PR ECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, csFontN ame.c_str());
449 if (hFont != NULL) {
450 LOGFONTA lf;
451 memset(&lf, 0, sizeof(LOGFONTA));
452 ::GetObject(hFont, sizeof(LOGFONTA), &lf);
453 ::DeleteObject(hFont);
454 if (strlen(lf.lfFaceName) > 0) {
455 return ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE) ;
456 }
457 }
458 #endif
459 return NULL;
460 }
461 CPDF_Font* CPDF_InterForm::AddStandardFont(const CPDF_Document* pDocument, CFX_B yteString csFontName)
462 {
463 if (pDocument == NULL || csFontName.IsEmpty()) {
464 return NULL;
465 }
466 CPDF_Font* pFont = NULL;
467 if (csFontName == "ZapfDingbats") {
468 pFont = ((CPDF_Document*)pDocument)->AddStandardFont(csFontName, NULL);
469 } else {
470 CPDF_FontEncoding encoding(PDFFONT_ENCODING_WINANSI);
471 pFont = ((CPDF_Document*)pDocument)->AddStandardFont(csFontName, &encodi ng);
472 }
473 return pFont;
474 }
475 CFX_ByteString CPDF_InterForm::GetNativeFont(uint8_t charSet, void* pLogFont)
476 {
477 CFX_ByteString csFontName;
478 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
479 LOGFONTA lf;
480 FX_BOOL bRet;
481 if (charSet == ANSI_CHARSET) {
482 csFontName = "Helvetica";
483 return csFontName;
484 }
485 bRet = FALSE;
486 if (charSet == SHIFTJIS_CHARSET) {
487 bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "MS Mi ncho", lf);
488 } else if (charSet == GB2312_CHARSET) {
489 bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "SimSu n", lf);
490 } else if (charSet == CHINESEBIG5_CHARSET) {
491 bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "MingL iU", lf);
492 }
493 if (!bRet) {
494 bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "Arial Unicode MS", lf);
495 }
496 if (!bRet) {
497 bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "Micro soft Sans Serif", lf);
498 }
499 if (!bRet) {
500 bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, NULL, lf);
501 }
502 if (bRet) {
503 if (pLogFont != NULL) {
504 memcpy(pLogFont, &lf, sizeof(LOGFONTA));
505 }
506 csFontName = lf.lfFaceName;
507 return csFontName;
508 }
509 #endif
510 return csFontName;
511 }
512 CFX_ByteString CPDF_InterForm::GetNativeFont(void* pLogFont)
513 {
514 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
515 uint8_t charSet = GetNativeCharSet();
516 return GetNativeFont(charSet, pLogFont);
517 #else
518 return CFX_ByteString();
519 #endif
520 }
521 uint8_t CPDF_InterForm::GetNativeCharSet()
522 {
523 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
524 uint8_t charSet = ANSI_CHARSET;
525 UINT iCodePage = ::GetACP();
526 switch (iCodePage) {
527 case 932:
528 charSet = SHIFTJIS_CHARSET;
529 break;
530 case 936:
531 charSet = GB2312_CHARSET;
532 break;
533 case 950:
534 charSet = CHINESEBIG5_CHARSET;
535 break;
536 case 1252:
537 charSet = ANSI_CHARSET;
538 break;
539 case 874:
540 charSet = THAI_CHARSET;
541 break;
542 case 949:
543 charSet = HANGUL_CHARSET;
544 break;
545 case 1200:
546 charSet = ANSI_CHARSET;
547 break;
548 case 1250:
549 charSet = EASTEUROPE_CHARSET;
550 break;
551 case 1251:
552 charSet = RUSSIAN_CHARSET;
553 break;
554 case 1253:
555 charSet = GREEK_CHARSET;
556 break;
557 case 1254:
558 charSet = TURKISH_CHARSET;
559 break;
560 case 1255:
561 charSet = HEBREW_CHARSET;
562 break;
563 case 1256:
564 charSet = ARABIC_CHARSET;
565 break;
566 case 1257:
567 charSet = BALTIC_CHARSET;
568 break;
569 case 1258:
570 charSet = VIETNAMESE_CHARSET;
571 break;
572 case 1361:
573 charSet = JOHAB_CHARSET;
574 break;
575 }
576 return charSet;
577 #else
578 return 0;
579 #endif
580 }
581 CPDF_Font* CPDF_InterForm::AddNativeFont(uint8_t charSet, const CPDF_Document* p Document)
582 {
583 if (pDocument == NULL) {
584 return NULL;
585 }
586 CPDF_Font* pFont = NULL;
587 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
588 LOGFONTA lf;
589 CFX_ByteString csFontName = GetNativeFont(charSet, &lf);
590 if (!csFontName.IsEmpty()) {
591 if (csFontName == "Helvetica") {
592 pFont = AddStandardFont(pDocument, csFontName);
593 } else {
594 pFont = ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE );
595 }
596 }
597 #endif
598 return pFont;
599 }
600 CPDF_Font* CPDF_InterForm::AddNativeFont(const CPDF_Document* pDocument)
601 {
602 if (pDocument == NULL) {
603 return NULL;
604 }
605 CPDF_Font* pFont = NULL;
606 uint8_t charSet = GetNativeCharSet();
607 pFont = AddNativeFont(charSet, pDocument);
608 return pFont;
609 }
610 FX_BOOL CPDF_InterForm::ValidateFieldName(CFX_WideString& csNewFieldName, int iT ype, const CPDF_FormField* pExcludedField, const CPDF_FormControl* pExcludedCont rol)
611 {
612 if (csNewFieldName.IsEmpty()) {
613 return FALSE;
614 }
615 int iPos = 0;
616 int iLength = csNewFieldName.GetLength();
617 CFX_WideString csSub;
618 while (TRUE) {
619 while (iPos < iLength && (csNewFieldName[iPos] == L'.' || csNewFieldName [iPos] == L' ')) {
620 iPos ++;
621 }
622 if (iPos < iLength && !csSub.IsEmpty()) {
623 csSub += L'.';
624 }
625 while (iPos < iLength && csNewFieldName[iPos] != L'.') {
626 csSub += csNewFieldName[iPos ++];
627 }
628 for (int i = csSub.GetLength() - 1; i > -1; i --) {
629 if (csSub[i] == L' ' || csSub[i] == L'.') {
630 csSub.SetAt(i, L'\0');
631 } else {
632 break;
633 }
634 }
635 FX_DWORD dwCount = m_pFieldTree->m_Root.CountFields();
636 for (FX_DWORD m = 0; m < dwCount; m ++) {
637 CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(m);
638 if (pField == NULL) {
639 continue;
640 }
641 if (pField == pExcludedField) {
642 if (pExcludedControl != NULL) {
643 if (pField->CountControls() < 2) {
644 continue;
645 }
646 } else {
647 continue;
648 }
649 }
650 CFX_WideString csFullName = pField->GetFullName();
651 int iRet = CompareFieldName(csSub, csFullName);
652 if (iRet == 1) {
653 if (pField->GetFieldType() != iType) {
654 return FALSE;
655 }
656 } else if (iRet == 2 && csSub == csNewFieldName) {
657 if (csFullName[iPos] == L'.') {
658 return FALSE;
659 }
660 } else if (iRet == 3 && csSub == csNewFieldName) {
661 if (csNewFieldName[csFullName.GetLength()] == L'.') {
662 return FALSE;
663 }
664 }
665 }
666 if (iPos >= iLength) {
667 break;
668 }
669 }
670 if (csSub.IsEmpty()) {
671 return FALSE;
672 }
673 csNewFieldName = csSub;
674 return TRUE;
675 }
676 FX_BOOL CPDF_InterForm::ValidateFieldName(CFX_WideString& csNewFieldName, int iT ype)
677 {
678 return ValidateFieldName(csNewFieldName, iType, NULL, NULL);
679 }
680 FX_BOOL CPDF_InterForm::ValidateFieldName(const CPDF_FormField* pField, CFX_Wide String& csNewFieldName)
681 {
682 if (pField == NULL || csNewFieldName.IsEmpty()) {
683 return FALSE;
684 }
685 return ValidateFieldName(csNewFieldName, ((CPDF_FormField*)pField)->GetField Type(), pField, NULL);
686 }
687 FX_BOOL CPDF_InterForm::ValidateFieldName(const CPDF_FormControl* pControl, CFX_ WideString& csNewFieldName)
688 {
689 if (pControl == NULL || csNewFieldName.IsEmpty()) {
690 return FALSE;
691 }
692 CPDF_FormField* pField = ((CPDF_FormControl*)pControl)->GetField();
693 return ValidateFieldName(csNewFieldName, pField->GetFieldType(), pField, pCo ntrol);
694 }
695 int CPDF_InterForm::CompareFieldName(const CFX_ByteString& name1, const CFX_Byte String& name2)
696 {
697 const FX_CHAR* ptr1 = name1;
698 const FX_CHAR* ptr2 = name2;
699 if (name1.GetLength() == name2.GetLength()) {
700 return name1 == name2 ? 1 : 0;
701 }
702 int i = 0;
703 while (ptr1[i] == ptr2[i]) {
704 i ++;
705 }
706 if (i == name1.GetLength()) {
707 return 2;
708 }
709 if (i == name2.GetLength()) {
710 return 3;
711 }
712 return 0;
713 }
714 int CPDF_InterForm::CompareFieldName(const CFX_WideString& name1, const CFX_Wide String& name2)
715 {
716 const FX_WCHAR* ptr1 = name1.c_str();
717 const FX_WCHAR* ptr2 = name2.c_str();
718 if (name1.GetLength() == name2.GetLength()) {
719 return name1 == name2 ? 1 : 0;
720 }
721 int i = 0;
722 while (ptr1[i] == ptr2[i]) {
723 i ++;
724 }
725 if (i == name1.GetLength()) {
726 return 2;
727 }
728 if (i == name2.GetLength()) {
729 return 3;
730 }
731 return 0;
732 }
733 FX_DWORD CPDF_InterForm::CountFields(const CFX_WideString &csFieldName)
734 {
735 if (csFieldName.IsEmpty()) {
736 return (FX_DWORD)m_pFieldTree->m_Root.CountFields();
737 }
738 CFieldTree::_Node *pNode = m_pFieldTree->FindNode(csFieldName);
739 if (pNode == NULL) {
740 return 0;
741 }
742 return pNode->CountFields();
743 }
744 CPDF_FormField* CPDF_InterForm::GetField(FX_DWORD index, const CFX_WideString &c sFieldName)
745 {
746 if (csFieldName == L"") {
747 return m_pFieldTree->m_Root.GetField(index);
748 }
749 CFieldTree::_Node *pNode = m_pFieldTree->FindNode(csFieldName);
750 if (pNode == NULL) {
751 return NULL;
752 }
753 return pNode->GetField(index);
754 }
755 void CPDF_InterForm::GetAllFieldNames(CFX_WideStringArray& allFieldNames)
756 {
757 allFieldNames.RemoveAll();
758 int nCount = m_pFieldTree->m_Root.CountFields();
759 for (int i = 0; i < nCount; i ++) {
760 CPDF_FormField *pField = m_pFieldTree->m_Root.GetField(i);
761 if (pField) {
762 CFX_WideString full_name = GetFullName(pField->GetFieldDict());
763 allFieldNames.Add(full_name);
764 }
765 }
766 }
767 FX_BOOL CPDF_InterForm::IsValidFormField(const void* pField)
768 {
769 if (pField == NULL) { 1571 if (pField == NULL) {
770 return FALSE; 1572 continue;
771 } 1573 }
772 int nCount = m_pFieldTree->m_Root.CountFields(); 1574 FDF_ImportField(pField, L"", bNotify);
773 for (int i = 0; i < nCount; i++) { 1575 }
774 CPDF_FormField *pFormField = m_pFieldTree->m_Root.GetField(i); 1576 if (bNotify && m_pFormNotify != NULL) {
775 if (pField == pFormField) { 1577 m_pFormNotify->AfterFormImportData(this);
776 return TRUE; 1578 }
777 } 1579 return TRUE;
778 } 1580 }
779 return FALSE; 1581 void CPDF_InterForm::SetFormNotify(const CPDF_FormNotify* pNotify) {
780 } 1582 m_pFormNotify = (CPDF_FormNotify*)pNotify;
781 CPDF_FormField* CPDF_InterForm::GetFieldByDict(CPDF_Dictionary* pFieldDict) cons t 1583 }
782 { 1584 int CPDF_InterForm::GetPageWithWidget(int iCurPage, FX_BOOL bNext) {
783 if (pFieldDict == NULL) { 1585 if (iCurPage < 0) {
784 return NULL;
785 }
786 CFX_WideString csWName = GetFullName(pFieldDict);
787 return m_pFieldTree->GetField(csWName);
788 }
789 FX_DWORD CPDF_InterForm::CountControls(CFX_WideString csFieldName)
790 {
791 if (csFieldName.IsEmpty()) {
792 return (FX_DWORD)m_ControlMap.GetCount();
793 }
794 CPDF_FormField *pField = m_pFieldTree->GetField(csFieldName);
795 if (pField == NULL) {
796 return 0;
797 }
798 return pField->m_ControlList.GetSize();
799 }
800 CPDF_FormControl* CPDF_InterForm::GetControl(FX_DWORD index, CFX_WideString csFi eldName)
801 {
802 CPDF_FormField *pField = m_pFieldTree->GetField(csFieldName);
803 if (pField == NULL) {
804 return NULL;
805 }
806 if (index < (FX_DWORD)pField->m_ControlList.GetSize()) {
807 return (CPDF_FormControl *)pField->m_ControlList.GetAt(index);
808 }
809 return NULL;
810 }
811 FX_BOOL CPDF_InterForm::IsValidFormControl(const void* pControl)
812 {
813 if (pControl == NULL) {
814 return FALSE;
815 }
816 FX_POSITION pos = m_ControlMap.GetStartPosition();
817 while (pos) {
818 CPDF_Dictionary* pWidgetDict = NULL;
819 void* pFormControl = NULL;
820 m_ControlMap.GetNextAssoc(pos, (void*&)pWidgetDict, pFormControl);
821 if (pControl == pFormControl) {
822 return TRUE;
823 }
824 }
825 return FALSE;
826 }
827 int CPDF_InterForm::CountPageControls(CPDF_Page* pPage) const
828 {
829 CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArray("Annots");
830 if (pAnnotList == NULL) {
831 return 0;
832 }
833 int count = 0;
834 for (FX_DWORD i = 0; i < pAnnotList->GetCount(); i ++) {
835 CPDF_Dictionary* pAnnot = pAnnotList->GetDict(i);
836 if (pAnnot == NULL) {
837 continue;
838 }
839 CPDF_FormControl* pControl;
840 if (!m_ControlMap.Lookup(pAnnot, (void*&)pControl)) {
841 continue;
842 }
843 count ++;
844 }
845 return count;
846 }
847 CPDF_FormControl* CPDF_InterForm::GetPageControl(CPDF_Page* pPage, int index) co nst
848 {
849 CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArray("Annots");
850 if (pAnnotList == NULL) {
851 return NULL;
852 }
853 int count = 0;
854 for (FX_DWORD i = 0; i < pAnnotList->GetCount(); i ++) {
855 CPDF_Dictionary* pAnnot = pAnnotList->GetDict(i);
856 if (pAnnot == NULL) {
857 continue;
858 }
859 CPDF_FormControl* pControl;
860 if (!m_ControlMap.Lookup(pAnnot, (void*&)pControl)) {
861 continue;
862 }
863 if (index == count) {
864 return pControl;
865 }
866 count ++;
867 }
868 return NULL;
869 }
870 CPDF_FormControl* CPDF_InterForm::GetControlAtPoint(CPDF_Page* pPage, FX_FLOAT p df_x, FX_FLOAT pdf_y) const
871 {
872 CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArray("Annots");
873 if (pAnnotList == NULL) {
874 return NULL;
875 }
876 for (FX_DWORD i = pAnnotList->GetCount(); i > 0; i --) {
877 CPDF_Dictionary* pAnnot = pAnnotList->GetDict(i - 1);
878 if (pAnnot == NULL) {
879 continue;
880 }
881 CPDF_FormControl* pControl;
882 if (!m_ControlMap.Lookup(pAnnot, (void*&)pControl)) {
883 continue;
884 }
885 CFX_FloatRect rect = pControl->GetRect();
886 if (rect.Contains(pdf_x, pdf_y)) {
887 return pControl;
888 }
889 }
890 return NULL;
891 }
892 CPDF_FormControl* CPDF_InterForm::GetControlByDict(CPDF_Dictionary* pWidgetDict) const
893 {
894 CPDF_FormControl* pControl = NULL;
895 m_ControlMap.Lookup(pWidgetDict, (void*&)pControl);
896 return pControl;
897 }
898 FX_DWORD CPDF_InterForm::CountInternalFields(const CFX_WideString& csFieldName) const
899 {
900 if (!m_pFormDict) {
901 return 0;
902 }
903 CPDF_Array* pArray = m_pFormDict->GetArray("Fields");
904 if (!pArray) {
905 return 0;
906 }
907 if (csFieldName.IsEmpty()) {
908 return pArray->GetCount();
909 }
910 int iLength = csFieldName.GetLength();
911 int iPos = 0;
912 CPDF_Dictionary* pDict = NULL;
913 while (pArray != NULL) {
914 CFX_WideString csSub;
915 if (iPos < iLength && csFieldName[iPos] == L'.') {
916 iPos ++;
917 }
918 while (iPos < iLength && csFieldName[iPos] != L'.') {
919 csSub += csFieldName[iPos ++];
920 }
921 int iCount = pArray->GetCount();
922 FX_BOOL bFind = FALSE;
923 for (int i = 0; i < iCount; i ++) {
924 pDict = pArray->GetDict(i);
925 if (pDict == NULL) {
926 continue;
927 }
928 CFX_WideString csT = pDict->GetUnicodeText("T");
929 if (csT == csSub) {
930 bFind = TRUE;
931 break;
932 }
933 }
934 if (!bFind) {
935 return 0;
936 }
937 if (iPos >= iLength) {
938 break;
939 }
940 pArray = pDict->GetArray("Kids");
941 }
942 if (!pDict) {
943 return 0;
944 }
945 pArray = pDict->GetArray("Kids");
946 return pArray ? pArray->GetCount() : 1;
947 }
948
949 CPDF_Dictionary* CPDF_InterForm::GetInternalField(FX_DWORD index, const CFX_Wide String& csFieldName) const
950 {
951 if (!m_pFormDict) {
952 return nullptr;
953 }
954 CPDF_Array* pArray = m_pFormDict->GetArray("Fields");
955 if (!pArray) {
956 return nullptr;
957 }
958 if (csFieldName.IsEmpty()) {
959 return pArray->GetDict(index);
960 }
961 int iLength = csFieldName.GetLength();
962 int iPos = 0;
963 CPDF_Dictionary* pDict = NULL;
964 while (pArray != NULL) {
965 CFX_WideString csSub;
966 if (iPos < iLength && csFieldName[iPos] == L'.') {
967 iPos ++;
968 }
969 while (iPos < iLength && csFieldName[iPos] != L'.') {
970 csSub += csFieldName[iPos ++];
971 }
972 int iCount = pArray->GetCount();
973 FX_BOOL bFind = FALSE;
974 for (int i = 0; i < iCount; i ++) {
975 pDict = pArray->GetDict(i);
976 if (pDict == NULL) {
977 continue;
978 }
979 CFX_WideString csT = pDict->GetUnicodeText("T");
980 if (csT == csSub) {
981 bFind = TRUE;
982 break;
983 }
984 }
985 if (!bFind) {
986 return NULL;
987 }
988 if (iPos >= iLength) {
989 break;
990 }
991 pArray = pDict->GetArray("Kids");
992 }
993 if (!pDict) {
994 return nullptr;
995 }
996 pArray = pDict->GetArray("Kids");
997 return pArray ? pArray->GetDict(index) : pDict;
998 }
999 FX_BOOL CPDF_InterForm::NeedConstructAP()
1000 {
1001 if (m_pFormDict == NULL) {
1002 return FALSE;
1003 }
1004 return m_pFormDict->GetBoolean("NeedAppearances");
1005 }
1006 void CPDF_InterForm::NeedConstructAP(FX_BOOL bNeedAP)
1007 {
1008 if (m_pFormDict == NULL) {
1009 InitInterFormDict(m_pFormDict, m_pDocument);
1010 }
1011 m_pFormDict->SetAtBoolean("NeedAppearances", bNeedAP);
1012 m_bGenerateAP = bNeedAP;
1013 }
1014 int CPDF_InterForm::CountFieldsInCalculationOrder()
1015 {
1016 if (m_pFormDict == NULL) {
1017 return 0;
1018 }
1019 CPDF_Array* pArray = m_pFormDict->GetArray("CO");
1020 if (pArray == NULL) {
1021 return 0;
1022 }
1023 return pArray->GetCount();
1024 }
1025 CPDF_FormField* CPDF_InterForm::GetFieldInCalculationOrder(int index)
1026 {
1027 if (m_pFormDict == NULL || index < 0) {
1028 return NULL;
1029 }
1030 CPDF_Array* pArray = m_pFormDict->GetArray("CO");
1031 if (pArray == NULL) {
1032 return NULL;
1033 }
1034 CPDF_Object* pElement = pArray->GetElementValue(index);
1035 if (pElement != NULL && pElement->GetType() == PDFOBJ_DICTIONARY) {
1036 return GetFieldByDict((CPDF_Dictionary*)pElement);
1037 }
1038 return NULL;
1039 }
1040 int CPDF_InterForm::FindFieldInCalculationOrder(const CPDF_FormField* pField)
1041 {
1042 if (m_pFormDict == NULL || pField == NULL) {
1043 return -1;
1044 }
1045 CPDF_Array* pArray = m_pFormDict->GetArray("CO");
1046 if (pArray == NULL) {
1047 return -1;
1048 }
1049 for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {
1050 CPDF_Object* pElement = pArray->GetElementValue(i);
1051 if (pElement == pField->m_pDict) {
1052 return i;
1053 }
1054 }
1055 return -1; 1586 return -1;
1056 } 1587 }
1057 FX_DWORD CPDF_InterForm::CountFormFonts() 1588 int iPageCount = m_pDocument->GetPageCount();
1058 { 1589 if (iCurPage >= iPageCount) {
1059 return CountInterFormFonts(m_pFormDict); 1590 return -1;
1060 } 1591 }
1061 CPDF_Font* CPDF_InterForm::GetFormFont(FX_DWORD index, CFX_ByteString& csNameTag ) 1592 int iNewPage = iCurPage;
1062 { 1593 do {
1063 return GetInterFormFont(m_pFormDict, m_pDocument, index, csNameTag); 1594 iNewPage += bNext ? 1 : -1;
1064 } 1595 if (iNewPage >= iPageCount) {
1065 CPDF_Font* CPDF_InterForm::GetFormFont(CFX_ByteString csNameTag) 1596 iNewPage = 0;
1066 { 1597 }
1067 return GetInterFormFont(m_pFormDict, m_pDocument, csNameTag); 1598 if (iNewPage < 0) {
1068 } 1599 iNewPage = iPageCount - 1;
1069 CPDF_Font* CPDF_InterForm::GetFormFont(CFX_ByteString csFontName, CFX_ByteString & csNameTag) 1600 }
1070 { 1601 if (iNewPage == iCurPage) {
1071 return GetInterFormFont(m_pFormDict, m_pDocument, csFontName, csNameTag); 1602 break;
1072 } 1603 }
1073 CPDF_Font* CPDF_InterForm::GetNativeFormFont(uint8_t charSet, CFX_ByteString& cs NameTag) 1604 CPDF_Dictionary* pPageDict = m_pDocument->GetPage(iNewPage);
1074 {
1075 return GetNativeInterFormFont(m_pFormDict, m_pDocument, charSet, csNameTag);
1076 }
1077 CPDF_Font* CPDF_InterForm::GetNativeFormFont(CFX_ByteString& csNameTag)
1078 {
1079 return GetNativeInterFormFont(m_pFormDict, m_pDocument, csNameTag);
1080 }
1081 FX_BOOL CPDF_InterForm::FindFormFont(const CPDF_Font* pFont, CFX_ByteString& csN ameTag)
1082 {
1083 return FindInterFormFont(m_pFormDict, pFont, csNameTag);
1084 }
1085 FX_BOOL CPDF_InterForm::FindFormFont(CFX_ByteString csFontName, CPDF_Font*& pFon t, CFX_ByteString& csNameTag)
1086 {
1087 return FindInterFormFont(m_pFormDict, m_pDocument, csFontName, pFont, csName Tag);
1088 }
1089 void CPDF_InterForm::AddFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameT ag)
1090 {
1091 AddInterFormFont(m_pFormDict, m_pDocument, pFont, csNameTag);
1092 m_bUpdated = TRUE;
1093 }
1094 CPDF_Font* CPDF_InterForm::AddNativeFormFont(uint8_t charSet, CFX_ByteString& cs NameTag)
1095 {
1096 m_bUpdated = TRUE;
1097 return AddNativeInterFormFont(m_pFormDict, m_pDocument, charSet, csNameTag);
1098 }
1099 CPDF_Font* CPDF_InterForm::AddNativeFormFont(CFX_ByteString& csNameTag)
1100 {
1101 m_bUpdated = TRUE;
1102 return AddNativeInterFormFont(m_pFormDict, m_pDocument, csNameTag);
1103 }
1104 void CPDF_InterForm::RemoveFormFont(const CPDF_Font* pFont)
1105 {
1106 m_bUpdated = TRUE;
1107 RemoveInterFormFont(m_pFormDict, pFont);
1108 }
1109 void CPDF_InterForm::RemoveFormFont(CFX_ByteString csNameTag)
1110 {
1111 m_bUpdated = TRUE;
1112 RemoveInterFormFont(m_pFormDict, csNameTag);
1113 }
1114 CPDF_DefaultAppearance CPDF_InterForm::GetDefaultAppearance()
1115 {
1116 CFX_ByteString csDA;
1117 if (m_pFormDict == NULL) {
1118 return csDA;
1119 }
1120 csDA = m_pFormDict->GetString("DA");
1121 return csDA;
1122 }
1123 CPDF_Font* CPDF_InterForm::GetDefaultFormFont()
1124 {
1125 return GetDefaultInterFormFont(m_pFormDict, m_pDocument);
1126 }
1127 int CPDF_InterForm::GetFormAlignment()
1128 {
1129 if (m_pFormDict == NULL) {
1130 return 0;
1131 }
1132 return m_pFormDict->GetInteger("Q", 0);
1133 }
1134 FX_BOOL CPDF_InterForm::ResetForm(const CFX_PtrArray& fields, FX_BOOL bIncludeOr Exclude, FX_BOOL bNotify)
1135 {
1136 if (bNotify && m_pFormNotify != NULL) {
1137 int iRet = m_pFormNotify->BeforeFormReset(this);
1138 if (iRet < 0) {
1139 return FALSE;
1140 }
1141 }
1142 int nCount = m_pFieldTree->m_Root.CountFields();
1143 for (int i = 0; i < nCount; i++) {
1144 CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
1145 if (pField == NULL) {
1146 continue;
1147 }
1148 FX_BOOL bFind = FALSE;
1149 int iCount = fields.GetSize();
1150 for (int i = 0; i < iCount; i ++) {
1151 if (pField == (CPDF_FormField*)fields[i]) {
1152 bFind = TRUE;
1153 break;
1154 }
1155 }
1156 if ((bIncludeOrExclude && bFind) || (!bIncludeOrExclude && !bFind)) {
1157 pField->ResetField(bNotify);
1158 }
1159 }
1160 if (bNotify && m_pFormNotify != NULL) {
1161 m_pFormNotify->AfterFormReset(this);
1162 }
1163 return TRUE;
1164 }
1165 FX_BOOL CPDF_InterForm::ResetForm(FX_BOOL bNotify)
1166 {
1167 if (bNotify && m_pFormNotify != NULL) {
1168 int iRet = m_pFormNotify->BeforeFormReset(this);
1169 if (iRet < 0) {
1170 return FALSE;
1171 }
1172 }
1173 int nCount = m_pFieldTree->m_Root.CountFields();
1174 for (int i = 0; i < nCount; i++) {
1175 CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
1176 if (pField == NULL) {
1177 continue;
1178 }
1179 pField->ResetField(bNotify);
1180 }
1181 if (bNotify && m_pFormNotify != NULL) {
1182 m_pFormNotify->AfterFormReset(this);
1183 }
1184 return TRUE;
1185 }
1186 void CPDF_InterForm::ReloadForm()
1187 {
1188 FX_POSITION pos = m_ControlMap.GetStartPosition();
1189 while (pos) {
1190 CPDF_Dictionary* pWidgetDict;
1191 CPDF_FormControl* pControl;
1192 m_ControlMap.GetNextAssoc(pos, (void*&)pWidgetDict, (void*&)pControl);
1193 delete pControl;
1194 }
1195 m_ControlMap.RemoveAll();
1196 int nCount = m_pFieldTree->m_Root.CountFields();
1197 for (int k = 0; k < nCount; k ++) {
1198 CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(k);
1199 delete pField;
1200 }
1201 m_pFieldTree->RemoveAll();
1202 if (m_pFormDict == NULL) {
1203 return;
1204 }
1205 CPDF_Array* pFields = m_pFormDict->GetArray("Fields");
1206 if (pFields == NULL) {
1207 return;
1208 }
1209 int iCount = pFields->GetCount();
1210 for (int i = 0; i < iCount; i ++) {
1211 LoadField(pFields->GetDict(i));
1212 }
1213 }
1214 void CPDF_InterForm::LoadField(CPDF_Dictionary* pFieldDict, int nLevel)
1215 {
1216 if (nLevel > nMaxRecursion) {
1217 return;
1218 }
1219 if (pFieldDict == NULL) {
1220 return;
1221 }
1222 FX_DWORD dwParentObjNum = pFieldDict->GetObjNum();
1223 CPDF_Array* pKids = pFieldDict->GetArray("Kids");
1224 if (!pKids) {
1225 AddTerminalField(pFieldDict);
1226 return;
1227 }
1228 CPDF_Dictionary* pFirstKid = pKids->GetDict(0);
1229 if (pFirstKid == NULL) {
1230 return;
1231 }
1232 if (pFirstKid->KeyExist("T") || pFirstKid->KeyExist("Kids")) {
1233 for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {
1234 CPDF_Dictionary * pChildDict = pKids->GetDict(i);
1235 if (pChildDict) {
1236 if (pChildDict->GetObjNum() != dwParentObjNum) {
1237 LoadField(pChildDict, nLevel + 1);
1238 }
1239 }
1240 }
1241 } else {
1242 AddTerminalField(pFieldDict);
1243 }
1244 }
1245 FX_BOOL CPDF_InterForm::HasXFAForm() const
1246 {
1247 return m_pFormDict && m_pFormDict->GetArray(FX_BSTRC("XFA")) != NULL;
1248 }
1249 void CPDF_InterForm::FixPageFields(const CPDF_Page* pPage)
1250 {
1251 ASSERT(pPage != NULL);
1252 CPDF_Dictionary* pPageDict = pPage->m_pFormDict;
1253 if (pPageDict == NULL) { 1605 if (pPageDict == NULL) {
1254 return; 1606 continue;
1255 } 1607 }
1256 CPDF_Array* pAnnots = pPageDict->GetArray(FX_BSTRC("Annots")); 1608 CPDF_Array* pAnnots = pPageDict->GetArray("Annots");
1257 if (pAnnots == NULL) { 1609 if (pAnnots == NULL) {
1258 return; 1610 continue;
1259 } 1611 }
1260 int iAnnotCount = pAnnots->GetCount(); 1612 FX_DWORD dwCount = pAnnots->GetCount();
1261 for (int i = 0; i < iAnnotCount; i++) { 1613 for (FX_DWORD i = 0; i < dwCount; i++) {
1262 CPDF_Dictionary* pAnnot = pAnnots->GetDict(i); 1614 CPDF_Object* pAnnotDict = pAnnots->GetElementValue(i);
1263 if (pAnnot != NULL && pAnnot->GetString(FX_BSTRC("Subtype")) == "Widget" ) { 1615 if (pAnnotDict == NULL) {
1264 LoadField(pAnnot); 1616 continue;
1265 } 1617 }
1266 } 1618 CPDF_FormControl* pControl = NULL;
1267 } 1619 if (m_ControlMap.Lookup(pAnnotDict, (void*&)pControl)) {
1268 CPDF_FormField* CPDF_InterForm::AddTerminalField(const CPDF_Dictionary* pFieldDi ct) 1620 return iNewPage;
1269 { 1621 }
1270 if (!pFieldDict->KeyExist(FX_BSTRC("T"))) { 1622 }
1271 return NULL; 1623 } while (TRUE);
1272 } 1624 return -1;
1273 CPDF_Dictionary* pDict = (CPDF_Dictionary*)pFieldDict; 1625 }
1274 CFX_WideString csWName = GetFullName(pDict);
1275 if (csWName.IsEmpty()) {
1276 return NULL;
1277 }
1278 CPDF_FormField* pField = NULL;
1279 pField = m_pFieldTree->GetField(csWName);
1280 if (pField == NULL) {
1281 CPDF_Dictionary *pParent = (CPDF_Dictionary*)pFieldDict;
1282 if (!pFieldDict->KeyExist(FX_BSTRC("T")) &&
1283 pFieldDict->GetString(FX_BSTRC("Subtype")) == FX_BSTRC("Widget")) {
1284 pParent = pFieldDict->GetDict(FX_BSTRC("Parent"));
1285 if (!pParent) {
1286 pParent = (CPDF_Dictionary*)pFieldDict;
1287 }
1288 }
1289 if (pParent && pParent != pFieldDict && !pParent->KeyExist(FX_BSTRC("FT" ))) {
1290 if (pFieldDict->KeyExist(FX_BSTRC("FT"))) {
1291 CPDF_Object *pFTValue = pFieldDict->GetElementValue(FX_BSTRC("FT "));
1292 if (pFTValue) {
1293 pParent->SetAt(FX_BSTRC("FT"), pFTValue->Clone());
1294 }
1295 }
1296 if (pFieldDict->KeyExist(FX_BSTRC("Ff"))) {
1297 CPDF_Object *pFfValue = pFieldDict->GetElementValue(FX_BSTRC("Ff "));
1298 if (pFfValue) {
1299 pParent->SetAt(FX_BSTRC("Ff"), pFfValue->Clone());
1300 }
1301 }
1302 }
1303 pField = new CPDF_FormField(this, pParent);
1304 CPDF_Object* pTObj = pDict->GetElement("T");
1305 if (pTObj && pTObj->GetType() == PDFOBJ_REFERENCE) {
1306 CPDF_Object* pClone = pTObj->Clone(TRUE);
1307 if (pClone) {
1308 pDict->SetAt("T", pClone);
1309 } else {
1310 pDict->SetAtName("T", "");
1311 }
1312 }
1313 m_pFieldTree->SetField(csWName, pField);
1314 }
1315 CPDF_Array* pKids = pFieldDict->GetArray("Kids");
1316 if (pKids == NULL) {
1317 if (pFieldDict->GetString("Subtype") == "Widget") {
1318 AddControl(pField, pFieldDict);
1319 }
1320 } else {
1321 for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {
1322 CPDF_Dictionary* pKid = pKids->GetDict(i);
1323 if (pKid == NULL) {
1324 continue;
1325 }
1326 if (pKid->GetString("Subtype") != "Widget") {
1327 continue;
1328 }
1329 AddControl(pField, pKid);
1330 }
1331 }
1332 return pField;
1333 }
1334 CPDF_FormControl* CPDF_InterForm::AddControl(const CPDF_FormField* pField, const CPDF_Dictionary* pWidgetDict)
1335 {
1336 void *rValue = NULL;
1337 if (m_ControlMap.Lookup((CPDF_Dictionary*)pWidgetDict, rValue)) {
1338 return (CPDF_FormControl*)rValue;
1339 }
1340 CPDF_FormControl* pControl = new CPDF_FormControl((CPDF_FormField*)pField, ( CPDF_Dictionary*)pWidgetDict);
1341 m_ControlMap.SetAt((CPDF_Dictionary*)pWidgetDict, pControl);
1342 ((CPDF_FormField*)pField)->m_ControlList.Add(pControl);
1343 return pControl;
1344 }
1345 CPDF_FormField* CPDF_InterForm::CheckRequiredFields(const CFX_PtrArray *fields, FX_BOOL bIncludeOrExclude) const
1346 {
1347 int nCount = m_pFieldTree->m_Root.CountFields();
1348 for (int i = 0; i < nCount; i++) {
1349 CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
1350 if (pField == NULL) {
1351 continue;
1352 }
1353 int32_t iType = pField->GetType();
1354 if (iType == CPDF_FormField::PushButton || iType == CPDF_FormField::Chec kBox || iType == CPDF_FormField::ListBox) {
1355 continue;
1356 }
1357 FX_DWORD dwFlags = pField->GetFieldFlags();
1358 if (dwFlags & 0x04) {
1359 continue;
1360 }
1361 FX_BOOL bFind = TRUE;
1362 if (fields != NULL) {
1363 bFind = fields->Find(pField, 0) >= 0;
1364 }
1365 if ((bIncludeOrExclude && bFind) || (!bIncludeOrExclude && !bFind)) {
1366 CPDF_Dictionary *pFieldDict = pField->m_pDict;
1367 if ((dwFlags & 0x02) != 0 && pFieldDict->GetString("V").IsEmpty()) {
1368 return pField;
1369 }
1370 }
1371 }
1372 return NULL;
1373 }
1374 CFDF_Document* CPDF_InterForm::ExportToFDF(const CFX_WideStringC& pdf_path, FX_B OOL bSimpleFileSpec) const
1375 {
1376 CFX_PtrArray fields;
1377 int nCount = m_pFieldTree->m_Root.CountFields();
1378 for (int i = 0; i < nCount; i ++) {
1379 CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
1380 fields.Add(pField);
1381 }
1382 return ExportToFDF(pdf_path, fields, TRUE, bSimpleFileSpec);
1383 }
1384 CFX_WideString FILESPEC_EncodeFileName(const CFX_WideStringC& filepath);
1385 CFDF_Document* CPDF_InterForm::ExportToFDF(const CFX_WideStringC& pdf_path, CFX_ PtrArray& fields, FX_BOOL bIncludeOrExclude, FX_BOOL bSimpleFileSpec) const
1386 {
1387 CFDF_Document* pDoc = CFDF_Document::CreateNewDoc();
1388 if (pDoc == NULL) {
1389 return NULL;
1390 }
1391 CPDF_Dictionary* pMainDict = pDoc->GetRoot()->GetDict("FDF");
1392 if (!pdf_path.IsEmpty()) {
1393 if (bSimpleFileSpec) {
1394 CFX_WideString wsFilePath = FILESPEC_EncodeFileName(pdf_path);
1395 pMainDict->SetAtString(FX_BSTRC("F"), CFX_ByteString::FromUnicode(ws FilePath));
1396 pMainDict->SetAtString(FX_BSTRC("UF"), PDF_EncodeText(wsFilePath));
1397 } else {
1398 CPDF_FileSpec filespec;
1399 filespec.SetFileName(pdf_path);
1400 pMainDict->SetAt("F", (CPDF_Object*)filespec);
1401 }
1402 }
1403 CPDF_Array* pFields = CPDF_Array::Create();
1404 if (pFields == NULL) {
1405 return NULL;
1406 }
1407 pMainDict->SetAt("Fields", pFields);
1408 int nCount = m_pFieldTree->m_Root.CountFields();
1409 for (int i = 0; i < nCount; i ++) {
1410 CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
1411 if (pField == NULL || pField->GetType() == CPDF_FormField::PushButton) {
1412 continue;
1413 }
1414 FX_DWORD dwFlags = pField->GetFieldFlags();
1415 if (dwFlags & 0x04) {
1416 continue;
1417 }
1418 FX_BOOL bFind = fields.Find(pField, 0) >= 0;
1419 if ((bIncludeOrExclude && bFind) || (!bIncludeOrExclude && !bFind)) {
1420 if ((dwFlags & 0x02) != 0 && pField->m_pDict->GetString("V").IsEmpty ()) {
1421 continue;
1422 }
1423 CFX_WideString fullname = GetFullName(pField->GetFieldDict());
1424 CPDF_Dictionary* pFieldDict = CPDF_Dictionary::Create();
1425 if (pFieldDict == NULL) {
1426 return NULL;
1427 }
1428 CPDF_String* pString = CPDF_String::Create(fullname);
1429 if (pString == NULL) {
1430 pFieldDict->Release();
1431 return NULL;
1432 }
1433 pFieldDict->SetAt("T", pString);
1434 if (pField->GetType() == CPDF_FormField::CheckBox || pField->GetType () == CPDF_FormField::RadioButton) {
1435 CFX_WideString csExport = pField->GetCheckValue(FALSE);
1436 CFX_ByteString csBExport = PDF_EncodeText(csExport);
1437 CPDF_Object* pOpt = FPDF_GetFieldAttr(pField->m_pDict, "Opt");
1438 if (pOpt == NULL) {
1439 pFieldDict->SetAtName("V", csBExport);
1440 } else {
1441 pFieldDict->SetAtString("V", csBExport);
1442 }
1443 } else {
1444 CPDF_Object* pV = FPDF_GetFieldAttr(pField->m_pDict, "V");
1445 if (pV != NULL) {
1446 pFieldDict->SetAt("V", pV->Clone(TRUE));
1447 }
1448 }
1449 pFields->Add(pFieldDict);
1450 }
1451 }
1452 return pDoc;
1453 }
1454 const struct _SupportFieldEncoding {
1455 const FX_CHAR* m_name;
1456 int32_t m_codePage;
1457 } g_fieldEncoding[] = {
1458 { "BigFive", 950 },
1459 { "GBK", 936 },
1460 { "Shift-JIS", 932 },
1461 { "UHC", 949 },
1462 };
1463 static void FPDFDOC_FDF_GetFieldValue(CPDF_Dictionary *pFieldDict, CFX_WideStrin g &csValue, CFX_ByteString &bsEncoding)
1464 {
1465 ASSERT(pFieldDict != NULL);
1466 CFX_ByteString csBValue = pFieldDict->GetString("V");
1467 int32_t iCount = sizeof(g_fieldEncoding) / sizeof(g_fieldEncoding[0]);
1468 int32_t i = 0;
1469 for (; i < iCount; ++i)
1470 if (bsEncoding == g_fieldEncoding[i].m_name) {
1471 break;
1472 }
1473 if (i < iCount) {
1474 CFX_CharMap *pCharMap = CFX_CharMap::GetDefaultMapper(g_fieldEncoding[i] .m_codePage);
1475 FXSYS_assert(pCharMap != NULL);
1476 csValue.ConvertFrom(csBValue, pCharMap);
1477 return;
1478 }
1479 CFX_ByteString csTemp = csBValue.Left(2);
1480 if (csTemp == "\xFF\xFE" || csTemp == "\xFE\xFF") {
1481 csValue = PDF_DecodeText(csBValue);
1482 } else {
1483 csValue = CFX_WideString::FromLocal(csBValue);
1484 }
1485 }
1486 void CPDF_InterForm::FDF_ImportField(CPDF_Dictionary* pFieldDict, const CFX_Wide String& parent_name, FX_BOOL bNotify, int nLevel)
1487 {
1488 CFX_WideString name;
1489 if (!parent_name.IsEmpty()) {
1490 name = parent_name + L".";
1491 }
1492 name += pFieldDict->GetUnicodeText("T");
1493 CPDF_Array* pKids = pFieldDict->GetArray("Kids");
1494 if (pKids) {
1495 for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {
1496 CPDF_Dictionary* pKid = pKids->GetDict(i);
1497 if (pKid == NULL) {
1498 continue;
1499 }
1500 if (nLevel <= nMaxRecursion) {
1501 FDF_ImportField(pKid, name, bNotify, nLevel + 1);
1502 }
1503 }
1504 return;
1505 }
1506 if (!pFieldDict->KeyExist("V")) {
1507 return;
1508 }
1509 CPDF_FormField* pField = m_pFieldTree->GetField(name);
1510 if (pField == NULL) {
1511 return;
1512 }
1513 CFX_WideString csWValue;
1514 FPDFDOC_FDF_GetFieldValue(pFieldDict, csWValue, m_bsEncoding);
1515 int iType = pField->GetFieldType();
1516 if (bNotify && m_pFormNotify != NULL) {
1517 int iRet = 0;
1518 if (iType == FIELDTYPE_LISTBOX) {
1519 iRet = m_pFormNotify->BeforeSelectionChange(pField, csWValue);
1520 } else if (iType == FIELDTYPE_COMBOBOX || iType == FIELDTYPE_TEXTFIELD) {
1521 iRet = m_pFormNotify->BeforeValueChange(pField, csWValue);
1522 }
1523 if (iRet < 0) {
1524 return;
1525 }
1526 }
1527 CFX_ByteArray statusArray;
1528 if (iType == FIELDTYPE_CHECKBOX || iType == FIELDTYPE_RADIOBUTTON) {
1529 SaveCheckedFieldStatus(pField, statusArray);
1530 }
1531 pField->SetValue(csWValue);
1532 CPDF_FormField::Type eType = pField->GetType();
1533 if ((eType == CPDF_FormField::ListBox || eType == CPDF_FormField::ComboBox) && pFieldDict->KeyExist("Opt")) {
1534 pField->m_pDict->SetAt("Opt", pFieldDict->GetElementValue("Opt")->Clone( TRUE));
1535 }
1536 if (bNotify && m_pFormNotify != NULL) {
1537 if (iType == FIELDTYPE_CHECKBOX || iType == FIELDTYPE_RADIOBUTTON) {
1538 m_pFormNotify->AfterCheckedStatusChange(pField, statusArray);
1539 } else if (iType == FIELDTYPE_LISTBOX) {
1540 m_pFormNotify->AfterSelectionChange(pField);
1541 } else if (iType == FIELDTYPE_COMBOBOX || iType == FIELDTYPE_TEXTFIELD) {
1542 m_pFormNotify->AfterValueChange(pField);
1543 }
1544 }
1545 if (CPDF_InterForm::m_bUpdateAP) {
1546 pField->UpdateAP(NULL);
1547 }
1548 }
1549 FX_BOOL CPDF_InterForm::ImportFromFDF(const CFDF_Document* pFDF, FX_BOOL bNotify )
1550 {
1551 if (pFDF == NULL) {
1552 return FALSE;
1553 }
1554 CPDF_Dictionary* pMainDict = pFDF->GetRoot()->GetDict("FDF");
1555 if (pMainDict == NULL) {
1556 return FALSE;
1557 }
1558 CPDF_Array* pFields = pMainDict->GetArray("Fields");
1559 if (pFields == NULL) {
1560 return FALSE;
1561 }
1562 m_bsEncoding = pMainDict->GetString(FX_BSTRC("Encoding"));
1563 if (bNotify && m_pFormNotify != NULL) {
1564 int iRet = m_pFormNotify->BeforeFormImportData(this);
1565 if (iRet < 0) {
1566 return FALSE;
1567 }
1568 }
1569 for (FX_DWORD i = 0; i < pFields->GetCount(); i ++) {
1570 CPDF_Dictionary* pField = pFields->GetDict(i);
1571 if (pField == NULL) {
1572 continue;
1573 }
1574 FDF_ImportField(pField, L"", bNotify);
1575 }
1576 if (bNotify && m_pFormNotify != NULL) {
1577 m_pFormNotify->AfterFormImportData(this);
1578 }
1579 return TRUE;
1580 }
1581 void CPDF_InterForm::SetFormNotify(const CPDF_FormNotify* pNotify)
1582 {
1583 m_pFormNotify = (CPDF_FormNotify*)pNotify;
1584 }
1585 int CPDF_InterForm::GetPageWithWidget(int iCurPage, FX_BOOL bNext)
1586 {
1587 if (iCurPage < 0) {
1588 return -1;
1589 }
1590 int iPageCount = m_pDocument->GetPageCount();
1591 if (iCurPage >= iPageCount) {
1592 return -1;
1593 }
1594 int iNewPage = iCurPage;
1595 do {
1596 iNewPage += bNext ? 1 : -1;
1597 if (iNewPage >= iPageCount) {
1598 iNewPage = 0;
1599 }
1600 if (iNewPage < 0) {
1601 iNewPage = iPageCount - 1;
1602 }
1603 if (iNewPage == iCurPage) {
1604 break;
1605 }
1606 CPDF_Dictionary* pPageDict = m_pDocument->GetPage(iNewPage);
1607 if (pPageDict == NULL) {
1608 continue;
1609 }
1610 CPDF_Array* pAnnots = pPageDict->GetArray("Annots");
1611 if (pAnnots == NULL) {
1612 continue;
1613 }
1614 FX_DWORD dwCount = pAnnots->GetCount();
1615 for (FX_DWORD i = 0; i < dwCount; i ++) {
1616 CPDF_Object* pAnnotDict = pAnnots->GetElementValue(i);
1617 if (pAnnotDict == NULL) {
1618 continue;
1619 }
1620 CPDF_FormControl* pControl = NULL;
1621 if (m_ControlMap.Lookup(pAnnotDict, (void*&)pControl)) {
1622 return iNewPage;
1623 }
1624 }
1625 } while (TRUE);
1626 return -1;
1627 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698