OLD | NEW |
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 "core/include/fpdfdoc/fpdf_doc.h" | 7 #include "core/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; |
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
321 } | 321 } |
322 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ | 322 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ |
323 typedef struct _PDF_FONTDATA { | 323 typedef struct _PDF_FONTDATA { |
324 FX_BOOL bFind; | 324 FX_BOOL bFind; |
325 LOGFONTA lf; | 325 LOGFONTA lf; |
326 } PDF_FONTDATA, FAR* LPDF_FONTDATA; | 326 } PDF_FONTDATA, FAR* LPDF_FONTDATA; |
327 static int CALLBACK EnumFontFamExProc(ENUMLOGFONTEXA* lpelfe, | 327 static int CALLBACK EnumFontFamExProc(ENUMLOGFONTEXA* lpelfe, |
328 NEWTEXTMETRICEX* lpntme, | 328 NEWTEXTMETRICEX* lpntme, |
329 DWORD FontType, | 329 DWORD FontType, |
330 LPARAM lParam) { | 330 LPARAM lParam) { |
331 if (FontType != 0x004 || strchr(lpelfe->elfLogFont.lfFaceName, '@') != NULL) { | 331 if (FontType != 0x004 || strchr(lpelfe->elfLogFont.lfFaceName, '@')) { |
332 return 1; | 332 return 1; |
333 } | 333 } |
334 LPDF_FONTDATA pData = (LPDF_FONTDATA)lParam; | 334 LPDF_FONTDATA pData = (LPDF_FONTDATA)lParam; |
335 memcpy(&pData->lf, &lpelfe->elfLogFont, sizeof(LOGFONTA)); | 335 memcpy(&pData->lf, &lpelfe->elfLogFont, sizeof(LOGFONTA)); |
336 pData->bFind = TRUE; | 336 pData->bFind = TRUE; |
337 return 0; | 337 return 0; |
338 } | 338 } |
339 static FX_BOOL RetrieveSpecificFont(LOGFONTA& lf) { | 339 static FX_BOOL RetrieveSpecificFont(LOGFONTA& lf) { |
340 PDF_FONTDATA fd; | 340 PDF_FONTDATA fd; |
341 memset(&fd, 0, sizeof(PDF_FONTDATA)); | 341 memset(&fd, 0, sizeof(PDF_FONTDATA)); |
342 HDC hDC = ::GetDC(NULL); | 342 HDC hDC = ::GetDC(NULL); |
343 EnumFontFamiliesExA(hDC, &lf, (FONTENUMPROCA)EnumFontFamExProc, (LPARAM)&fd, | 343 EnumFontFamiliesExA(hDC, &lf, (FONTENUMPROCA)EnumFontFamExProc, (LPARAM)&fd, |
344 0); | 344 0); |
345 ::ReleaseDC(NULL, hDC); | 345 ::ReleaseDC(NULL, hDC); |
346 if (fd.bFind) { | 346 if (fd.bFind) { |
347 memcpy(&lf, &fd.lf, sizeof(LOGFONTA)); | 347 memcpy(&lf, &fd.lf, sizeof(LOGFONTA)); |
348 } | 348 } |
349 return fd.bFind; | 349 return fd.bFind; |
350 } | 350 } |
351 static FX_BOOL RetrieveSpecificFont(uint8_t charSet, | 351 static FX_BOOL RetrieveSpecificFont(uint8_t charSet, |
352 uint8_t pitchAndFamily, | 352 uint8_t pitchAndFamily, |
353 LPCSTR pcsFontName, | 353 LPCSTR pcsFontName, |
354 LOGFONTA& lf) { | 354 LOGFONTA& lf) { |
355 memset(&lf, 0, sizeof(LOGFONTA)); | 355 memset(&lf, 0, sizeof(LOGFONTA)); |
356 lf.lfCharSet = charSet; | 356 lf.lfCharSet = charSet; |
357 lf.lfPitchAndFamily = pitchAndFamily; | 357 lf.lfPitchAndFamily = pitchAndFamily; |
358 if (pcsFontName != NULL) { | 358 if (pcsFontName) { |
359 strcpy(lf.lfFaceName, pcsFontName); | 359 strcpy(lf.lfFaceName, pcsFontName); |
360 } | 360 } |
361 return RetrieveSpecificFont(lf); | 361 return RetrieveSpecificFont(lf); |
362 } | 362 } |
363 #ifdef PDF_ENABLE_XFA | 363 #ifdef PDF_ENABLE_XFA |
364 static FX_BOOL RetrieveStockFont(int iFontObject, | 364 static FX_BOOL RetrieveStockFont(int iFontObject, |
365 uint8_t charSet, | 365 uint8_t charSet, |
366 LOGFONTA& lf) { | 366 LOGFONTA& lf) { |
367 HFONT hFont = (HFONT)::GetStockObject(iFontObject); | 367 HFONT hFont = (HFONT)::GetStockObject(iFontObject); |
368 if (hFont != NULL) { | 368 if (hFont != NULL) { |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
414 "Arial Unicode MS", lf); | 414 "Arial Unicode MS", lf); |
415 } | 415 } |
416 if (!bRet) { | 416 if (!bRet) { |
417 bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, | 417 bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, |
418 "Microsoft Sans Serif", lf); | 418 "Microsoft Sans Serif", lf); |
419 } | 419 } |
420 if (!bRet) { | 420 if (!bRet) { |
421 bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, NULL, lf); | 421 bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, NULL, lf); |
422 } | 422 } |
423 if (bRet) { | 423 if (bRet) { |
424 if (pLogFont != NULL) { | 424 if (pLogFont) { |
425 memcpy(pLogFont, &lf, sizeof(LOGFONTA)); | 425 memcpy(pLogFont, &lf, sizeof(LOGFONTA)); |
426 } | 426 } |
427 csFontName = lf.lfFaceName; | 427 csFontName = lf.lfFaceName; |
428 return csFontName; | 428 return csFontName; |
429 } | 429 } |
430 #endif | 430 #endif |
431 return csFontName; | 431 return csFontName; |
432 } | 432 } |
433 CFX_ByteString CPDF_InterForm::GetNativeFont(void* pLogFont) { | 433 CFX_ByteString CPDF_InterForm::GetNativeFont(void* pLogFont) { |
434 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ | 434 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
548 break; | 548 break; |
549 } | 549 } |
550 } | 550 } |
551 FX_DWORD dwCount = m_pFieldTree->m_Root.CountFields(); | 551 FX_DWORD dwCount = m_pFieldTree->m_Root.CountFields(); |
552 for (FX_DWORD m = 0; m < dwCount; m++) { | 552 for (FX_DWORD m = 0; m < dwCount; m++) { |
553 CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(m); | 553 CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(m); |
554 if (pField == NULL) { | 554 if (pField == NULL) { |
555 continue; | 555 continue; |
556 } | 556 } |
557 if (pField == pExcludedField) { | 557 if (pField == pExcludedField) { |
558 if (pExcludedControl != NULL) { | 558 if (pExcludedControl) { |
559 if (pField->CountControls() < 2) { | 559 if (pField->CountControls() < 2) { |
560 continue; | 560 continue; |
561 } | 561 } |
562 } else { | 562 } else { |
563 continue; | 563 continue; |
564 } | 564 } |
565 } | 565 } |
566 CFX_WideString csFullName = pField->GetFullName(); | 566 CFX_WideString csFullName = pField->GetFullName(); |
567 int iRet = CompareFieldName(csSub, csFullName); | 567 int iRet = CompareFieldName(csSub, csFullName); |
568 if (iRet == 1) { | 568 if (iRet == 1) { |
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
912 if (pChildDict->GetObjNum() != dwParentObjNum) { | 912 if (pChildDict->GetObjNum() != dwParentObjNum) { |
913 LoadField(pChildDict, nLevel + 1); | 913 LoadField(pChildDict, nLevel + 1); |
914 } | 914 } |
915 } | 915 } |
916 } | 916 } |
917 } else { | 917 } else { |
918 AddTerminalField(pFieldDict); | 918 AddTerminalField(pFieldDict); |
919 } | 919 } |
920 } | 920 } |
921 FX_BOOL CPDF_InterForm::HasXFAForm() const { | 921 FX_BOOL CPDF_InterForm::HasXFAForm() const { |
922 return m_pFormDict && m_pFormDict->GetArray("XFA") != NULL; | 922 return m_pFormDict && m_pFormDict->GetArray("XFA"); |
923 } | 923 } |
924 void CPDF_InterForm::FixPageFields(const CPDF_Page* pPage) { | 924 void CPDF_InterForm::FixPageFields(const CPDF_Page* pPage) { |
925 ASSERT(pPage != NULL); | |
926 CPDF_Dictionary* pPageDict = pPage->m_pFormDict; | 925 CPDF_Dictionary* pPageDict = pPage->m_pFormDict; |
927 if (pPageDict == NULL) { | 926 if (pPageDict == NULL) { |
928 return; | 927 return; |
929 } | 928 } |
930 CPDF_Array* pAnnots = pPageDict->GetArray("Annots"); | 929 CPDF_Array* pAnnots = pPageDict->GetArray("Annots"); |
931 if (pAnnots == NULL) { | 930 if (pAnnots == NULL) { |
932 return; | 931 return; |
933 } | 932 } |
934 int iAnnotCount = pAnnots->GetCount(); | 933 int iAnnotCount = pAnnots->GetCount(); |
935 for (int i = 0; i < iAnnotCount; i++) { | 934 for (int i = 0; i < iAnnotCount; i++) { |
936 CPDF_Dictionary* pAnnot = pAnnots->GetDict(i); | 935 CPDF_Dictionary* pAnnot = pAnnots->GetDict(i); |
937 if (pAnnot != NULL && pAnnot->GetString("Subtype") == "Widget") { | 936 if (pAnnot && pAnnot->GetString("Subtype") == "Widget") { |
938 LoadField(pAnnot); | 937 LoadField(pAnnot); |
939 } | 938 } |
940 } | 939 } |
941 } | 940 } |
942 CPDF_FormField* CPDF_InterForm::AddTerminalField(CPDF_Dictionary* pFieldDict) { | 941 CPDF_FormField* CPDF_InterForm::AddTerminalField(CPDF_Dictionary* pFieldDict) { |
943 if (!pFieldDict->KeyExist("T")) { | 942 if (!pFieldDict->KeyExist("T")) { |
944 return NULL; | 943 return NULL; |
945 } | 944 } |
946 CPDF_Dictionary* pDict = pFieldDict; | 945 CPDF_Dictionary* pDict = pFieldDict; |
947 CFX_WideString csWName = GetFullName(pFieldDict); | 946 CFX_WideString csWName = GetFullName(pFieldDict); |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1135 int32_t m_codePage; | 1134 int32_t m_codePage; |
1136 } g_fieldEncoding[] = { | 1135 } g_fieldEncoding[] = { |
1137 {"BigFive", 950}, | 1136 {"BigFive", 950}, |
1138 {"GBK", 936}, | 1137 {"GBK", 936}, |
1139 {"Shift-JIS", 932}, | 1138 {"Shift-JIS", 932}, |
1140 {"UHC", 949}, | 1139 {"UHC", 949}, |
1141 }; | 1140 }; |
1142 static void FPDFDOC_FDF_GetFieldValue(CPDF_Dictionary* pFieldDict, | 1141 static void FPDFDOC_FDF_GetFieldValue(CPDF_Dictionary* pFieldDict, |
1143 CFX_WideString& csValue, | 1142 CFX_WideString& csValue, |
1144 CFX_ByteString& bsEncoding) { | 1143 CFX_ByteString& bsEncoding) { |
1145 ASSERT(pFieldDict != NULL); | |
1146 CFX_ByteString csBValue = pFieldDict->GetString("V"); | 1144 CFX_ByteString csBValue = pFieldDict->GetString("V"); |
1147 int32_t iCount = sizeof(g_fieldEncoding) / sizeof(g_fieldEncoding[0]); | 1145 int32_t iCount = sizeof(g_fieldEncoding) / sizeof(g_fieldEncoding[0]); |
1148 int32_t i = 0; | 1146 int32_t i = 0; |
1149 for (; i < iCount; ++i) | 1147 for (; i < iCount; ++i) |
1150 if (bsEncoding == g_fieldEncoding[i].m_name) { | 1148 if (bsEncoding == g_fieldEncoding[i].m_name) { |
1151 break; | 1149 break; |
1152 } | 1150 } |
1153 if (i < iCount) { | 1151 if (i < iCount) { |
1154 CFX_CharMap* pCharMap = | 1152 CFX_CharMap* pCharMap = |
1155 CFX_CharMap::GetDefaultMapper(g_fieldEncoding[i].m_codePage); | 1153 CFX_CharMap::GetDefaultMapper(g_fieldEncoding[i].m_codePage); |
1156 FXSYS_assert(pCharMap != NULL); | 1154 FXSYS_assert(pCharMap); |
1157 csValue.ConvertFrom(csBValue, pCharMap); | 1155 csValue.ConvertFrom(csBValue, pCharMap); |
1158 return; | 1156 return; |
1159 } | 1157 } |
1160 CFX_ByteString csTemp = csBValue.Left(2); | 1158 CFX_ByteString csTemp = csBValue.Left(2); |
1161 if (csTemp == "\xFF\xFE" || csTemp == "\xFE\xFF") { | 1159 if (csTemp == "\xFF\xFE" || csTemp == "\xFE\xFF") { |
1162 csValue = PDF_DecodeText(csBValue); | 1160 csValue = PDF_DecodeText(csBValue); |
1163 } else { | 1161 } else { |
1164 csValue = CFX_WideString::FromLocal(csBValue); | 1162 csValue = CFX_WideString::FromLocal(csBValue); |
1165 } | 1163 } |
1166 } | 1164 } |
(...skipping 22 matching lines...) Expand all Loading... |
1189 if (!pFieldDict->KeyExist("V")) { | 1187 if (!pFieldDict->KeyExist("V")) { |
1190 return; | 1188 return; |
1191 } | 1189 } |
1192 CPDF_FormField* pField = m_pFieldTree->GetField(name); | 1190 CPDF_FormField* pField = m_pFieldTree->GetField(name); |
1193 if (pField == NULL) { | 1191 if (pField == NULL) { |
1194 return; | 1192 return; |
1195 } | 1193 } |
1196 CFX_WideString csWValue; | 1194 CFX_WideString csWValue; |
1197 FPDFDOC_FDF_GetFieldValue(pFieldDict, csWValue, m_bsEncoding); | 1195 FPDFDOC_FDF_GetFieldValue(pFieldDict, csWValue, m_bsEncoding); |
1198 int iType = pField->GetFieldType(); | 1196 int iType = pField->GetFieldType(); |
1199 if (bNotify && m_pFormNotify != NULL) { | 1197 if (bNotify && m_pFormNotify) { |
1200 int iRet = 0; | 1198 int iRet = 0; |
1201 if (iType == FIELDTYPE_LISTBOX) { | 1199 if (iType == FIELDTYPE_LISTBOX) { |
1202 iRet = m_pFormNotify->BeforeSelectionChange(pField, csWValue); | 1200 iRet = m_pFormNotify->BeforeSelectionChange(pField, csWValue); |
1203 } else if (iType == FIELDTYPE_COMBOBOX || iType == FIELDTYPE_TEXTFIELD) { | 1201 } else if (iType == FIELDTYPE_COMBOBOX || iType == FIELDTYPE_TEXTFIELD) { |
1204 iRet = m_pFormNotify->BeforeValueChange(pField, csWValue); | 1202 iRet = m_pFormNotify->BeforeValueChange(pField, csWValue); |
1205 } | 1203 } |
1206 if (iRet < 0) { | 1204 if (iRet < 0) { |
1207 return; | 1205 return; |
1208 } | 1206 } |
1209 } | 1207 } |
1210 CFX_ByteArray statusArray; | 1208 CFX_ByteArray statusArray; |
1211 if (iType == FIELDTYPE_CHECKBOX || iType == FIELDTYPE_RADIOBUTTON) { | 1209 if (iType == FIELDTYPE_CHECKBOX || iType == FIELDTYPE_RADIOBUTTON) { |
1212 SaveCheckedFieldStatus(pField, statusArray); | 1210 SaveCheckedFieldStatus(pField, statusArray); |
1213 } | 1211 } |
1214 pField->SetValue(csWValue); | 1212 pField->SetValue(csWValue); |
1215 CPDF_FormField::Type eType = pField->GetType(); | 1213 CPDF_FormField::Type eType = pField->GetType(); |
1216 if ((eType == CPDF_FormField::ListBox || eType == CPDF_FormField::ComboBox) && | 1214 if ((eType == CPDF_FormField::ListBox || eType == CPDF_FormField::ComboBox) && |
1217 pFieldDict->KeyExist("Opt")) { | 1215 pFieldDict->KeyExist("Opt")) { |
1218 pField->m_pDict->SetAt("Opt", | 1216 pField->m_pDict->SetAt("Opt", |
1219 pFieldDict->GetElementValue("Opt")->Clone(TRUE)); | 1217 pFieldDict->GetElementValue("Opt")->Clone(TRUE)); |
1220 } | 1218 } |
1221 if (bNotify && m_pFormNotify != NULL) { | 1219 if (bNotify && m_pFormNotify) { |
1222 if (iType == FIELDTYPE_CHECKBOX || iType == FIELDTYPE_RADIOBUTTON) { | 1220 if (iType == FIELDTYPE_CHECKBOX || iType == FIELDTYPE_RADIOBUTTON) { |
1223 m_pFormNotify->AfterCheckedStatusChange(pField, statusArray); | 1221 m_pFormNotify->AfterCheckedStatusChange(pField, statusArray); |
1224 } else if (iType == FIELDTYPE_LISTBOX) { | 1222 } else if (iType == FIELDTYPE_LISTBOX) { |
1225 m_pFormNotify->AfterSelectionChange(pField); | 1223 m_pFormNotify->AfterSelectionChange(pField); |
1226 } else if (iType == FIELDTYPE_COMBOBOX || iType == FIELDTYPE_TEXTFIELD) { | 1224 } else if (iType == FIELDTYPE_COMBOBOX || iType == FIELDTYPE_TEXTFIELD) { |
1227 m_pFormNotify->AfterValueChange(pField); | 1225 m_pFormNotify->AfterValueChange(pField); |
1228 } | 1226 } |
1229 } | 1227 } |
1230 if (CPDF_InterForm::m_bUpdateAP) { | 1228 if (CPDF_InterForm::m_bUpdateAP) { |
1231 pField->UpdateAP(NULL); | 1229 pField->UpdateAP(NULL); |
1232 } | 1230 } |
1233 } | 1231 } |
1234 FX_BOOL CPDF_InterForm::ImportFromFDF(const CFDF_Document* pFDF, | 1232 FX_BOOL CPDF_InterForm::ImportFromFDF(const CFDF_Document* pFDF, |
1235 FX_BOOL bNotify) { | 1233 FX_BOOL bNotify) { |
1236 if (pFDF == NULL) { | 1234 if (pFDF == NULL) { |
1237 return FALSE; | 1235 return FALSE; |
1238 } | 1236 } |
1239 CPDF_Dictionary* pMainDict = pFDF->GetRoot()->GetDict("FDF"); | 1237 CPDF_Dictionary* pMainDict = pFDF->GetRoot()->GetDict("FDF"); |
1240 if (pMainDict == NULL) { | 1238 if (pMainDict == NULL) { |
1241 return FALSE; | 1239 return FALSE; |
1242 } | 1240 } |
1243 CPDF_Array* pFields = pMainDict->GetArray("Fields"); | 1241 CPDF_Array* pFields = pMainDict->GetArray("Fields"); |
1244 if (pFields == NULL) { | 1242 if (pFields == NULL) { |
1245 return FALSE; | 1243 return FALSE; |
1246 } | 1244 } |
1247 m_bsEncoding = pMainDict->GetString("Encoding"); | 1245 m_bsEncoding = pMainDict->GetString("Encoding"); |
1248 if (bNotify && m_pFormNotify != NULL) { | 1246 if (bNotify && m_pFormNotify) { |
1249 int iRet = m_pFormNotify->BeforeFormImportData(this); | 1247 int iRet = m_pFormNotify->BeforeFormImportData(this); |
1250 if (iRet < 0) { | 1248 if (iRet < 0) { |
1251 return FALSE; | 1249 return FALSE; |
1252 } | 1250 } |
1253 } | 1251 } |
1254 for (FX_DWORD i = 0; i < pFields->GetCount(); i++) { | 1252 for (FX_DWORD i = 0; i < pFields->GetCount(); i++) { |
1255 CPDF_Dictionary* pField = pFields->GetDict(i); | 1253 CPDF_Dictionary* pField = pFields->GetDict(i); |
1256 if (pField == NULL) { | 1254 if (pField == NULL) { |
1257 continue; | 1255 continue; |
1258 } | 1256 } |
1259 FDF_ImportField(pField, L"", bNotify); | 1257 FDF_ImportField(pField, L"", bNotify); |
1260 } | 1258 } |
1261 if (bNotify && m_pFormNotify != NULL) { | 1259 if (bNotify && m_pFormNotify) { |
1262 m_pFormNotify->AfterFormImportData(this); | 1260 m_pFormNotify->AfterFormImportData(this); |
1263 } | 1261 } |
1264 return TRUE; | 1262 return TRUE; |
1265 } | 1263 } |
1266 void CPDF_InterForm::SetFormNotify(const CPDF_FormNotify* pNotify) { | 1264 void CPDF_InterForm::SetFormNotify(const CPDF_FormNotify* pNotify) { |
1267 m_pFormNotify = (CPDF_FormNotify*)pNotify; | 1265 m_pFormNotify = (CPDF_FormNotify*)pNotify; |
1268 } | 1266 } |
OLD | NEW |