| 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 "../../include/fpdfdoc/fpdf_doc.h" | 7 #include "../../include/fpdfdoc/fpdf_doc.h" |
| 8 #include "../../include/fpdfdoc/fpdf_vt.h" | 8 #include "../../include/fpdfdoc/fpdf_vt.h" |
| 9 #include "pdf_vt.h" | 9 #include "pdf_vt.h" |
| 10 #include "../../include/fpdfdoc/fpdf_ap.h" | 10 #include "../../include/fpdfdoc/fpdf_ap.h" |
| 11 FX_BOOL FPDF_GenerateAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict) | 11 FX_BOOL FPDF_GenerateAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict) |
| 12 { | 12 { |
| 13 if (pAnnotDict->GetConstString("Subtype") != FX_BSTRC("Widget")) { | 13 if (!pAnnotDict || pAnnotDict->GetConstString("Subtype") != FX_BSTRC("Widget
")) { |
| 14 return FALSE; | 14 return FALSE; |
| 15 } | 15 } |
| 16 CFX_ByteString field_type = FPDF_GetFieldAttr(pAnnotDict, "FT")->GetString()
; | 16 CFX_ByteString field_type = FPDF_GetFieldAttr(pAnnotDict, "FT")->GetString()
; |
| 17 FX_DWORD flags = FPDF_GetFieldAttr(pAnnotDict, "Ff")->GetInteger(); | 17 FX_DWORD flags = FPDF_GetFieldAttr(pAnnotDict, "Ff")? FPDF_GetFieldAttr(pAnn
otDict, "Ff")->GetInteger() : 0; |
| 18 if (field_type == "Tx") { | 18 if (field_type == "Tx") { |
| 19 return CPVT_GenerateAP::GenerateTextFieldAP(pDoc, pAnnotDict); | 19 return CPVT_GenerateAP::GenerateTextFieldAP(pDoc, pAnnotDict); |
| 20 } else if (field_type == "Ch") { | 20 } else if (field_type == "Ch") { |
| 21 if (flags & (1 << 17)) { | 21 if (flags & (1 << 17)) { |
| 22 return CPVT_GenerateAP::GenerateComboBoxAP(pDoc, pAnnotDict); | 22 return CPVT_GenerateAP::GenerateComboBoxAP(pDoc, pAnnotDict); |
| 23 } else { | 23 } else { |
| 24 return CPVT_GenerateAP::GenerateListBoxAP(pDoc, pAnnotDict); | 24 return CPVT_GenerateAP::GenerateListBoxAP(pDoc, pAnnotDict); |
| 25 } | 25 } |
| 26 } else if (field_type == "Btn") { | 26 } else if (field_type == "Btn") { |
| 27 if (!(flags & (1 << 16))) { | 27 if (!(flags & (1 << 16))) { |
| (...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 246 } | 246 } |
| 247 static FX_BOOL GenerateWidgetAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict
, const FX_INT32 & nWidgetType) | 247 static FX_BOOL GenerateWidgetAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict
, const FX_INT32 & nWidgetType) |
| 248 { | 248 { |
| 249 CPDF_Dictionary* pFormDict = NULL; | 249 CPDF_Dictionary* pFormDict = NULL; |
| 250 if (CPDF_Dictionary * pRootDict = pDoc->GetRoot()) { | 250 if (CPDF_Dictionary * pRootDict = pDoc->GetRoot()) { |
| 251 pFormDict = pRootDict->GetDict("AcroForm"); | 251 pFormDict = pRootDict->GetDict("AcroForm"); |
| 252 } | 252 } |
| 253 if (!pFormDict) { | 253 if (!pFormDict) { |
| 254 return FALSE; | 254 return FALSE; |
| 255 } | 255 } |
| 256 CFX_ByteString DA = FPDF_GetFieldAttr(pAnnotDict, "DA")->GetString(); | 256 CFX_ByteString DA = FPDF_GetFieldAttr(pAnnotDict, "DA") ? FPDF_GetFieldAttr(
pAnnotDict, "DA")->GetString() : CFX_ByteString(); |
| 257 if (DA.IsEmpty()) { | 257 if (DA.IsEmpty()) { |
| 258 DA = pFormDict->GetString("DA"); | 258 DA = pFormDict->GetString("DA"); |
| 259 } | 259 } |
| 260 if (DA.IsEmpty()) { | 260 if (DA.IsEmpty()) { |
| 261 return FALSE; | 261 return FALSE; |
| 262 } | 262 } |
| 263 CPDF_SimpleParser syntax(DA); | 263 CPDF_SimpleParser syntax(DA); |
| 264 syntax.FindTagParam("Tf", 2); | 264 syntax.FindTagParam("Tf", 2); |
| 265 CFX_ByteString sFontName = syntax.GetWord(); | 265 CFX_ByteString sFontName = syntax.GetWord(); |
| 266 sFontName = PDF_NameDecode(sFontName); | 266 sFontName = PDF_NameDecode(sFontName); |
| 267 if (sFontName.IsEmpty()) { | 267 if (sFontName.IsEmpty()) { |
| 268 return FALSE; | 268 return FALSE; |
| 269 } | 269 } |
| 270 FX_FLOAT fFontSize = FX_atof(syntax.GetWord()); | 270 FX_FLOAT fFontSize = FX_atof(syntax.GetWord()); |
| 271 CPVT_Color crText = ParseColor(DA); | 271 CPVT_Color crText = ParseColor(DA); |
| 272 FX_BOOL bUseFormRes = FALSE; | 272 FX_BOOL bUseFormRes = FALSE; |
| 273 CPDF_Dictionary * pFontDict = NULL; | 273 CPDF_Dictionary * pFontDict = NULL; |
| 274 CPDF_Dictionary* pDRDict = pAnnotDict->GetDict(FX_BSTRC("DR")); | 274 CPDF_Dictionary* pDRDict = pAnnotDict->GetDict(FX_BSTRC("DR")); |
| 275 if (pDRDict == NULL) { | 275 if (pDRDict == NULL) { |
| 276 pDRDict = pFormDict->GetDict(FX_BSTRC("DR")); | 276 pDRDict = pFormDict->GetDict(FX_BSTRC("DR")); |
| 277 bUseFormRes = TRUE; | 277 bUseFormRes = TRUE; |
| 278 } | 278 } |
| 279 CPDF_Dictionary * pDRFontDict = NULL; | 279 CPDF_Dictionary * pDRFontDict = NULL; |
| 280 if ((pDRFontDict = pDRDict->GetDict("Font"))) { | 280 if (pDRDict && (pDRFontDict = pDRDict->GetDict("Font"))) { |
| 281 pFontDict = pDRFontDict->GetDict(sFontName.Mid(1)); | 281 pFontDict = pDRFontDict->GetDict(sFontName.Mid(1)); |
| 282 if (!pFontDict && !bUseFormRes) { | 282 if (!pFontDict && !bUseFormRes) { |
| 283 pDRDict = pFormDict->GetDict(FX_BSTRC("DR")); | 283 pDRDict = pFormDict->GetDict(FX_BSTRC("DR")); |
| 284 pDRFontDict = pDRDict->GetDict("Font"); | 284 pDRFontDict = pDRDict->GetDict("Font"); |
| 285 if (pDRFontDict) { | 285 if (pDRFontDict) { |
| 286 pFontDict = pDRFontDict->GetDict(sFontName.Mid(1)); | 286 pFontDict = pDRFontDict->GetDict(sFontName.Mid(1)); |
| 287 } | 287 } |
| 288 } | 288 } |
| 289 } | 289 } |
| 290 if (!pDRFontDict) { | 290 if (!pDRFontDict) { |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 423 if (!pStreamResFontList->KeyExist(sFontName)) { | 423 if (!pStreamResFontList->KeyExist(sFontName)) { |
| 424 pStreamResFontList->SetAtReference(sFontName, pDoc, pFontDict); | 424 pStreamResFontList->SetAtReference(sFontName, pDoc, pFontDict); |
| 425 } | 425 } |
| 426 } else { | 426 } else { |
| 427 pStreamDict->SetAt("Resources", pFormDict->GetDict("DR")->Clone()); | 427 pStreamDict->SetAt("Resources", pFormDict->GetDict("DR")->Clone()); |
| 428 pStreamResList = pStreamDict->GetDict("Resources"); | 428 pStreamResList = pStreamDict->GetDict("Resources"); |
| 429 } | 429 } |
| 430 } | 430 } |
| 431 switch (nWidgetType) { | 431 switch (nWidgetType) { |
| 432 case 0: { | 432 case 0: { |
| 433 CFX_WideString swValue = FPDF_GetFieldAttr(pAnnotDict, "V")->Get
UnicodeText(); | 433 CFX_WideString swValue = FPDF_GetFieldAttr(pAnnotDict, "V")? FPD
F_GetFieldAttr(pAnnotDict, "V")->GetUnicodeText() : CFX_WideString(); |
| 434 FX_INT32 nAlign = FPDF_GetFieldAttr(pAnnotDict, "Q")->GetInteger
(); | 434 FX_INT32 nAlign = FPDF_GetFieldAttr(pAnnotDict, "Q")? FPDF_GetFi
eldAttr(pAnnotDict, "Q")->GetInteger() : 0; |
| 435 FX_DWORD dwFlags = FPDF_GetFieldAttr(pAnnotDict, "Ff")->GetInteg
er(); | 435 FX_DWORD dwFlags = FPDF_GetFieldAttr(pAnnotDict, "Ff")? FPDF_Get
FieldAttr(pAnnotDict, "Ff")->GetInteger() : 0; |
| 436 FX_DWORD dwMaxLen = FPDF_GetFieldAttr(pAnnotDict, "MaxLen")->Get
Integer(); | 436 FX_DWORD dwMaxLen = FPDF_GetFieldAttr(pAnnotDict, "MaxLen") ? FP
DF_GetFieldAttr(pAnnotDict, "MaxLen")->GetInteger() : 0; |
| 437 CPVT_FontMap map(pDoc, pStreamDict->GetDict("Resources"), pDefFo
nt, sFontName.Right(sFontName.GetLength() - 1)); | 437 CPVT_FontMap map(pDoc, pStreamDict ? pStreamDict->GetDict("Resou
rces") : NULL , pDefFont, sFontName.Right(sFontName.GetLength() - 1)); |
| 438 CPVT_Provider prd(&map); | 438 CPVT_Provider prd(&map); |
| 439 CPDF_VariableText vt; | 439 CPDF_VariableText vt; |
| 440 vt.SetProvider(&prd); | 440 vt.SetProvider(&prd); |
| 441 vt.SetPlateRect(rcBody); | 441 vt.SetPlateRect(rcBody); |
| 442 vt.SetAlignment(nAlign); | 442 vt.SetAlignment(nAlign); |
| 443 if (IsFloatZero(fFontSize)) { | 443 if (IsFloatZero(fFontSize)) { |
| 444 vt.SetAutoFontSize(TRUE); | 444 vt.SetAutoFontSize(TRUE); |
| 445 } else { | 445 } else { |
| 446 vt.SetFontSize(fFontSize); | 446 vt.SetFontSize(fFontSize); |
| 447 } | 447 } |
| (...skipping 27 matching lines...) Expand all Loading... |
| 475 if (rcContent.Width() > rcBody.Width() || | 475 if (rcContent.Width() > rcBody.Width() || |
| 476 rcContent.Height() > rcBody.Height()) { | 476 rcContent.Height() > rcBody.Height()) { |
| 477 sAppStream << rcBody.left << " " << rcBody.bottom << " " | 477 sAppStream << rcBody.left << " " << rcBody.bottom << " " |
| 478 << rcBody.Width() << " " << rcBody.Height() <
< " re\nW\nn\n"; | 478 << rcBody.Width() << " " << rcBody.Height() <
< " re\nW\nn\n"; |
| 479 } | 479 } |
| 480 sAppStream << "BT\n" << CPVT_GenerateAP::GenerateColorAP(crT
ext, TRUE) << sBody << "ET\n" << "Q\nEMC\n"; | 480 sAppStream << "BT\n" << CPVT_GenerateAP::GenerateColorAP(crT
ext, TRUE) << sBody << "ET\n" << "Q\nEMC\n"; |
| 481 } | 481 } |
| 482 } | 482 } |
| 483 break; | 483 break; |
| 484 case 1: { | 484 case 1: { |
| 485 CFX_WideString swValue = FPDF_GetFieldAttr(pAnnotDict, "V")->Get
UnicodeText(); | 485 CFX_WideString swValue = FPDF_GetFieldAttr(pAnnotDict, "V") ? FP
DF_GetFieldAttr(pAnnotDict, "V")->GetUnicodeText() : CFX_WideString(); |
| 486 CPVT_FontMap map(pDoc, pStreamDict->GetDict("Resources"), pDefFo
nt, sFontName.Right(sFontName.GetLength() - 1)); | 486 CPVT_FontMap map(pDoc, pStreamDict ? pStreamDict->GetDict("Resou
rces"):NULL, pDefFont, sFontName.Right(sFontName.GetLength() - 1)); |
| 487 CPVT_Provider prd(&map); | 487 CPVT_Provider prd(&map); |
| 488 CPDF_VariableText vt; | 488 CPDF_VariableText vt; |
| 489 vt.SetProvider(&prd); | 489 vt.SetProvider(&prd); |
| 490 CPDF_Rect rcButton = rcBody; | 490 CPDF_Rect rcButton = rcBody; |
| 491 rcButton.left = rcButton.right - 13; | 491 rcButton.left = rcButton.right - 13; |
| 492 rcButton.Normalize(); | 492 rcButton.Normalize(); |
| 493 CPDF_Rect rcEdit = rcBody; | 493 CPDF_Rect rcEdit = rcBody; |
| 494 rcEdit.right = rcButton.left; | 494 rcEdit.right = rcButton.left; |
| 495 rcEdit.Normalize(); | 495 rcEdit.Normalize(); |
| 496 vt.SetPlateRect(rcEdit); | 496 vt.SetPlateRect(rcEdit); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 527 sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f
<< " m\n"; | 527 sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f
<< " m\n"; |
| 528 sAppStream << ptCenter.x + 3 << " " << ptCenter.y + 1.5f
<< " l\n"; | 528 sAppStream << ptCenter.x + 3 << " " << ptCenter.y + 1.5f
<< " l\n"; |
| 529 sAppStream << ptCenter.x << " " << ptCenter.y - 1.5f <<
" l\n"; | 529 sAppStream << ptCenter.x << " " << ptCenter.y - 1.5f <<
" l\n"; |
| 530 sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f
<< " l f\n"; | 530 sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f
<< " l f\n"; |
| 531 sAppStream << sButton << "Q\n"; | 531 sAppStream << sButton << "Q\n"; |
| 532 } | 532 } |
| 533 } | 533 } |
| 534 } | 534 } |
| 535 break; | 535 break; |
| 536 case 2: { | 536 case 2: { |
| 537 CPVT_FontMap map(pDoc, pStreamDict->GetDict("Resources"), pDefFo
nt, sFontName.Right(sFontName.GetLength() - 1)); | 537 CPVT_FontMap map(pDoc, pStreamDict ? pStreamDict->GetDict("Resou
rces"):NULL, pDefFont, sFontName.Right(sFontName.GetLength() - 1)); |
| 538 CPVT_Provider prd(&map); | 538 CPVT_Provider prd(&map); |
| 539 CPDF_Array * pOpts = FPDF_GetFieldAttr(pAnnotDict, "Opt")->GetAr
ray(); | 539 CPDF_Array * pOpts = FPDF_GetFieldAttr(pAnnotDict, "Opt") ? FPDF
_GetFieldAttr(pAnnotDict, "Opt")->GetArray() : NULL; |
| 540 CPDF_Array * pSels = FPDF_GetFieldAttr(pAnnotDict, "I")->GetArra
y(); | 540 CPDF_Array * pSels = FPDF_GetFieldAttr(pAnnotDict, "I") ? FPDF_G
etFieldAttr(pAnnotDict, "I")->GetArray() : NULL; |
| 541 FX_INT32 nTop = FPDF_GetFieldAttr(pAnnotDict, "TI")->GetInteger(
); | 541 FX_INT32 nTop = FPDF_GetFieldAttr(pAnnotDict, "TI") ? FPDF_GetFi
eldAttr(pAnnotDict, "TI")->GetInteger() : 0; |
| 542 CFX_ByteTextBuf sBody; | 542 CFX_ByteTextBuf sBody; |
| 543 if (pOpts) { | 543 if (pOpts) { |
| 544 FX_FLOAT fy = rcBody.top; | 544 FX_FLOAT fy = rcBody.top; |
| 545 for (FX_INT32 i = nTop, sz = pOpts->GetCount(); i < sz; i++)
{ | 545 for (FX_INT32 i = nTop, sz = pOpts->GetCount(); i < sz; i++)
{ |
| 546 if (IsFloatSmaller(fy, rcBody.bottom)) { | 546 if (IsFloatSmaller(fy, rcBody.bottom)) { |
| 547 break; | 547 break; |
| 548 } | 548 } |
| 549 if (CPDF_Object* pOpt = pOpts->GetElementValue(i)) { | 549 if (CPDF_Object* pOpt = pOpts->GetElementValue(i)) { |
| 550 CFX_WideString swItem; | 550 CFX_WideString swItem; |
| 551 if (pOpt->GetType() == PDFOBJ_STRING) { | 551 if (pOpt->GetType() == PDFOBJ_STRING) { |
| (...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 799 case CT_GRAY: | 799 case CT_GRAY: |
| 800 sColorStream << color.fColor1 << " " << (bFillOrStroke ? "g" : "G")
<< "\n"; | 800 sColorStream << color.fColor1 << " " << (bFillOrStroke ? "g" : "G")
<< "\n"; |
| 801 break; | 801 break; |
| 802 case CT_CMYK: | 802 case CT_CMYK: |
| 803 sColorStream << color.fColor1 << " " << color.fColor2 << " " << colo
r.fColor3 << " " << color.fColor4 << " " | 803 sColorStream << color.fColor1 << " " << color.fColor2 << " " << colo
r.fColor3 << " " << color.fColor4 << " " |
| 804 << (bFillOrStroke ? "k" : "K") << "\n"; | 804 << (bFillOrStroke ? "k" : "K") << "\n"; |
| 805 break; | 805 break; |
| 806 } | 806 } |
| 807 return sColorStream.GetByteString(); | 807 return sColorStream.GetByteString(); |
| 808 } | 808 } |
| OLD | NEW |