1 // Copyright 2014 PDFium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6 7 #ifndef CORE_INCLUDE_FPDFDOC_FPDF_DOC_H_ 8 #define CORE_INCLUDE_FPDFDOC_FPDF_DOC_H_ 9 10 #include <map> 11 #include <memory> 12 #include <vector> 13 14 #include "core/include/fpdfapi/fpdf_parser.h" 15 #include "core/include/fpdfapi/fpdf_render.h" 16 17 class CFieldTree; 18 class CPDF_AAction; 19 class CPDF_Action; 20 class CPDF_ActionFields; 21 class CPDF_Annot; 22 class CPDF_AnnotList; 23 class CPDF_ApSettings; 24 class CPDF_Bookmark; 25 class CPDF_BookmarkTree; 26 class CPDF_DefaultAppearance; 27 class CPDF_Dest; 28 class CPDF_DocJSActions; 29 class CPDF_FileSpec; 30 class CPDF_FormControl; 31 class CPDF_FormField; 32 class CPDF_FormNotify; 33 class CPDF_IconFit; 34 class CPDF_InterForm; 35 class CPDF_Link; 36 class CPDF_Metadata; 37 class CPDF_NumberTree; 38 class CPDF_OCContext; 39 class CPDF_Page; 40 class CPDF_RenderOptions; 41 class CPDF_TextObject; 42 class CPDF_ViewerPreferences; 43 class CXML_Element; 44 45 class CPDF_NameTree { 46 public: CPDF_NameTree(CPDF_Dictionary * pRoot)47 explicit CPDF_NameTree(CPDF_Dictionary* pRoot) { m_pRoot = pRoot; } 48 49 CPDF_NameTree(CPDF_Document* pDoc, const CFX_ByteStringC& category); 50 51 CPDF_Object* LookupValue(int nIndex, CFX_ByteString& csName) const; 52 53 CPDF_Object* LookupValue(const CFX_ByteString& csName) const; 54 55 CPDF_Array* LookupNamedDest(CPDF_Document* pDoc, 56 const CFX_ByteStringC& sName); 57 58 int GetIndex(const CFX_ByteString& csName) const; 59 60 int GetCount() const; 61 GetRoot()62 CPDF_Dictionary* GetRoot() const { return m_pRoot; } 63 64 protected: 65 CPDF_Dictionary* m_pRoot; 66 }; 67 class CPDF_BookmarkTree { 68 public: CPDF_BookmarkTree(CPDF_Document * pDoc)69 explicit CPDF_BookmarkTree(CPDF_Document* pDoc) : m_pDocument(pDoc) {} 70 71 CPDF_Bookmark GetFirstChild(const CPDF_Bookmark& parent) const; 72 73 CPDF_Bookmark GetNextSibling(const CPDF_Bookmark& bookmark) const; 74 GetDocument()75 CPDF_Document* GetDocument() const { return m_pDocument; } 76 77 protected: 78 CPDF_Document* m_pDocument; 79 }; 80 #define PDFBOOKMARK_ITALIC 1 81 #define PDFBOOKMARK_BOLD 2 82 class CPDF_Bookmark { 83 public: CPDF_Bookmark()84 CPDF_Bookmark() : m_pDict(NULL) {} 85 CPDF_Bookmark(CPDF_Dictionary * pDict)86 explicit CPDF_Bookmark(CPDF_Dictionary* pDict) : m_pDict(pDict) {} 87 GetDict()88 CPDF_Dictionary* GetDict() const { return m_pDict; } 89 90 operator bool() const { return m_pDict != NULL; } 91 92 FX_DWORD GetColorRef() const; 93 94 FX_DWORD GetFontStyle() const; 95 96 CFX_WideString GetTitle() const; 97 98 CPDF_Dest GetDest(CPDF_Document* pDocument) const; 99 100 CPDF_Action GetAction() const; 101 102 CPDF_Dictionary* m_pDict; 103 }; 104 #define PDFZOOM_XYZ 1 105 #define PDFZOOM_FITPAGE 2 106 #define PDFZOOM_FITHORZ 3 107 #define PDFZOOM_FITVERT 4 108 #define PDFZOOM_FITRECT 5 109 #define PDFZOOM_FITBBOX 6 110 #define PDFZOOM_FITBHORZ 7 111 #define PDFZOOM_FITBVERT 8 112 class CPDF_Dest { 113 public: CPDF_Dest()114 CPDF_Dest() : m_pObj(nullptr) {} CPDF_Dest(CPDF_Object * pObj)115 explicit CPDF_Dest(CPDF_Object* pObj) : m_pObj(pObj) {} 116 117 operator bool() const { return m_pObj != NULL; } GetObject()118 CPDF_Object* GetObject() const { return m_pObj; } 119 120 CFX_ByteString GetRemoteName(); 121 int GetPageIndex(CPDF_Document* pDoc); 122 FX_DWORD GetPageObjNum(); 123 int GetZoomMode(); 124 FX_FLOAT GetParam(int index); 125 126 protected: 127 CPDF_Object* m_pObj; 128 }; 129 class CPDF_OCContext : public IPDF_OCContext { 130 public: 131 enum UsageType { View = 0, Design, Print, Export }; 132 133 explicit CPDF_OCContext(CPDF_Document* pDoc, UsageType eUsageType = View); 134 ~CPDF_OCContext() override; 135 GetDocument()136 CPDF_Document* GetDocument() const { return m_pDocument; } 137 GetUsageType()138 UsageType GetUsageType() const { return m_eUsageType; } 139 140 FX_BOOL CheckOCGVisible(const CPDF_Dictionary* pOCGDict) override; 141 142 void ResetOCContext(); 143 144 protected: 145 FX_BOOL LoadOCGStateFromConfig(const CFX_ByteStringC& csConfig, 146 const CPDF_Dictionary* pOCGDict, 147 FX_BOOL& bValidConfig) const; 148 149 FX_BOOL LoadOCGState(const CPDF_Dictionary* pOCGDict) const; 150 151 FX_BOOL GetOCGVisible(const CPDF_Dictionary* pOCGDict); 152 153 FX_BOOL GetOCGVE(CPDF_Array* pExpression, 154 FX_BOOL bFromConfig, 155 int nLevel = 0); 156 157 FX_BOOL LoadOCMDState(const CPDF_Dictionary* pOCMDDict, FX_BOOL bFromConfig); 158 159 CPDF_Document* m_pDocument; 160 161 UsageType m_eUsageType; 162 163 std::map<const CPDF_Dictionary*, FX_BOOL> m_OCGStates; 164 }; 165 166 class CPDF_ActionFields { 167 public: 168 // TODO(thestig): Examine why this cannot be explicit. CPDF_ActionFields(const CPDF_Action * pAction)169 CPDF_ActionFields(const CPDF_Action* pAction) { 170 m_pAction = (CPDF_Action*)pAction; 171 } 172 173 // TODO(thestig): Replace this. 174 operator CPDF_Action*() const { return m_pAction; } 175 176 FX_DWORD GetFieldsCount() const; 177 178 std::vector<CPDF_Object*> GetAllFields() const; 179 180 CPDF_Object* GetField(FX_DWORD iIndex) const; 181 182 CPDF_Action* m_pAction; 183 }; 184 185 #define PDFNAMED_NEXTPAGE 1 186 #define PDFNAMED_PREVPAGE 2 187 #define PDFNAMED_FIRSTPAGE 3 188 #define PDFNAMED_LASTPAGE 4 189 #define PDFJS_MAXLENGTH 64 190 class CPDF_Action { 191 public: 192 enum ActionType { 193 Unknown = 0, 194 GoTo, 195 GoToR, 196 GoToE, 197 Launch, 198 Thread, 199 URI, 200 Sound, 201 Movie, 202 Hide, 203 Named, 204 SubmitForm, 205 ResetForm, 206 ImportData, 207 JavaScript, 208 SetOCGState, 209 Rendition, 210 Trans, 211 GoTo3DView 212 }; 213 CPDF_Action()214 CPDF_Action() : m_pDict(nullptr) {} CPDF_Action(CPDF_Dictionary * pDict)215 explicit CPDF_Action(CPDF_Dictionary* pDict) : m_pDict(pDict) {} 216 217 operator bool() const { return m_pDict != NULL; } 218 GetDict()219 CPDF_Dictionary* GetDict() const { return m_pDict; } 220 GetTypeName()221 CFX_ByteString GetTypeName() const { return m_pDict->GetString("S"); } 222 223 ActionType GetType() const; 224 225 CPDF_Dest GetDest(CPDF_Document* pDoc) const; 226 227 CFX_WideString GetFilePath() const; 228 GetNewWindow()229 FX_BOOL GetNewWindow() const { return m_pDict->GetBoolean("NewWindow"); } 230 231 CFX_ByteString GetURI(CPDF_Document* pDoc) const; 232 GetMouseMap()233 FX_BOOL GetMouseMap() const { return m_pDict->GetBoolean("IsMap"); } 234 GetWidgets()235 CPDF_ActionFields GetWidgets() const { return this; } 236 GetHideStatus()237 FX_BOOL GetHideStatus() const { return m_pDict->GetBoolean("H", TRUE); } 238 GetNamedAction()239 CFX_ByteString GetNamedAction() const { return m_pDict->GetString("N"); } 240 GetFlags()241 FX_DWORD GetFlags() const { return m_pDict->GetInteger("Flags"); } 242 243 CFX_WideString GetJavaScript() const; 244 245 CPDF_Dictionary* GetAnnot() const; 246 247 int32_t GetOperationType() const; 248 GetSoundStream()249 CPDF_Stream* GetSoundStream() const { return m_pDict->GetStream("Sound"); } 250 GetVolume()251 FX_FLOAT GetVolume() const { return m_pDict->GetNumber("Volume"); } 252 IsSynchronous()253 FX_BOOL IsSynchronous() const { return m_pDict->GetBoolean("Synchronous"); } 254 IsRepeat()255 FX_BOOL IsRepeat() const { return m_pDict->GetBoolean("Repeat"); } 256 IsMixPlay()257 FX_BOOL IsMixPlay() const { return m_pDict->GetBoolean("Mix"); } 258 259 FX_DWORD GetSubActionsCount() const; 260 261 CPDF_Action GetSubAction(FX_DWORD iIndex) const; 262 263 protected: 264 CPDF_Dictionary* m_pDict; 265 }; 266 class CPDF_AAction { 267 public: 268 // TODO(thestig): Examine why this cannot be explicit. 269 CPDF_AAction(CPDF_Dictionary* pDict = NULL) { m_pDict = pDict; } 270 271 operator CPDF_Dictionary*() const { return m_pDict; } 272 273 enum AActionType { 274 CursorEnter = 0, 275 CursorExit, 276 ButtonDown, 277 ButtonUp, 278 GetFocus, 279 LoseFocus, 280 PageOpen, 281 PageClose, 282 PageVisible, 283 PageInvisible, 284 OpenPage, 285 ClosePage, 286 KeyStroke, 287 Format, 288 Validate, 289 Calculate, 290 CloseDocument, 291 SaveDocument, 292 DocumentSaved, 293 PrintDocument, 294 DocumentPrinted 295 }; 296 297 FX_BOOL ActionExist(AActionType eType) const; 298 299 CPDF_Action GetAction(AActionType eType) const; 300 301 CPDF_Dictionary* m_pDict; 302 }; 303 class CPDF_DocJSActions { 304 public: 305 explicit CPDF_DocJSActions(CPDF_Document* pDoc); 306 307 int CountJSActions() const; 308 309 CPDF_Action GetJSAction(int index, CFX_ByteString& csName) const; 310 311 CPDF_Action GetJSAction(const CFX_ByteString& csName) const; 312 313 int FindJSAction(const CFX_ByteString& csName) const; 314 GetDocument()315 CPDF_Document* GetDocument() const { return m_pDocument; } 316 317 protected: 318 CPDF_Document* const m_pDocument; 319 }; 320 class CPDF_FileSpec { 321 public: 322 CPDF_FileSpec(); 323 CPDF_FileSpec(CPDF_Object * pObj)324 explicit CPDF_FileSpec(CPDF_Object* pObj) { m_pObj = pObj; } 325 326 operator CPDF_Object*() const { return m_pObj; } 327 328 FX_BOOL IsURL() const; 329 330 FX_BOOL GetFileName(CFX_WideString& wsFileName) const; 331 332 CPDF_Stream* GetFileStream() const; 333 334 void SetFileName(const CFX_WideStringC& wsFileName, FX_BOOL bURL = FALSE); 335 336 protected: 337 CPDF_Object* m_pObj; 338 }; 339 340 class CPDF_LinkList { 341 public: 342 CPDF_LinkList(); 343 ~CPDF_LinkList(); 344 345 CPDF_Link GetLinkAtPoint(CPDF_Page* pPage, 346 FX_FLOAT pdf_x, 347 FX_FLOAT pdf_y, 348 int* z_order); 349 350 private: 351 const std::vector<CPDF_Dictionary*>* GetPageLinks(CPDF_Page* pPage); 352 353 void LoadPageLinks(CPDF_Page* pPage, std::vector<CPDF_Dictionary*>* pList); 354 355 std::map<FX_DWORD, std::vector<CPDF_Dictionary*>> m_PageMap; 356 }; 357 358 class CPDF_Link { 359 public: CPDF_Link()360 CPDF_Link() : m_pDict(nullptr) {} CPDF_Link(CPDF_Dictionary * pDict)361 explicit CPDF_Link(CPDF_Dictionary* pDict) : m_pDict(pDict) {} 362 GetDict()363 CPDF_Dictionary* GetDict() const { return m_pDict; } 364 365 CFX_FloatRect GetRect(); 366 CPDF_Dest GetDest(CPDF_Document* pDoc); 367 CPDF_Action GetAction(); 368 369 protected: 370 CPDF_Dictionary* m_pDict; 371 }; 372 373 #define ANNOTFLAG_INVISIBLE 0x0001 374 #define ANNOTFLAG_HIDDEN 0x0002 375 #define ANNOTFLAG_PRINT 0x0004 376 #define ANNOTFLAG_NOZOOM 0x0008 377 #define ANNOTFLAG_NOROTATE 0x0010 378 #define ANNOTFLAG_NOVIEW 0x0020 379 #define ANNOTFLAG_READONLY 0x0040 380 #define ANNOTFLAG_LOCKED 0x0080 381 #define ANNOTFLAG_TOGGLENOVIEW 0x0100 382 383 class CPDF_Annot : public CFX_PrivateData { 384 public: 385 enum AppearanceMode { Normal, Rollover, Down }; 386 387 CPDF_Annot(CPDF_Dictionary* pDict, CPDF_AnnotList* pList); 388 ~CPDF_Annot(); 389 390 CFX_ByteString GetSubType() const; 391 392 FX_DWORD GetFlags() const; 393 394 void GetRect(CFX_FloatRect& rect) const; 395 GetAnnotDict()396 const CPDF_Dictionary* GetAnnotDict() const { return m_pAnnotDict; } GetAnnotDict()397 CPDF_Dictionary* GetAnnotDict() { return m_pAnnotDict; } 398 399 FX_BOOL DrawAppearance(CPDF_Page* pPage, 400 CFX_RenderDevice* pDevice, 401 const CFX_Matrix* pUser2Device, 402 AppearanceMode mode, 403 const CPDF_RenderOptions* pOptions); 404 405 FX_BOOL DrawInContext(const CPDF_Page* pPage, 406 CPDF_RenderContext* pContext, 407 const CFX_Matrix* pUser2Device, 408 AppearanceMode mode); 409 410 void ClearCachedAP(); 411 412 void DrawBorder(CFX_RenderDevice* pDevice, 413 const CFX_Matrix* pUser2Device, 414 const CPDF_RenderOptions* pOptions); 415 416 CPDF_Form* GetAPForm(const CPDF_Page* pPage, AppearanceMode mode); 417 418 private: 419 CPDF_Dictionary* const m_pAnnotDict; 420 CPDF_AnnotList* const m_pList; 421 const CFX_ByteString m_sSubtype; 422 std::map<CPDF_Stream*, CPDF_Form*> m_APMap; 423 }; 424 425 class CPDF_AnnotList { 426 public: 427 explicit CPDF_AnnotList(CPDF_Page* pPage); 428 ~CPDF_AnnotList(); 429 DisplayAnnots(CPDF_Page * pPage,CPDF_RenderContext * pContext,FX_BOOL bPrinting,CFX_Matrix * pMatrix,FX_BOOL bShowWidget,CPDF_RenderOptions * pOptions)430 void DisplayAnnots(CPDF_Page* pPage, 431 CPDF_RenderContext* pContext, 432 FX_BOOL bPrinting, 433 CFX_Matrix* pMatrix, 434 FX_BOOL bShowWidget, 435 CPDF_RenderOptions* pOptions) { 436 DisplayAnnots(pPage, nullptr, pContext, bPrinting, pMatrix, 437 bShowWidget ? 3 : 1, pOptions, nullptr); 438 } 439 void DisplayAnnots(CPDF_Page* pPage, 440 CFX_RenderDevice* pDevice, 441 CPDF_RenderContext* pContext, 442 FX_BOOL bPrinting, 443 CFX_Matrix* pMatrix, 444 FX_DWORD dwAnnotFlags, 445 CPDF_RenderOptions* pOptions, 446 FX_RECT* pClipRect); Count()447 size_t Count() const { return m_AnnotList.size(); } GetAt(size_t index)448 CPDF_Annot* GetAt(size_t index) const { return m_AnnotList[index]; } All()449 const std::vector<CPDF_Annot*>& All() const { return m_AnnotList; } GetDocument()450 CPDF_Document* GetDocument() const { return m_pDocument; } 451 452 protected: 453 void DisplayPass(CPDF_Page* pPage, 454 CFX_RenderDevice* pDevice, 455 CPDF_RenderContext* pContext, 456 FX_BOOL bPrinting, 457 CFX_Matrix* pMatrix, 458 FX_BOOL bWidget, 459 CPDF_RenderOptions* pOptions, 460 FX_RECT* clip_rect); 461 462 CPDF_Document* const m_pDocument; 463 std::vector<CPDF_Annot*> m_AnnotList; 464 }; 465 466 #define COLORTYPE_TRANSPARENT 0 467 #define COLORTYPE_GRAY 1 468 #define COLORTYPE_RGB 2 469 #define COLORTYPE_CMYK 3 470 class CPDF_DefaultAppearance { 471 public: 472 // TODO(thestig): Examine why this cannot be explicit. 473 CPDF_DefaultAppearance(const CFX_ByteString& csDA = "") { m_csDA = csDA; } 474 CPDF_DefaultAppearance(const CPDF_DefaultAppearance & cDA)475 CPDF_DefaultAppearance(const CPDF_DefaultAppearance& cDA) { 476 m_csDA = (CFX_ByteString)(CPDF_DefaultAppearance&)cDA; 477 } 478 CFX_ByteString()479 operator CFX_ByteString() const { return m_csDA; } 480 481 const CPDF_DefaultAppearance& operator=(const CFX_ByteString& csDA) { 482 m_csDA = csDA; 483 return *this; 484 } 485 486 const CPDF_DefaultAppearance& operator=(const CPDF_DefaultAppearance& cDA) { 487 m_csDA = (CFX_ByteString)(CPDF_DefaultAppearance&)cDA; 488 return *this; 489 } 490 491 FX_BOOL HasFont(); 492 493 CFX_ByteString GetFontString(); 494 495 void GetFont(CFX_ByteString& csFontNameTag, FX_FLOAT& fFontSize); 496 497 FX_BOOL HasColor(FX_BOOL bStrokingOperation = FALSE); 498 499 CFX_ByteString GetColorString(FX_BOOL bStrokingOperation = FALSE); 500 501 void GetColor(int& iColorType, 502 FX_FLOAT fc[4], 503 FX_BOOL bStrokingOperation = FALSE); 504 505 void GetColor(FX_ARGB& color, 506 int& iColorType, 507 FX_BOOL bStrokingOperation = FALSE); 508 509 FX_BOOL HasTextMatrix(); 510 511 CFX_ByteString GetTextMatrixString(); 512 513 CFX_Matrix GetTextMatrix(); 514 515 protected: 516 CFX_ByteString m_csDA; 517 }; 518 #define FIELDTYPE_UNKNOWN 0 519 #define FIELDTYPE_PUSHBUTTON 1 520 #define FIELDTYPE_CHECKBOX 2 521 #define FIELDTYPE_RADIOBUTTON 3 522 #define FIELDTYPE_COMBOBOX 4 523 #define FIELDTYPE_LISTBOX 5 524 #define FIELDTYPE_TEXTFIELD 6 525 #define FIELDTYPE_SIGNATURE 7 526 class CPDF_InterForm : public CFX_PrivateData { 527 public: 528 CPDF_InterForm(CPDF_Document* pDocument, FX_BOOL bUpdateAP); 529 ~CPDF_InterForm(); 530 531 static void EnableUpdateAP(FX_BOOL bUpdateAP); 532 533 static FX_BOOL UpdatingAPEnabled(); 534 535 static CFX_ByteString GenerateNewResourceName(const CPDF_Dictionary* pResDict, 536 const FX_CHAR* csType, 537 int iMinLen = 2, 538 const FX_CHAR* csPrefix = ""); 539 540 static CPDF_Font* AddStandardFont(CPDF_Document* pDocument, 541 CFX_ByteString csFontName); 542 543 static CFX_ByteString GetNativeFont(uint8_t iCharSet, void* pLogFont = NULL); 544 545 static CFX_ByteString GetNativeFont(void* pLogFont = NULL); 546 547 static uint8_t GetNativeCharSet(); 548 549 static CPDF_Font* AddNativeFont(uint8_t iCharSet, CPDF_Document* pDocument); 550 551 static CPDF_Font* AddNativeFont(CPDF_Document* pDocument); 552 553 FX_BOOL ValidateFieldName(CFX_WideString& csNewFieldName, int iType); 554 555 FX_BOOL ValidateFieldName(const CPDF_FormField* pField, 556 CFX_WideString& csNewFieldName); 557 558 FX_BOOL ValidateFieldName(const CPDF_FormControl* pControl, 559 CFX_WideString& csNewFieldName); 560 561 FX_DWORD CountFields(const CFX_WideString& csFieldName = L""); 562 563 CPDF_FormField* GetField(FX_DWORD index, 564 const CFX_WideString& csFieldName = L""); 565 566 void GetAllFieldNames(CFX_WideStringArray& allFieldNames); 567 568 CPDF_FormField* GetFieldByDict(CPDF_Dictionary* pFieldDict) const; 569 570 CPDF_FormControl* GetControlAtPoint(CPDF_Page* pPage, 571 FX_FLOAT pdf_x, 572 FX_FLOAT pdf_y, 573 int* z_order) const; 574 575 CPDF_FormControl* GetControlByDict(const CPDF_Dictionary* pWidgetDict) const; 576 GetDocument()577 CPDF_Document* GetDocument() const { return m_pDocument; } 578 GetFormDict()579 CPDF_Dictionary* GetFormDict() const { return m_pFormDict; } 580 581 FX_BOOL NeedConstructAP(); 582 583 void NeedConstructAP(FX_BOOL bNeedAP); 584 585 int CountFieldsInCalculationOrder(); 586 587 CPDF_FormField* GetFieldInCalculationOrder(int index); 588 589 int FindFieldInCalculationOrder(const CPDF_FormField* pField); 590 591 FX_DWORD CountFormFonts(); 592 593 CPDF_Font* GetFormFont(FX_DWORD index, CFX_ByteString& csNameTag); 594 595 CPDF_Font* GetFormFont(CFX_ByteString csNameTag); 596 597 CPDF_Font* GetFormFont(CFX_ByteString csFontName, CFX_ByteString& csNameTag); 598 599 CPDF_Font* GetNativeFormFont(uint8_t iCharSet, CFX_ByteString& csNameTag); 600 601 CPDF_Font* GetNativeFormFont(CFX_ByteString& csNameTag); 602 603 FX_BOOL FindFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag); 604 605 FX_BOOL FindFormFont(CFX_ByteString csFontName, 606 CPDF_Font*& pFont, 607 CFX_ByteString& csNameTag); 608 FindFormFont(CFX_WideString csFontName,CPDF_Font * & pFont,CFX_ByteString & csNameTag)609 inline FX_BOOL FindFormFont(CFX_WideString csFontName, 610 CPDF_Font*& pFont, 611 CFX_ByteString& csNameTag) { 612 return FindFormFont(PDF_EncodeText(csFontName), pFont, csNameTag); 613 } 614 615 void AddFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag); 616 617 CPDF_Font* AddNativeFormFont(uint8_t iCharSet, CFX_ByteString& csNameTag); 618 619 CPDF_Font* AddNativeFormFont(CFX_ByteString& csNameTag); 620 621 void RemoveFormFont(const CPDF_Font* pFont); 622 623 void RemoveFormFont(CFX_ByteString csNameTag); 624 625 CPDF_DefaultAppearance GetDefaultAppearance(); 626 627 CPDF_Font* GetDefaultFormFont(); 628 629 int GetFormAlignment(); 630 631 CPDF_FormField* CheckRequiredFields( 632 const std::vector<CPDF_FormField*>* fields, 633 bool bIncludeOrExclude) const; 634 635 CFDF_Document* ExportToFDF(const CFX_WideStringC& pdf_path, 636 bool bSimpleFileSpec = false) const; 637 638 CFDF_Document* ExportToFDF(const CFX_WideStringC& pdf_path, 639 const std::vector<CPDF_FormField*>& fields, 640 bool bIncludeOrExclude = true, 641 bool bSimpleFileSpec = false) const; 642 643 FX_BOOL ImportFromFDF(const CFDF_Document* pFDFDoc, FX_BOOL bNotify = FALSE); 644 645 bool ResetForm(const std::vector<CPDF_FormField*>& fields, 646 bool bIncludeOrExclude = true, 647 bool bNotify = false); 648 649 bool ResetForm(bool bNotify = false); 650 GetFormNotify()651 CPDF_FormNotify* GetFormNotify() const { return m_pFormNotify; } 652 653 void SetFormNotify(const CPDF_FormNotify* pNotify); 654 IsUpdated()655 FX_BOOL IsUpdated() { return m_bUpdated; } 656 ClearUpdatedFlag()657 void ClearUpdatedFlag() { m_bUpdated = FALSE; } 658 659 FX_BOOL HasXFAForm() const; 660 661 void FixPageFields(const CPDF_Page* pPage); 662 663 protected: 664 static FX_BOOL m_bUpdateAP; 665 666 void LoadField(CPDF_Dictionary* pFieldDict, int nLevel = 0); 667 668 CPDF_Object* GetFieldAttr(CPDF_Dictionary* pFieldDict, const FX_CHAR* name); 669 670 CPDF_FormField* AddTerminalField(CPDF_Dictionary* pFieldDict); 671 672 CPDF_FormControl* AddControl(const CPDF_FormField* pField, 673 CPDF_Dictionary* pWidgetDict); 674 675 void FDF_ImportField(CPDF_Dictionary* pField, 676 const CFX_WideString& parent_name, 677 FX_BOOL bNotify = FALSE, 678 int nLevel = 0); 679 680 FX_BOOL ValidateFieldName(CFX_WideString& csNewFieldName, 681 int iType, 682 const CPDF_FormField* pExcludedField, 683 const CPDF_FormControl* pExcludedControl); 684 685 int CompareFieldName(const CFX_WideString& name1, 686 const CFX_WideString& name2); 687 688 int CompareFieldName(const CFX_ByteString& name1, 689 const CFX_ByteString& name2); 690 691 CPDF_Document* const m_pDocument; 692 693 FX_BOOL m_bGenerateAP; 694 695 CPDF_Dictionary* m_pFormDict; 696 697 std::map<const CPDF_Dictionary*, CPDF_FormControl*> m_ControlMap; 698 699 std::unique_ptr<CFieldTree> m_pFieldTree; 700 701 CFX_ByteString m_bsEncoding; 702 703 CPDF_FormNotify* m_pFormNotify; 704 705 FX_BOOL m_bUpdated; 706 friend class CPDF_FormControl; 707 friend class CPDF_FormField; 708 }; 709 #define FORMFIELD_READONLY 0x01 710 #define FORMFIELD_REQUIRED 0x02 711 #define FORMFIELD_NOEXPORT 0x04 712 #define FORMRADIO_NOTOGGLEOFF 0x100 713 #define FORMRADIO_UNISON 0x200 714 #define FORMTEXT_MULTILINE 0x100 715 #define FORMTEXT_PASSWORD 0x200 716 #define FORMTEXT_NOSCROLL 0x400 717 #define FORMTEXT_COMB 0x800 718 #define FORMCOMBO_EDIT 0x100 719 #define FORMLIST_MULTISELECT 0x100 720 class CPDF_FormField { 721 public: 722 enum Type { 723 Unknown, 724 PushButton, 725 RadioButton, 726 CheckBox, 727 Text, 728 RichText, 729 File, 730 ListBox, 731 ComboBox, 732 Sign 733 }; 734 735 CFX_WideString GetFullName(); 736 GetType()737 Type GetType() { return m_Type; } 738 GetFlags()739 FX_DWORD GetFlags() { return m_Flags; } 740 GetFieldDict()741 CPDF_Dictionary* GetFieldDict() const { return m_pDict; } 742 SetFieldDict(CPDF_Dictionary * pDict)743 void SetFieldDict(CPDF_Dictionary* pDict) { m_pDict = pDict; } 744 745 FX_BOOL ResetField(FX_BOOL bNotify = FALSE); 746 CountControls()747 int CountControls() { return m_ControlList.GetSize(); } 748 GetControl(int index)749 CPDF_FormControl* GetControl(int index) { return m_ControlList.GetAt(index); } 750 751 int GetControlIndex(const CPDF_FormControl* pControl); 752 753 int GetFieldType(); 754 755 CPDF_AAction GetAdditionalAction(); 756 757 CFX_WideString GetAlternateName(); 758 759 CFX_WideString GetMappingName(); 760 761 FX_DWORD GetFieldFlags(); 762 763 CFX_ByteString GetDefaultStyle(); 764 765 CFX_WideString GetRichTextString(); 766 767 CFX_WideString GetValue(); 768 769 CFX_WideString GetDefaultValue(); 770 771 FX_BOOL SetValue(const CFX_WideString& value, FX_BOOL bNotify = FALSE); 772 773 int GetMaxLen(); 774 775 int CountSelectedItems(); 776 777 int GetSelectedIndex(int index); 778 779 FX_BOOL ClearSelection(FX_BOOL bNotify = FALSE); 780 781 FX_BOOL IsItemSelected(int index); 782 783 FX_BOOL SetItemSelection(int index, 784 FX_BOOL bSelected, 785 FX_BOOL bNotify = FALSE); 786 787 FX_BOOL IsItemDefaultSelected(int index); 788 789 int GetDefaultSelectedItem(); 790 791 int CountOptions(); 792 793 CFX_WideString GetOptionLabel(int index); 794 795 CFX_WideString GetOptionValue(int index); 796 797 int FindOption(CFX_WideString csOptLabel); 798 799 int FindOptionValue(const CFX_WideString& csOptValue, int iStartIndex = 0); 800 801 FX_BOOL CheckControl(int iControlIndex, 802 FX_BOOL bChecked, 803 FX_BOOL bNotify = FALSE); 804 805 int GetTopVisibleIndex(); 806 807 int CountSelectedOptions(); 808 809 int GetSelectedOptionIndex(int index); 810 811 FX_BOOL IsOptionSelected(int iOptIndex); 812 813 FX_BOOL SelectOption(int iOptIndex, 814 FX_BOOL bSelected, 815 FX_BOOL bNotify = FALSE); 816 817 FX_BOOL ClearSelectedOptions(FX_BOOL bNotify = FALSE); 818 819 #ifdef PDF_ENABLE_XFA 820 FX_BOOL ClearOptions(FX_BOOL bNotify = FALSE); 821 822 int InsertOption(CFX_WideString csOptLabel, 823 int index = -1, 824 FX_BOOL bNotify = FALSE); 825 #endif // PDF_ENABLE_XFA 826 GetFontSize()827 FX_FLOAT GetFontSize() { return m_FontSize; } 828 GetFont()829 CPDF_Font* GetFont() { return m_pFont; } 830 831 protected: 832 CPDF_FormField(CPDF_InterForm* pForm, CPDF_Dictionary* pDict); 833 ~CPDF_FormField(); 834 835 CFX_WideString GetValue(FX_BOOL bDefault); 836 837 FX_BOOL SetValue(const CFX_WideString& value, 838 FX_BOOL bDefault, 839 FX_BOOL bNotify); 840 841 void SyncFieldFlags(); 842 843 int FindListSel(CPDF_String* str); 844 845 CFX_WideString GetOptionText(int index, int sub_index); 846 847 void LoadDA(); 848 849 void UpdateAP(CPDF_FormControl* pControl); 850 851 CFX_WideString GetCheckValue(FX_BOOL bDefault); 852 853 FX_BOOL SetCheckValue(const CFX_WideString& value, 854 FX_BOOL bDefault, 855 FX_BOOL bNotify); 856 857 CPDF_FormField::Type m_Type; 858 FX_DWORD m_Flags; 859 CPDF_InterForm* m_pForm; 860 CPDF_Dictionary* m_pDict; 861 CFX_ArrayTemplate<CPDF_FormControl*> m_ControlList; 862 FX_FLOAT m_FontSize; 863 CPDF_Font* m_pFont; 864 865 friend class CPDF_InterForm; 866 friend class CPDF_FormControl; 867 }; 868 CPDF_Object* FPDF_GetFieldAttr(CPDF_Dictionary* pFieldDict, 869 const FX_CHAR* name, 870 int nLevel = 0); 871 class CPDF_IconFit { 872 public: 873 // TODO(thestig): Examine why this cannot be explicit. 874 CPDF_IconFit(CPDF_Dictionary* pDict = NULL) { m_pDict = pDict; } 875 876 operator CPDF_Dictionary*() const { return m_pDict; } 877 878 enum ScaleMethod { Always = 0, Bigger, Smaller, Never }; 879 880 ScaleMethod GetScaleMethod(); 881 882 FX_BOOL IsProportionalScale(); 883 884 void GetIconPosition(FX_FLOAT& fLeft, FX_FLOAT& fBottom); 885 886 FX_BOOL GetFittingBounds(); 887 888 CPDF_Dictionary* m_pDict; 889 }; 890 891 #define TEXTPOS_CAPTION 0 892 #define TEXTPOS_ICON 1 893 #define TEXTPOS_BELOW 2 894 #define TEXTPOS_ABOVE 3 895 #define TEXTPOS_RIGHT 4 896 #define TEXTPOS_LEFT 5 897 #define TEXTPOS_OVERLAID 6 898 class CPDF_FormControl { 899 public: GetType()900 CPDF_FormField::Type GetType() { return m_pField->GetType(); } 901 GetInterForm()902 CPDF_InterForm* GetInterForm() const { return m_pForm; } 903 GetField()904 CPDF_FormField* GetField() const { return m_pField; } 905 GetWidget()906 CPDF_Dictionary* GetWidget() const { return m_pWidgetDict; } 907 908 CFX_FloatRect GetRect() const; 909 910 void DrawControl(CFX_RenderDevice* pDevice, 911 CFX_Matrix* pMatrix, 912 CPDF_Page* pPage, 913 CPDF_Annot::AppearanceMode mode, 914 const CPDF_RenderOptions* pOptions = NULL); 915 916 CFX_ByteString GetCheckedAPState(); 917 918 CFX_WideString GetExportValue(); 919 920 FX_BOOL IsChecked(); 921 922 FX_BOOL IsDefaultChecked(); 923 924 enum HighlightingMode { None = 0, Invert, Outline, Push, Toggle }; 925 926 HighlightingMode GetHighlightingMode(); 927 928 bool HasMKEntry(CFX_ByteString csEntry) const; 929 930 int GetRotation(); 931 GetBorderColor(int & iColorType)932 inline FX_ARGB GetBorderColor(int& iColorType) { 933 return GetColor(iColorType, "BC"); 934 } 935 GetOriginalBorderColor(int index)936 FX_FLOAT GetOriginalBorderColor(int index) { 937 return GetOriginalColor(index, "BC"); 938 } 939 GetOriginalBorderColor(int & iColorType,FX_FLOAT fc[4])940 void GetOriginalBorderColor(int& iColorType, FX_FLOAT fc[4]) { 941 GetOriginalColor(iColorType, fc, "BC"); 942 } 943 GetBackgroundColor(int & iColorType)944 FX_ARGB GetBackgroundColor(int& iColorType) { 945 return GetColor(iColorType, "BG"); 946 } 947 GetOriginalBackgroundColor(int index)948 FX_FLOAT GetOriginalBackgroundColor(int index) { 949 return GetOriginalColor(index, "BG"); 950 } 951 GetOriginalBackgroundColor(int & iColorType,FX_FLOAT fc[4])952 void GetOriginalBackgroundColor(int& iColorType, FX_FLOAT fc[4]) { 953 GetOriginalColor(iColorType, fc, "BG"); 954 } 955 GetNormalCaption()956 CFX_WideString GetNormalCaption() { return GetCaption("CA"); } 957 GetRolloverCaption()958 CFX_WideString GetRolloverCaption() { return GetCaption("RC"); } 959 GetDownCaption()960 CFX_WideString GetDownCaption() { return GetCaption("AC"); } 961 GetNormalIcon()962 CPDF_Stream* GetNormalIcon() { return GetIcon("I"); } 963 GetRolloverIcon()964 CPDF_Stream* GetRolloverIcon() { return GetIcon("RI"); } 965 GetDownIcon()966 CPDF_Stream* GetDownIcon() { return GetIcon("IX"); } 967 968 CPDF_IconFit GetIconFit(); 969 970 int GetTextPosition(); 971 972 CPDF_Action GetAction(); 973 974 CPDF_AAction GetAdditionalAction(); 975 976 CPDF_DefaultAppearance GetDefaultAppearance(); 977 978 CPDF_Font* GetDefaultControlFont(); 979 980 int GetControlAlignment(); 981 982 protected: 983 CPDF_FormControl(CPDF_FormField* pField, CPDF_Dictionary* pWidgetDict); 984 985 CFX_ByteString GetOnStateName(); 986 987 void SetOnStateName(const CFX_ByteString& csOn); 988 989 void CheckControl(FX_BOOL bChecked); 990 991 FX_ARGB GetColor(int& iColorType, CFX_ByteString csEntry); 992 993 FX_FLOAT GetOriginalColor(int index, CFX_ByteString csEntry); 994 995 void GetOriginalColor(int& iColorType, 996 FX_FLOAT fc[4], 997 CFX_ByteString csEntry); 998 999 CFX_WideString GetCaption(CFX_ByteString csEntry); 1000 1001 CPDF_Stream* GetIcon(CFX_ByteString csEntry); 1002 1003 CPDF_ApSettings GetMK() const; 1004 1005 CPDF_InterForm* m_pForm; 1006 1007 CPDF_FormField* m_pField; 1008 1009 CPDF_Dictionary* m_pWidgetDict; 1010 friend class CPDF_InterForm; 1011 friend class CPDF_FormField; 1012 }; 1013 class CPDF_FormNotify { 1014 public: ~CPDF_FormNotify()1015 virtual ~CPDF_FormNotify() {} 1016 BeforeValueChange(const CPDF_FormField * pField,CFX_WideString & csValue)1017 virtual int BeforeValueChange(const CPDF_FormField* pField, 1018 CFX_WideString& csValue) { 1019 return 0; 1020 } 1021 AfterValueChange(const CPDF_FormField * pField)1022 virtual int AfterValueChange(const CPDF_FormField* pField) { return 0; } 1023 BeforeSelectionChange(const CPDF_FormField * pField,CFX_WideString & csValue)1024 virtual int BeforeSelectionChange(const CPDF_FormField* pField, 1025 CFX_WideString& csValue) { 1026 return 0; 1027 } 1028 AfterSelectionChange(const CPDF_FormField * pField)1029 virtual int AfterSelectionChange(const CPDF_FormField* pField) { return 0; } 1030 AfterCheckedStatusChange(const CPDF_FormField * pField,const CFX_ByteArray & statusArray)1031 virtual int AfterCheckedStatusChange(const CPDF_FormField* pField, 1032 const CFX_ByteArray& statusArray) { 1033 return 0; 1034 } 1035 BeforeFormReset(const CPDF_InterForm * pForm)1036 virtual int BeforeFormReset(const CPDF_InterForm* pForm) { return 0; } 1037 AfterFormReset(const CPDF_InterForm * pForm)1038 virtual int AfterFormReset(const CPDF_InterForm* pForm) { return 0; } 1039 BeforeFormImportData(const CPDF_InterForm * pForm)1040 virtual int BeforeFormImportData(const CPDF_InterForm* pForm) { return 0; } 1041 AfterFormImportData(const CPDF_InterForm * pForm)1042 virtual int AfterFormImportData(const CPDF_InterForm* pForm) { return 0; } 1043 }; 1044 FX_BOOL FPDF_GenerateAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict); 1045 class CPDF_PageLabel { 1046 public: CPDF_PageLabel(CPDF_Document * pDocument)1047 explicit CPDF_PageLabel(CPDF_Document* pDocument) { m_pDocument = pDocument; } 1048 1049 CFX_WideString GetLabel(int nPage) const; 1050 1051 int32_t GetPageByLabel(const CFX_ByteStringC& bsLabel) const; 1052 1053 int32_t GetPageByLabel(const CFX_WideStringC& wsLabel) const; 1054 1055 protected: 1056 CPDF_Document* m_pDocument; 1057 }; 1058 1059 class CPDF_Metadata { 1060 public: 1061 explicit CPDF_Metadata(CPDF_Document* pDoc); 1062 ~CPDF_Metadata(); 1063 1064 const CXML_Element* GetRoot() const; 1065 1066 private: 1067 std::unique_ptr<CXML_Element> m_pXmlElement; 1068 }; 1069 1070 class CPDF_ViewerPreferences { 1071 public: 1072 explicit CPDF_ViewerPreferences(CPDF_Document* pDoc); 1073 1074 ~CPDF_ViewerPreferences(); 1075 1076 FX_BOOL IsDirectionR2L() const; 1077 1078 FX_BOOL PrintScaling() const; 1079 1080 int32_t NumCopies() const; 1081 1082 CPDF_Array* PrintPageRange() const; 1083 1084 CFX_ByteString Duplex() const; 1085 1086 protected: 1087 CPDF_Document* const m_pDoc; 1088 }; 1089 1090 class CPDF_ApSettings { 1091 public: 1092 explicit CPDF_ApSettings(CPDF_Dictionary* pDict); 1093 1094 bool HasMKEntry(const CFX_ByteStringC& csEntry) const; 1095 int GetRotation() const; 1096 GetBorderColor(int & iColorType)1097 FX_ARGB GetBorderColor(int& iColorType) const { 1098 return GetColor(iColorType, "BC"); 1099 } 1100 GetOriginalBorderColor(int index)1101 FX_FLOAT GetOriginalBorderColor(int index) const { 1102 return GetOriginalColor(index, "BC"); 1103 } 1104 GetOriginalBorderColor(int & iColorType,FX_FLOAT fc[4])1105 void GetOriginalBorderColor(int& iColorType, FX_FLOAT fc[4]) const { 1106 GetOriginalColor(iColorType, fc, "BC"); 1107 } 1108 GetBackgroundColor(int & iColorType)1109 FX_ARGB GetBackgroundColor(int& iColorType) const { 1110 return GetColor(iColorType, "BG"); 1111 } 1112 GetOriginalBackgroundColor(int index)1113 FX_FLOAT GetOriginalBackgroundColor(int index) const { 1114 return GetOriginalColor(index, "BG"); 1115 } 1116 GetOriginalBackgroundColor(int & iColorType,FX_FLOAT fc[4])1117 void GetOriginalBackgroundColor(int& iColorType, FX_FLOAT fc[4]) const { 1118 GetOriginalColor(iColorType, fc, "BG"); 1119 } 1120 GetNormalCaption()1121 CFX_WideString GetNormalCaption() const { return GetCaption("CA"); } 1122 GetRolloverCaption()1123 CFX_WideString GetRolloverCaption() const { return GetCaption("RC"); } 1124 GetDownCaption()1125 CFX_WideString GetDownCaption() const { return GetCaption("AC"); } 1126 GetNormalIcon()1127 CPDF_Stream* GetNormalIcon() const { return GetIcon("I"); } 1128 GetRolloverIcon()1129 CPDF_Stream* GetRolloverIcon() const { return GetIcon("RI"); } 1130 GetDownIcon()1131 CPDF_Stream* GetDownIcon() const { return GetIcon("IX"); } 1132 1133 CPDF_IconFit GetIconFit() const; 1134 1135 int GetTextPosition() const; 1136 1137 protected: 1138 friend class CPDF_FormControl; 1139 1140 FX_ARGB GetColor(int& iColorType, const CFX_ByteStringC& csEntry) const; 1141 1142 FX_FLOAT GetOriginalColor(int index, const CFX_ByteStringC& csEntry) const; 1143 1144 void GetOriginalColor(int& iColorType, 1145 FX_FLOAT fc[4], 1146 const CFX_ByteStringC& csEntry) const; 1147 1148 CFX_WideString GetCaption(const CFX_ByteStringC& csEntry) const; 1149 1150 CPDF_Stream* GetIcon(const CFX_ByteStringC& csEntry) const; 1151 1152 CPDF_Dictionary* const m_pDict; 1153 }; 1154 1155 CFX_WideString FILESPEC_EncodeFileName(const CFX_WideStringC& filepath); 1156 1157 #endif // CORE_INCLUDE_FPDFDOC_FPDF_DOC_H_ 1158