| OLD | NEW |
| 1 // Copyright 2016 PDFium Authors. All rights reserved. | 1 // Copyright 2016 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 <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "core/fpdfapi/font/cpdf_font.h" | 9 #include "core/fpdfapi/font/cpdf_font.h" |
| 10 #include "core/fpdfapi/font/cpdf_fontencoding.h" | 10 #include "core/fpdfapi/font/cpdf_fontencoding.h" |
| 11 #include "core/fpdfapi/page/cpdf_page.h" | 11 #include "core/fpdfapi/page/cpdf_page.h" |
| 12 #include "core/fpdfapi/parser/cfdf_document.h" | 12 #include "core/fpdfapi/parser/cfdf_document.h" |
| 13 #include "core/fpdfapi/parser/cpdf_array.h" | 13 #include "core/fpdfapi/parser/cpdf_array.h" |
| 14 #include "core/fpdfapi/parser/cpdf_document.h" | 14 #include "core/fpdfapi/parser/cpdf_document.h" |
| 15 #include "core/fpdfapi/parser/cpdf_name.h" |
| 15 #include "core/fpdfapi/parser/cpdf_reference.h" | 16 #include "core/fpdfapi/parser/cpdf_reference.h" |
| 16 #include "core/fpdfapi/parser/cpdf_string.h" | 17 #include "core/fpdfapi/parser/cpdf_string.h" |
| 17 #include "core/fpdfdoc/cpdf_filespec.h" | 18 #include "core/fpdfdoc/cpdf_filespec.h" |
| 18 #include "core/fpdfdoc/cpdf_formcontrol.h" | 19 #include "core/fpdfdoc/cpdf_formcontrol.h" |
| 19 #include "core/fpdfdoc/cpdf_interform.h" | 20 #include "core/fpdfdoc/cpdf_interform.h" |
| 20 #include "core/fxge/cfx_substfont.h" | 21 #include "core/fxge/cfx_substfont.h" |
| 21 #include "core/fxge/fx_font.h" | 22 #include "core/fxge/fx_font.h" |
| 22 #include "third_party/base/stl_util.h" | 23 #include "third_party/base/stl_util.h" |
| 23 | 24 |
| 24 namespace { | 25 namespace { |
| (...skipping 28 matching lines...) Expand all Loading... |
| 53 CPDF_Document* pDocument, | 54 CPDF_Document* pDocument, |
| 54 const CPDF_Font* pFont, | 55 const CPDF_Font* pFont, |
| 55 CFX_ByteString& csNameTag); | 56 CFX_ByteString& csNameTag); |
| 56 | 57 |
| 57 void InitDict(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument) { | 58 void InitDict(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument) { |
| 58 if (!pDocument) | 59 if (!pDocument) |
| 59 return; | 60 return; |
| 60 | 61 |
| 61 if (!pFormDict) { | 62 if (!pFormDict) { |
| 62 pFormDict = pDocument->NewIndirect<CPDF_Dictionary>(); | 63 pFormDict = pDocument->NewIndirect<CPDF_Dictionary>(); |
| 63 pDocument->GetRoot()->SetReferenceFor("AcroForm", pDocument, | 64 pDocument->GetRoot()->SetNewFor<CPDF_Reference>("AcroForm", pDocument, |
| 64 pFormDict->GetObjNum()); | 65 pFormDict->GetObjNum()); |
| 65 } | 66 } |
| 66 | 67 |
| 67 CFX_ByteString csDA; | 68 CFX_ByteString csDA; |
| 68 if (!pFormDict->KeyExist("DR")) { | 69 if (!pFormDict->KeyExist("DR")) { |
| 69 CFX_ByteString csBaseName; | 70 CFX_ByteString csBaseName; |
| 70 CFX_ByteString csDefault; | 71 CFX_ByteString csDefault; |
| 71 uint8_t charSet = CPDF_InterForm::GetNativeCharSet(); | 72 uint8_t charSet = CPDF_InterForm::GetNativeCharSet(); |
| 72 CPDF_Font* pFont = CPDF_InterForm::AddStandardFont(pDocument, "Helvetica"); | 73 CPDF_Font* pFont = CPDF_InterForm::AddStandardFont(pDocument, "Helvetica"); |
| 73 if (pFont) { | 74 if (pFont) { |
| 74 AddFont(pFormDict, pDocument, pFont, csBaseName); | 75 AddFont(pFormDict, pDocument, pFont, csBaseName); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 87 } | 88 } |
| 88 } | 89 } |
| 89 if (pFont) | 90 if (pFont) |
| 90 csDA = "/" + PDF_NameEncode(csDefault) + " 0 Tf"; | 91 csDA = "/" + PDF_NameEncode(csDefault) + " 0 Tf"; |
| 91 } | 92 } |
| 92 if (!csDA.IsEmpty()) | 93 if (!csDA.IsEmpty()) |
| 93 csDA += " "; | 94 csDA += " "; |
| 94 | 95 |
| 95 csDA += "0 g"; | 96 csDA += "0 g"; |
| 96 if (!pFormDict->KeyExist("DA")) | 97 if (!pFormDict->KeyExist("DA")) |
| 97 pFormDict->SetStringFor("DA", csDA); | 98 pFormDict->SetNewFor<CPDF_String>("DA", csDA, false); |
| 98 } | 99 } |
| 99 | 100 |
| 100 CPDF_Font* GetFont(CPDF_Dictionary* pFormDict, | 101 CPDF_Font* GetFont(CPDF_Dictionary* pFormDict, |
| 101 CPDF_Document* pDocument, | 102 CPDF_Document* pDocument, |
| 102 CFX_ByteString csNameTag) { | 103 CFX_ByteString csNameTag) { |
| 103 CFX_ByteString csAlias = PDF_NameDecode(csNameTag); | 104 CFX_ByteString csAlias = PDF_NameDecode(csNameTag); |
| 104 if (!pFormDict || csAlias.IsEmpty()) | 105 if (!pFormDict || csAlias.IsEmpty()) |
| 105 return nullptr; | 106 return nullptr; |
| 106 | 107 |
| 107 CPDF_Dictionary* pDR = pFormDict->GetDictFor("DR"); | 108 CPDF_Dictionary* pDR = pFormDict->GetDictFor("DR"); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 131 CPDF_Dictionary* pDR = pFormDict->GetDictFor("DR"); | 132 CPDF_Dictionary* pDR = pFormDict->GetDictFor("DR"); |
| 132 if (!pDR) | 133 if (!pDR) |
| 133 return nullptr; | 134 return nullptr; |
| 134 | 135 |
| 135 CPDF_Dictionary* pFonts = pDR->GetDictFor("Font"); | 136 CPDF_Dictionary* pFonts = pDR->GetDictFor("Font"); |
| 136 if (!pFonts) | 137 if (!pFonts) |
| 137 return nullptr; | 138 return nullptr; |
| 138 | 139 |
| 139 for (const auto& it : *pFonts) { | 140 for (const auto& it : *pFonts) { |
| 140 const CFX_ByteString& csKey = it.first; | 141 const CFX_ByteString& csKey = it.first; |
| 141 CPDF_Object* pObj = it.second; | 142 if (!it.second) |
| 142 if (!pObj) | |
| 143 continue; | 143 continue; |
| 144 | 144 |
| 145 CPDF_Dictionary* pElement = ToDictionary(pObj->GetDirect()); | 145 CPDF_Dictionary* pElement = ToDictionary(it.second->GetDirect()); |
| 146 if (!pElement) | 146 if (!pElement) |
| 147 continue; | 147 continue; |
| 148 if (pElement->GetStringFor("Type") != "Font") | 148 if (pElement->GetStringFor("Type") != "Font") |
| 149 continue; | 149 continue; |
| 150 CPDF_Font* pFind = pDocument->LoadFont(pElement); | 150 CPDF_Font* pFind = pDocument->LoadFont(pElement); |
| 151 if (!pFind) | 151 if (!pFind) |
| 152 continue; | 152 continue; |
| 153 | 153 |
| 154 CFX_SubstFont* pSubst = pFind->GetSubstFont(); | 154 CFX_SubstFont* pSubst = pFind->GetSubstFont(); |
| 155 if (!pSubst) | 155 if (!pSubst) |
| (...skipping 16 matching lines...) Expand all Loading... |
| 172 CPDF_Dictionary* pDR = pFormDict->GetDictFor("DR"); | 172 CPDF_Dictionary* pDR = pFormDict->GetDictFor("DR"); |
| 173 if (!pDR) | 173 if (!pDR) |
| 174 return false; | 174 return false; |
| 175 | 175 |
| 176 CPDF_Dictionary* pFonts = pDR->GetDictFor("Font"); | 176 CPDF_Dictionary* pFonts = pDR->GetDictFor("Font"); |
| 177 if (!pFonts) | 177 if (!pFonts) |
| 178 return false; | 178 return false; |
| 179 | 179 |
| 180 for (const auto& it : *pFonts) { | 180 for (const auto& it : *pFonts) { |
| 181 const CFX_ByteString& csKey = it.first; | 181 const CFX_ByteString& csKey = it.first; |
| 182 CPDF_Object* pObj = it.second; | 182 if (!it.second) |
| 183 if (!pObj) | |
| 184 continue; | 183 continue; |
| 185 | 184 CPDF_Dictionary* pElement = ToDictionary(it.second->GetDirect()); |
| 186 CPDF_Dictionary* pElement = ToDictionary(pObj->GetDirect()); | |
| 187 if (!pElement) | 185 if (!pElement) |
| 188 continue; | 186 continue; |
| 189 if (pElement->GetStringFor("Type") != "Font") | 187 if (pElement->GetStringFor("Type") != "Font") |
| 190 continue; | 188 continue; |
| 191 if (pFont->GetFontDict() == pElement) { | 189 if (pFont->GetFontDict() == pElement) { |
| 192 csNameTag = csKey; | 190 csNameTag = csKey; |
| 193 return true; | 191 return true; |
| 194 } | 192 } |
| 195 } | 193 } |
| 196 return false; | 194 return false; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 209 return false; | 207 return false; |
| 210 | 208 |
| 211 CPDF_Dictionary* pFonts = pDR->GetDictFor("Font"); | 209 CPDF_Dictionary* pFonts = pDR->GetDictFor("Font"); |
| 212 if (!pFonts) | 210 if (!pFonts) |
| 213 return false; | 211 return false; |
| 214 if (csFontName.GetLength() > 0) | 212 if (csFontName.GetLength() > 0) |
| 215 csFontName.Remove(' '); | 213 csFontName.Remove(' '); |
| 216 | 214 |
| 217 for (const auto& it : *pFonts) { | 215 for (const auto& it : *pFonts) { |
| 218 const CFX_ByteString& csKey = it.first; | 216 const CFX_ByteString& csKey = it.first; |
| 219 CPDF_Object* pObj = it.second; | 217 if (!it.second) |
| 220 if (!pObj) | |
| 221 continue; | 218 continue; |
| 222 | 219 |
| 223 CPDF_Dictionary* pElement = ToDictionary(pObj->GetDirect()); | 220 CPDF_Dictionary* pElement = ToDictionary(it.second->GetDirect()); |
| 224 if (!pElement) | 221 if (!pElement) |
| 225 continue; | 222 continue; |
| 226 if (pElement->GetStringFor("Type") != "Font") | 223 if (pElement->GetStringFor("Type") != "Font") |
| 227 continue; | 224 continue; |
| 228 | |
| 229 pFont = pDocument->LoadFont(pElement); | 225 pFont = pDocument->LoadFont(pElement); |
| 230 if (!pFont) | 226 if (!pFont) |
| 231 continue; | 227 continue; |
| 232 | 228 |
| 233 CFX_ByteString csBaseFont; | 229 CFX_ByteString csBaseFont; |
| 234 csBaseFont = pFont->GetBaseFont(); | 230 csBaseFont = pFont->GetBaseFont(); |
| 235 csBaseFont.Remove(' '); | 231 csBaseFont.Remove(' '); |
| 236 if (csBaseFont == csFontName) { | 232 if (csBaseFont == csFontName) { |
| 237 csNameTag = csKey; | 233 csNameTag = csKey; |
| 238 return true; | 234 return true; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 252 | 248 |
| 253 CFX_ByteString csTag; | 249 CFX_ByteString csTag; |
| 254 if (FindFont(pFormDict, pFont, csTag)) { | 250 if (FindFont(pFormDict, pFont, csTag)) { |
| 255 csNameTag = csTag; | 251 csNameTag = csTag; |
| 256 return; | 252 return; |
| 257 } | 253 } |
| 258 if (!pFormDict) | 254 if (!pFormDict) |
| 259 InitDict(pFormDict, pDocument); | 255 InitDict(pFormDict, pDocument); |
| 260 | 256 |
| 261 CPDF_Dictionary* pDR = pFormDict->GetDictFor("DR"); | 257 CPDF_Dictionary* pDR = pFormDict->GetDictFor("DR"); |
| 262 if (!pDR) { | 258 if (!pDR) |
| 263 pDR = new CPDF_Dictionary(pDocument->GetByteStringPool()); | 259 pDR = pFormDict->SetNewFor<CPDF_Dictionary>("DR"); |
| 264 pFormDict->SetFor("DR", pDR); | 260 |
| 265 } | |
| 266 CPDF_Dictionary* pFonts = pDR->GetDictFor("Font"); | 261 CPDF_Dictionary* pFonts = pDR->GetDictFor("Font"); |
| 267 if (!pFonts) { | 262 if (!pFonts) |
| 268 pFonts = new CPDF_Dictionary(pDocument->GetByteStringPool()); | 263 pFonts = pDR->SetNewFor<CPDF_Dictionary>("Font"); |
| 269 pDR->SetFor("Font", pFonts); | 264 |
| 270 } | |
| 271 if (csNameTag.IsEmpty()) | 265 if (csNameTag.IsEmpty()) |
| 272 csNameTag = pFont->GetBaseFont(); | 266 csNameTag = pFont->GetBaseFont(); |
| 273 | 267 |
| 274 csNameTag.Remove(' '); | 268 csNameTag.Remove(' '); |
| 275 csNameTag = CPDF_InterForm::GenerateNewResourceName(pDR, "Font", 4, | 269 csNameTag = CPDF_InterForm::GenerateNewResourceName(pDR, "Font", 4, |
| 276 csNameTag.c_str()); | 270 csNameTag.c_str()); |
| 277 pFonts->SetReferenceFor(csNameTag, pDocument, | 271 pFonts->SetNewFor<CPDF_Reference>(csNameTag, pDocument, |
| 278 pFont->GetFontDict()->GetObjNum()); | 272 pFont->GetFontDict()->GetObjNum()); |
| 279 } | 273 } |
| 280 | 274 |
| 281 CPDF_Font* AddNativeFont(CPDF_Dictionary*& pFormDict, | 275 CPDF_Font* AddNativeFont(CPDF_Dictionary*& pFormDict, |
| 282 CPDF_Document* pDocument, | 276 CPDF_Document* pDocument, |
| 283 uint8_t charSet, | 277 uint8_t charSet, |
| 284 CFX_ByteString& csNameTag) { | 278 CFX_ByteString& csNameTag) { |
| 285 if (!pFormDict) | 279 if (!pFormDict) |
| 286 InitDict(pFormDict, pDocument); | 280 InitDict(pFormDict, pDocument); |
| 287 | 281 |
| 288 CFX_ByteString csTemp; | 282 CFX_ByteString csTemp; |
| (...skipping 809 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1098 pFieldDict->GetStringFor("Subtype") == "Widget") { | 1092 pFieldDict->GetStringFor("Subtype") == "Widget") { |
| 1099 pParent = pFieldDict->GetDictFor("Parent"); | 1093 pParent = pFieldDict->GetDictFor("Parent"); |
| 1100 if (!pParent) | 1094 if (!pParent) |
| 1101 pParent = pFieldDict; | 1095 pParent = pFieldDict; |
| 1102 } | 1096 } |
| 1103 | 1097 |
| 1104 if (pParent && pParent != pFieldDict && !pParent->KeyExist("FT")) { | 1098 if (pParent && pParent != pFieldDict && !pParent->KeyExist("FT")) { |
| 1105 if (pFieldDict->KeyExist("FT")) { | 1099 if (pFieldDict->KeyExist("FT")) { |
| 1106 CPDF_Object* pFTValue = pFieldDict->GetDirectObjectFor("FT"); | 1100 CPDF_Object* pFTValue = pFieldDict->GetDirectObjectFor("FT"); |
| 1107 if (pFTValue) | 1101 if (pFTValue) |
| 1108 pParent->SetFor("FT", pFTValue->Clone().release()); | 1102 pParent->SetFor("FT", pFTValue->Clone()); |
| 1109 } | 1103 } |
| 1110 | 1104 |
| 1111 if (pFieldDict->KeyExist("Ff")) { | 1105 if (pFieldDict->KeyExist("Ff")) { |
| 1112 CPDF_Object* pFfValue = pFieldDict->GetDirectObjectFor("Ff"); | 1106 CPDF_Object* pFfValue = pFieldDict->GetDirectObjectFor("Ff"); |
| 1113 if (pFfValue) | 1107 if (pFfValue) |
| 1114 pParent->SetFor("Ff", pFfValue->Clone().release()); | 1108 pParent->SetFor("Ff", pFfValue->Clone()); |
| 1115 } | 1109 } |
| 1116 } | 1110 } |
| 1117 | 1111 |
| 1118 pField = new CPDF_FormField(this, pParent); | 1112 pField = new CPDF_FormField(this, pParent); |
| 1119 CPDF_Object* pTObj = pDict->GetObjectFor("T"); | 1113 CPDF_Object* pTObj = pDict->GetObjectFor("T"); |
| 1120 if (ToReference(pTObj)) { | 1114 if (ToReference(pTObj)) { |
| 1121 std::unique_ptr<CPDF_Object> pClone = pTObj->CloneDirectObject(); | 1115 std::unique_ptr<CPDF_Object> pClone = pTObj->CloneDirectObject(); |
| 1122 if (pClone) | 1116 if (pClone) |
| 1123 pDict->SetFor("T", pClone.release()); | 1117 pDict->SetFor("T", std::move(pClone)); |
| 1124 else | 1118 else |
| 1125 pDict->SetNameFor("T", ""); | 1119 pDict->SetNewFor<CPDF_Name>("T", ""); |
| 1126 } | 1120 } |
| 1127 m_pFieldTree->SetField(csWName, pField); | 1121 m_pFieldTree->SetField(csWName, pField); |
| 1128 } | 1122 } |
| 1129 | 1123 |
| 1130 CPDF_Array* pKids = pFieldDict->GetArrayFor("Kids"); | 1124 CPDF_Array* pKids = pFieldDict->GetArrayFor("Kids"); |
| 1131 if (pKids) { | 1125 if (pKids) { |
| 1132 for (size_t i = 0; i < pKids->GetCount(); i++) { | 1126 for (size_t i = 0; i < pKids->GetCount(); i++) { |
| 1133 CPDF_Dictionary* pKid = pKids->GetDictAt(i); | 1127 CPDF_Dictionary* pKid = pKids->GetDictAt(i); |
| 1134 if (!pKid) | 1128 if (!pKid) |
| 1135 continue; | 1129 continue; |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1203 bool bIncludeOrExclude, | 1197 bool bIncludeOrExclude, |
| 1204 bool bSimpleFileSpec) const { | 1198 bool bSimpleFileSpec) const { |
| 1205 CFDF_Document* pDoc = CFDF_Document::CreateNewDoc(); | 1199 CFDF_Document* pDoc = CFDF_Document::CreateNewDoc(); |
| 1206 if (!pDoc) | 1200 if (!pDoc) |
| 1207 return nullptr; | 1201 return nullptr; |
| 1208 | 1202 |
| 1209 CPDF_Dictionary* pMainDict = pDoc->GetRoot()->GetDictFor("FDF"); | 1203 CPDF_Dictionary* pMainDict = pDoc->GetRoot()->GetDictFor("FDF"); |
| 1210 if (!pdf_path.IsEmpty()) { | 1204 if (!pdf_path.IsEmpty()) { |
| 1211 if (bSimpleFileSpec) { | 1205 if (bSimpleFileSpec) { |
| 1212 CFX_WideString wsFilePath = CPDF_FileSpec::EncodeFileName(pdf_path); | 1206 CFX_WideString wsFilePath = CPDF_FileSpec::EncodeFileName(pdf_path); |
| 1213 pMainDict->SetStringFor("F", CFX_ByteString::FromUnicode(wsFilePath)); | 1207 pMainDict->SetNewFor<CPDF_String>( |
| 1214 pMainDict->SetStringFor("UF", PDF_EncodeText(wsFilePath)); | 1208 "F", CFX_ByteString::FromUnicode(wsFilePath), false); |
| 1209 pMainDict->SetNewFor<CPDF_String>("UF", PDF_EncodeText(wsFilePath), |
| 1210 false); |
| 1215 } else { | 1211 } else { |
| 1216 CPDF_FileSpec filespec(pDoc->GetByteStringPool()); | 1212 CPDF_FileSpec filespec(pDoc->GetByteStringPool()); |
| 1217 filespec.SetFileName(pdf_path); | 1213 filespec.SetFileName(pdf_path); |
| 1218 pMainDict->SetFor("F", filespec.GetObj()); | 1214 pMainDict->SetFor("F", pdfium::WrapUnique(filespec.GetObj())); |
| 1219 } | 1215 } |
| 1220 } | 1216 } |
| 1221 | 1217 |
| 1222 CPDF_Array* pFields = new CPDF_Array; | 1218 CPDF_Array* pFields = pMainDict->SetNewFor<CPDF_Array>("Fields"); |
| 1223 pMainDict->SetFor("Fields", pFields); | |
| 1224 size_t nCount = m_pFieldTree->m_Root.CountFields(); | 1219 size_t nCount = m_pFieldTree->m_Root.CountFields(); |
| 1225 for (size_t i = 0; i < nCount; ++i) { | 1220 for (size_t i = 0; i < nCount; ++i) { |
| 1226 CPDF_FormField* pField = m_pFieldTree->m_Root.GetFieldAtIndex(i); | 1221 CPDF_FormField* pField = m_pFieldTree->m_Root.GetFieldAtIndex(i); |
| 1227 if (!pField || pField->GetType() == CPDF_FormField::PushButton) | 1222 if (!pField || pField->GetType() == CPDF_FormField::PushButton) |
| 1228 continue; | 1223 continue; |
| 1229 | 1224 |
| 1230 uint32_t dwFlags = pField->GetFieldFlags(); | 1225 uint32_t dwFlags = pField->GetFieldFlags(); |
| 1231 if (dwFlags & 0x04) | 1226 if (dwFlags & 0x04) |
| 1232 continue; | 1227 continue; |
| 1233 | 1228 |
| 1234 if (bIncludeOrExclude == pdfium::ContainsValue(fields, pField)) { | 1229 if (bIncludeOrExclude == pdfium::ContainsValue(fields, pField)) { |
| 1235 if ((dwFlags & 0x02) != 0 && pField->m_pDict->GetStringFor("V").IsEmpty()) | 1230 if ((dwFlags & 0x02) != 0 && pField->m_pDict->GetStringFor("V").IsEmpty()) |
| 1236 continue; | 1231 continue; |
| 1237 | 1232 |
| 1238 CFX_WideString fullname = FPDF_GetFullName(pField->GetFieldDict()); | 1233 CFX_WideString fullname = FPDF_GetFullName(pField->GetFieldDict()); |
| 1239 auto pFieldDict = | 1234 auto pFieldDict = |
| 1240 pdfium::MakeUnique<CPDF_Dictionary>(pDoc->GetByteStringPool()); | 1235 pdfium::MakeUnique<CPDF_Dictionary>(pDoc->GetByteStringPool()); |
| 1241 pFieldDict->SetFor("T", new CPDF_String(fullname)); | 1236 pFieldDict->SetNewFor<CPDF_String>("T", fullname); |
| 1242 if (pField->GetType() == CPDF_FormField::CheckBox || | 1237 if (pField->GetType() == CPDF_FormField::CheckBox || |
| 1243 pField->GetType() == CPDF_FormField::RadioButton) { | 1238 pField->GetType() == CPDF_FormField::RadioButton) { |
| 1244 CFX_WideString csExport = pField->GetCheckValue(false); | 1239 CFX_WideString csExport = pField->GetCheckValue(false); |
| 1245 CFX_ByteString csBExport = PDF_EncodeText(csExport); | 1240 CFX_ByteString csBExport = PDF_EncodeText(csExport); |
| 1246 CPDF_Object* pOpt = FPDF_GetFieldAttr(pField->m_pDict, "Opt"); | 1241 CPDF_Object* pOpt = FPDF_GetFieldAttr(pField->m_pDict, "Opt"); |
| 1247 if (pOpt) | 1242 if (pOpt) |
| 1248 pFieldDict->SetStringFor("V", csBExport); | 1243 pFieldDict->SetNewFor<CPDF_String>("V", csBExport, false); |
| 1249 else | 1244 else |
| 1250 pFieldDict->SetNameFor("V", csBExport); | 1245 pFieldDict->SetNewFor<CPDF_Name>("V", csBExport); |
| 1251 } else { | 1246 } else { |
| 1252 CPDF_Object* pV = FPDF_GetFieldAttr(pField->m_pDict, "V"); | 1247 CPDF_Object* pV = FPDF_GetFieldAttr(pField->m_pDict, "V"); |
| 1253 if (pV) | 1248 if (pV) |
| 1254 pFieldDict->SetFor("V", pV->CloneDirectObject().release()); | 1249 pFieldDict->SetFor("V", pV->CloneDirectObject()); |
| 1255 } | 1250 } |
| 1256 pFields->Add(std::move(pFieldDict)); | 1251 pFields->Add(std::move(pFieldDict)); |
| 1257 } | 1252 } |
| 1258 } | 1253 } |
| 1259 return pDoc; | 1254 return pDoc; |
| 1260 } | 1255 } |
| 1261 | 1256 |
| 1262 void CPDF_InterForm::FDF_ImportField(CPDF_Dictionary* pFieldDict, | 1257 void CPDF_InterForm::FDF_ImportField(CPDF_Dictionary* pFieldDict, |
| 1263 const CFX_WideString& parent_name, | 1258 const CFX_WideString& parent_name, |
| 1264 bool bNotify, | 1259 bool bNotify, |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1282 if (!pFieldDict->KeyExist("V")) | 1277 if (!pFieldDict->KeyExist("V")) |
| 1283 return; | 1278 return; |
| 1284 | 1279 |
| 1285 CPDF_FormField* pField = m_pFieldTree->GetField(name); | 1280 CPDF_FormField* pField = m_pFieldTree->GetField(name); |
| 1286 if (!pField) | 1281 if (!pField) |
| 1287 return; | 1282 return; |
| 1288 | 1283 |
| 1289 CFX_WideString csWValue = GetFieldValue(*pFieldDict, m_bsEncoding); | 1284 CFX_WideString csWValue = GetFieldValue(*pFieldDict, m_bsEncoding); |
| 1290 int iType = pField->GetFieldType(); | 1285 int iType = pField->GetFieldType(); |
| 1291 if (bNotify && m_pFormNotify) { | 1286 if (bNotify && m_pFormNotify) { |
| 1292 int iRet = 0; | 1287 if (iType == FIELDTYPE_LISTBOX) { |
| 1293 if (iType == FIELDTYPE_LISTBOX) | 1288 if (m_pFormNotify->BeforeSelectionChange(pField, csWValue) < 0) |
| 1294 iRet = m_pFormNotify->BeforeSelectionChange(pField, csWValue); | 1289 return; |
| 1295 else if (iType == FIELDTYPE_COMBOBOX || iType == FIELDTYPE_TEXTFIELD) | 1290 } else if (iType == FIELDTYPE_COMBOBOX || iType == FIELDTYPE_TEXTFIELD) { |
| 1296 iRet = m_pFormNotify->BeforeValueChange(pField, csWValue); | 1291 if (m_pFormNotify->BeforeValueChange(pField, csWValue) < 0) |
| 1297 | 1292 return; |
| 1298 if (iRet < 0) | 1293 } |
| 1299 return; | |
| 1300 } | 1294 } |
| 1301 | |
| 1302 pField->SetValue(csWValue); | 1295 pField->SetValue(csWValue); |
| 1303 CPDF_FormField::Type eType = pField->GetType(); | 1296 CPDF_FormField::Type eType = pField->GetType(); |
| 1304 if ((eType == CPDF_FormField::ListBox || eType == CPDF_FormField::ComboBox) && | 1297 if ((eType == CPDF_FormField::ListBox || eType == CPDF_FormField::ComboBox) && |
| 1305 pFieldDict->KeyExist("Opt")) { | 1298 pFieldDict->KeyExist("Opt")) { |
| 1306 pField->m_pDict->SetFor( | 1299 pField->m_pDict->SetFor( |
| 1307 "Opt", | 1300 "Opt", pFieldDict->GetDirectObjectFor("Opt")->CloneDirectObject()); |
| 1308 pFieldDict->GetDirectObjectFor("Opt")->CloneDirectObject().release()); | |
| 1309 } | 1301 } |
| 1310 | 1302 |
| 1311 if (bNotify && m_pFormNotify) { | 1303 if (bNotify && m_pFormNotify) { |
| 1312 if (iType == FIELDTYPE_CHECKBOX || iType == FIELDTYPE_RADIOBUTTON) | 1304 if (iType == FIELDTYPE_CHECKBOX || iType == FIELDTYPE_RADIOBUTTON) |
| 1313 m_pFormNotify->AfterCheckedStatusChange(pField); | 1305 m_pFormNotify->AfterCheckedStatusChange(pField); |
| 1314 else if (iType == FIELDTYPE_LISTBOX) | 1306 else if (iType == FIELDTYPE_LISTBOX) |
| 1315 m_pFormNotify->AfterSelectionChange(pField); | 1307 m_pFormNotify->AfterSelectionChange(pField); |
| 1316 else if (iType == FIELDTYPE_COMBOBOX || iType == FIELDTYPE_TEXTFIELD) | 1308 else if (iType == FIELDTYPE_COMBOBOX || iType == FIELDTYPE_TEXTFIELD) |
| 1317 m_pFormNotify->AfterValueChange(pField); | 1309 m_pFormNotify->AfterValueChange(pField); |
| 1318 } | 1310 } |
| 1319 } | 1311 } |
| 1320 | 1312 |
| 1321 void CPDF_InterForm::SetFormNotify(IPDF_FormNotify* pNotify) { | 1313 void CPDF_InterForm::SetFormNotify(IPDF_FormNotify* pNotify) { |
| 1322 m_pFormNotify = pNotify; | 1314 m_pFormNotify = pNotify; |
| 1323 } | 1315 } |
| OLD | NEW |