diff options
Diffstat (limited to 'core/fpdfdoc/include/fpdf_doc.h')
-rw-r--r-- | core/fpdfdoc/include/fpdf_doc.h | 1053 |
1 files changed, 1053 insertions, 0 deletions
diff --git a/core/fpdfdoc/include/fpdf_doc.h b/core/fpdfdoc/include/fpdf_doc.h new file mode 100644 index 0000000000..e33b60165b --- /dev/null +++ b/core/fpdfdoc/include/fpdf_doc.h @@ -0,0 +1,1053 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_INCLUDE_FPDF_DOC_H_ +#define CORE_FPDFDOC_INCLUDE_FPDF_DOC_H_ + +#include <map> +#include <memory> +#include <vector> + +#include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h" +#include "core/fpdfapi/fpdf_parser/include/fpdf_parser_decode.h" +#include "core/fpdfapi/fpdf_parser/ipdf_occontext.h" +#include "core/fxge/include/fx_dib.h" + +class CFDF_Document; +class CFieldTree; +class CPDF_AAction; +class CPDF_Action; +class CPDF_ActionFields; +class CPDF_Annot; +class CPDF_AnnotList; +class CPDF_ApSettings; +class CPDF_Bookmark; +class CPDF_BookmarkTree; +class CPDF_DefaultAppearance; +class CPDF_Dest; +class CPDF_Document; +class CPDF_DocJSActions; +class CPDF_FileSpec; +class CPDF_FormControl; +class CPDF_FormField; +class CPDF_FormNotify; +class CPDF_IconFit; +class CPDF_InterForm; +class CPDF_Link; +class CPDF_Metadata; +class CPDF_OCContext; +class CPDF_Page; +class CPDF_Font; +class CPDF_Form; +class CPDF_RenderOptions; +class CPDF_RenderContext; +class CPDF_ViewerPreferences; +class CXML_Element; +class CFX_RenderDevice; + +class CPDF_NameTree { + public: + explicit CPDF_NameTree(CPDF_Dictionary* pRoot) : m_pRoot(pRoot) {} + CPDF_NameTree(CPDF_Document* pDoc, const CFX_ByteStringC& category); + + CPDF_Object* LookupValue(int nIndex, CFX_ByteString& csName) const; + CPDF_Object* LookupValue(const CFX_ByteString& csName) const; + CPDF_Array* LookupNamedDest(CPDF_Document* pDoc, + const CFX_ByteStringC& sName); + int GetIndex(const CFX_ByteString& csName) const; + int GetCount() const; + CPDF_Dictionary* GetRoot() const { return m_pRoot; } + + protected: + CPDF_Dictionary* m_pRoot; +}; + +class CPDF_BookmarkTree { + public: + explicit CPDF_BookmarkTree(CPDF_Document* pDoc) : m_pDocument(pDoc) {} + + CPDF_Bookmark GetFirstChild(const CPDF_Bookmark& parent) const; + CPDF_Bookmark GetNextSibling(const CPDF_Bookmark& bookmark) const; + CPDF_Document* GetDocument() const { return m_pDocument; } + + protected: + CPDF_Document* const m_pDocument; +}; + +#define PDFBOOKMARK_ITALIC 1 +#define PDFBOOKMARK_BOLD 2 +class CPDF_Bookmark { + public: + CPDF_Bookmark() : m_pDict(nullptr) {} + explicit CPDF_Bookmark(CPDF_Dictionary* pDict) : m_pDict(pDict) {} + + CPDF_Dictionary* GetDict() const { return m_pDict; } + uint32_t GetColorRef() const; + uint32_t GetFontStyle() const; + CFX_WideString GetTitle() const; + CPDF_Dest GetDest(CPDF_Document* pDocument) const; + CPDF_Action GetAction() const; + + protected: + CPDF_Dictionary* m_pDict; +}; + +#define PDFZOOM_XYZ 1 +#define PDFZOOM_FITPAGE 2 +#define PDFZOOM_FITHORZ 3 +#define PDFZOOM_FITVERT 4 +#define PDFZOOM_FITRECT 5 +#define PDFZOOM_FITBBOX 6 +#define PDFZOOM_FITBHORZ 7 +#define PDFZOOM_FITBVERT 8 +class CPDF_Dest { + public: + CPDF_Dest() : m_pObj(nullptr) {} + explicit CPDF_Dest(CPDF_Object* pObj) : m_pObj(pObj) {} + + CPDF_Object* GetObject() const { return m_pObj; } + CFX_ByteString GetRemoteName(); + int GetPageIndex(CPDF_Document* pDoc); + uint32_t GetPageObjNum(); + int GetZoomMode(); + FX_FLOAT GetParam(int index); + + protected: + CPDF_Object* m_pObj; +}; + +class CPDF_OCContext : public IPDF_OCContext { + public: + enum UsageType { View = 0, Design, Print, Export }; + + explicit CPDF_OCContext(CPDF_Document* pDoc, UsageType eUsageType = View); + ~CPDF_OCContext() override; + + // IPDF_OCContext: + FX_BOOL CheckOCGVisible(const CPDF_Dictionary* pOCGDict) override; + + CPDF_Document* GetDocument() const { return m_pDocument; } + UsageType GetUsageType() const { return m_eUsageType; } + + void ResetOCContext(); + + protected: + FX_BOOL LoadOCGStateFromConfig(const CFX_ByteStringC& csConfig, + const CPDF_Dictionary* pOCGDict, + FX_BOOL& bValidConfig) const; + FX_BOOL LoadOCGState(const CPDF_Dictionary* pOCGDict) const; + FX_BOOL GetOCGVisible(const CPDF_Dictionary* pOCGDict); + FX_BOOL GetOCGVE(CPDF_Array* pExpression, + FX_BOOL bFromConfig, + int nLevel = 0); + FX_BOOL LoadOCMDState(const CPDF_Dictionary* pOCMDDict, FX_BOOL bFromConfig); + + CPDF_Document* m_pDocument; + UsageType m_eUsageType; + std::map<const CPDF_Dictionary*, FX_BOOL> m_OCGStates; +}; + +class CPDF_ActionFields { + public: + explicit CPDF_ActionFields(const CPDF_Action* pAction) : m_pAction(pAction) {} + + uint32_t GetFieldsCount() const; + std::vector<CPDF_Object*> GetAllFields() const; + CPDF_Object* GetField(uint32_t iIndex) const; + + protected: + const CPDF_Action* const m_pAction; +}; + +#define PDFNAMED_NEXTPAGE 1 +#define PDFNAMED_PREVPAGE 2 +#define PDFNAMED_FIRSTPAGE 3 +#define PDFNAMED_LASTPAGE 4 +#define PDFJS_MAXLENGTH 64 +class CPDF_Action { + public: + enum ActionType { + Unknown = 0, + GoTo, + GoToR, + GoToE, + Launch, + Thread, + URI, + Sound, + Movie, + Hide, + Named, + SubmitForm, + ResetForm, + ImportData, + JavaScript, + SetOCGState, + Rendition, + Trans, + GoTo3DView + }; + + CPDF_Action() : m_pDict(nullptr) {} + explicit CPDF_Action(CPDF_Dictionary* pDict) : m_pDict(pDict) {} + + CPDF_Dictionary* GetDict() const { return m_pDict; } + CFX_ByteString GetTypeName() const { return m_pDict->GetStringBy("S"); } + ActionType GetType() const; + CPDF_Dest GetDest(CPDF_Document* pDoc) const; + CFX_WideString GetFilePath() const; + FX_BOOL GetNewWindow() const { return m_pDict->GetBooleanBy("NewWindow"); } + CFX_ByteString GetURI(CPDF_Document* pDoc) const; + FX_BOOL GetMouseMap() const { return m_pDict->GetBooleanBy("IsMap"); } + FX_BOOL GetHideStatus() const { return m_pDict->GetBooleanBy("H", TRUE); } + CFX_ByteString GetNamedAction() const { return m_pDict->GetStringBy("N"); } + uint32_t GetFlags() const { return m_pDict->GetIntegerBy("Flags"); } + CFX_WideString GetJavaScript() const; + CPDF_Dictionary* GetAnnot() const; + int32_t GetOperationType() const; + CPDF_Stream* GetSoundStream() const { return m_pDict->GetStreamBy("Sound"); } + FX_FLOAT GetVolume() const { return m_pDict->GetNumberBy("Volume"); } + FX_BOOL IsSynchronous() const { return m_pDict->GetBooleanBy("Synchronous"); } + FX_BOOL IsRepeat() const { return m_pDict->GetBooleanBy("Repeat"); } + FX_BOOL IsMixPlay() const { return m_pDict->GetBooleanBy("Mix"); } + uint32_t GetSubActionsCount() const; + CPDF_Action GetSubAction(uint32_t iIndex) const; + + protected: + CPDF_Dictionary* const m_pDict; +}; + +class CPDF_AAction { + public: + enum AActionType { + CursorEnter = 0, + CursorExit, + ButtonDown, + ButtonUp, + GetFocus, + LoseFocus, + PageOpen, + PageClose, + PageVisible, + PageInvisible, + OpenPage, + ClosePage, + KeyStroke, + Format, + Validate, + Calculate, + CloseDocument, + SaveDocument, + DocumentSaved, + PrintDocument, + DocumentPrinted + }; + + CPDF_AAction() : m_pDict(nullptr) {} + explicit CPDF_AAction(CPDF_Dictionary* pDict) : m_pDict(pDict) {} + + FX_BOOL ActionExist(AActionType eType) const; + CPDF_Action GetAction(AActionType eType) const; + CPDF_Dictionary* GetDict() const { return m_pDict; } + + protected: + CPDF_Dictionary* const m_pDict; +}; + +class CPDF_DocJSActions { + public: + explicit CPDF_DocJSActions(CPDF_Document* pDoc); + + int CountJSActions() const; + CPDF_Action GetJSAction(int index, CFX_ByteString& csName) const; + CPDF_Action GetJSAction(const CFX_ByteString& csName) const; + int FindJSAction(const CFX_ByteString& csName) const; + CPDF_Document* GetDocument() const { return m_pDocument; } + + protected: + CPDF_Document* const m_pDocument; +}; + +class CPDF_FileSpec { + public: + CPDF_FileSpec(); + explicit CPDF_FileSpec(CPDF_Object* pObj) : m_pObj(pObj) {} + + // Convert a platform dependent file name into pdf format. + static CFX_WideString EncodeFileName(const CFX_WideStringC& filepath); + + // Convert a pdf file name into platform dependent format. + static CFX_WideString DecodeFileName(const CFX_WideStringC& filepath); + + CPDF_Object* GetObj() const { return m_pObj; } + bool GetFileName(CFX_WideString* wsFileName) const; + + // Set this file spec to refer to a file name (not a url). + void SetFileName(const CFX_WideStringC& wsFileName); + + protected: + CPDF_Object* m_pObj; +}; + +class CPDF_LinkList { + public: + CPDF_LinkList(); + ~CPDF_LinkList(); + + CPDF_Link GetLinkAtPoint(CPDF_Page* pPage, + FX_FLOAT pdf_x, + FX_FLOAT pdf_y, + int* z_order); + + private: + const std::vector<CPDF_Dictionary*>* GetPageLinks(CPDF_Page* pPage); + void LoadPageLinks(CPDF_Page* pPage, std::vector<CPDF_Dictionary*>* pList); + + std::map<uint32_t, std::vector<CPDF_Dictionary*>> m_PageMap; +}; + +class CPDF_Link { + public: + CPDF_Link() : m_pDict(nullptr) {} + explicit CPDF_Link(CPDF_Dictionary* pDict) : m_pDict(pDict) {} + + CPDF_Dictionary* GetDict() const { return m_pDict; } + + CFX_FloatRect GetRect(); + CPDF_Dest GetDest(CPDF_Document* pDoc); + CPDF_Action GetAction(); + + protected: + CPDF_Dictionary* m_pDict; +}; + +#define ANNOTFLAG_INVISIBLE 0x0001 +#define ANNOTFLAG_HIDDEN 0x0002 +#define ANNOTFLAG_PRINT 0x0004 +#define ANNOTFLAG_NOZOOM 0x0008 +#define ANNOTFLAG_NOROTATE 0x0010 +#define ANNOTFLAG_NOVIEW 0x0020 +#define ANNOTFLAG_READONLY 0x0040 +#define ANNOTFLAG_LOCKED 0x0080 +#define ANNOTFLAG_TOGGLENOVIEW 0x0100 + +class CPDF_Annot : public CFX_PrivateData { + public: + enum AppearanceMode { Normal, Rollover, Down }; + + CPDF_Annot(CPDF_Dictionary* pDict, CPDF_AnnotList* pList); + ~CPDF_Annot(); + + CFX_ByteString GetSubType() const; + uint32_t GetFlags() const; + void GetRect(CFX_FloatRect& rect) const; + const CPDF_Dictionary* GetAnnotDict() const { return m_pAnnotDict; } + CPDF_Dictionary* GetAnnotDict() { return m_pAnnotDict; } + FX_BOOL DrawAppearance(CPDF_Page* pPage, + CFX_RenderDevice* pDevice, + const CFX_Matrix* pUser2Device, + AppearanceMode mode, + const CPDF_RenderOptions* pOptions); + FX_BOOL DrawInContext(const CPDF_Page* pPage, + CPDF_RenderContext* pContext, + const CFX_Matrix* pUser2Device, + AppearanceMode mode); + void ClearCachedAP(); + void DrawBorder(CFX_RenderDevice* pDevice, + const CFX_Matrix* pUser2Device, + const CPDF_RenderOptions* pOptions); + CPDF_Form* GetAPForm(const CPDF_Page* pPage, AppearanceMode mode); + + private: + CPDF_Dictionary* const m_pAnnotDict; + CPDF_AnnotList* const m_pList; + const CFX_ByteString m_sSubtype; + std::map<CPDF_Stream*, CPDF_Form*> m_APMap; +}; + +class CPDF_AnnotList { + public: + explicit CPDF_AnnotList(CPDF_Page* pPage); + ~CPDF_AnnotList(); + + void DisplayAnnots(CPDF_Page* pPage, + CPDF_RenderContext* pContext, + FX_BOOL bPrinting, + CFX_Matrix* pMatrix, + FX_BOOL bShowWidget, + CPDF_RenderOptions* pOptions) { + DisplayAnnots(pPage, nullptr, pContext, bPrinting, pMatrix, + bShowWidget ? 3 : 1, pOptions, nullptr); + } + + void DisplayAnnots(CPDF_Page* pPage, + CFX_RenderDevice* pDevice, + CPDF_RenderContext* pContext, + FX_BOOL bPrinting, + CFX_Matrix* pMatrix, + uint32_t dwAnnotFlags, + CPDF_RenderOptions* pOptions, + FX_RECT* pClipRect); + size_t Count() const { return m_AnnotList.size(); } + CPDF_Annot* GetAt(size_t index) const { return m_AnnotList[index]; } + const std::vector<CPDF_Annot*>& All() const { return m_AnnotList; } + CPDF_Document* GetDocument() const { return m_pDocument; } + + protected: + void DisplayPass(CPDF_Page* pPage, + CFX_RenderDevice* pDevice, + CPDF_RenderContext* pContext, + FX_BOOL bPrinting, + CFX_Matrix* pMatrix, + FX_BOOL bWidget, + CPDF_RenderOptions* pOptions, + FX_RECT* clip_rect); + + CPDF_Document* const m_pDocument; + std::vector<CPDF_Annot*> m_AnnotList; +}; + +#define COLORTYPE_TRANSPARENT 0 +#define COLORTYPE_GRAY 1 +#define COLORTYPE_RGB 2 +#define COLORTYPE_CMYK 3 +class CPDF_DefaultAppearance { + public: + CPDF_DefaultAppearance() {} + explicit CPDF_DefaultAppearance(const CFX_ByteString& csDA) : m_csDA(csDA) {} + + CPDF_DefaultAppearance(const CPDF_DefaultAppearance& cDA) { + m_csDA = cDA.GetStr(); + } + + CFX_ByteString GetStr() const { return m_csDA; } + FX_BOOL HasFont(); + CFX_ByteString GetFontString(); + void GetFont(CFX_ByteString& csFontNameTag, FX_FLOAT& fFontSize); + FX_BOOL HasColor(FX_BOOL bStrokingOperation = FALSE); + CFX_ByteString GetColorString(FX_BOOL bStrokingOperation = FALSE); + void GetColor(int& iColorType, + FX_FLOAT fc[4], + FX_BOOL bStrokingOperation = FALSE); + void GetColor(FX_ARGB& color, + int& iColorType, + FX_BOOL bStrokingOperation = FALSE); + FX_BOOL HasTextMatrix(); + CFX_ByteString GetTextMatrixString(); + CFX_Matrix GetTextMatrix(); + + protected: + CFX_ByteString m_csDA; +}; + +#define FIELDTYPE_UNKNOWN 0 +#define FIELDTYPE_PUSHBUTTON 1 +#define FIELDTYPE_CHECKBOX 2 +#define FIELDTYPE_RADIOBUTTON 3 +#define FIELDTYPE_COMBOBOX 4 +#define FIELDTYPE_LISTBOX 5 +#define FIELDTYPE_TEXTFIELD 6 +#define FIELDTYPE_SIGNATURE 7 +class CPDF_InterForm : public CFX_PrivateData { + public: + CPDF_InterForm(CPDF_Document* pDocument, FX_BOOL bUpdateAP); + ~CPDF_InterForm(); + + static void EnableUpdateAP(FX_BOOL bUpdateAP); + + static FX_BOOL UpdatingAPEnabled(); + + static CFX_ByteString GenerateNewResourceName(const CPDF_Dictionary* pResDict, + const FX_CHAR* csType, + int iMinLen = 2, + const FX_CHAR* csPrefix = ""); + + static CPDF_Font* AddStandardFont(CPDF_Document* pDocument, + CFX_ByteString csFontName); + + static CFX_ByteString GetNativeFont(uint8_t iCharSet, + void* pLogFont = nullptr); + + static CFX_ByteString GetNativeFont(void* pLogFont = nullptr); + + static uint8_t GetNativeCharSet(); + + static CPDF_Font* AddNativeFont(uint8_t iCharSet, CPDF_Document* pDocument); + + static CPDF_Font* AddNativeFont(CPDF_Document* pDocument); + + FX_BOOL ValidateFieldName(CFX_WideString& csNewFieldName, int iType); + + FX_BOOL ValidateFieldName(const CPDF_FormField* pField, + CFX_WideString& csNewFieldName); + + FX_BOOL ValidateFieldName(const CPDF_FormControl* pControl, + CFX_WideString& csNewFieldName); + + uint32_t CountFields(const CFX_WideString& csFieldName = L""); + + CPDF_FormField* GetField(uint32_t index, + const CFX_WideString& csFieldName = L""); + + CPDF_FormField* GetFieldByDict(CPDF_Dictionary* pFieldDict) const; + + CPDF_FormControl* GetControlAtPoint(CPDF_Page* pPage, + FX_FLOAT pdf_x, + FX_FLOAT pdf_y, + int* z_order) const; + + CPDF_FormControl* GetControlByDict(const CPDF_Dictionary* pWidgetDict) const; + + CPDF_Document* GetDocument() const { return m_pDocument; } + + CPDF_Dictionary* GetFormDict() const { return m_pFormDict; } + + FX_BOOL NeedConstructAP(); + + void NeedConstructAP(FX_BOOL bNeedAP); + + int CountFieldsInCalculationOrder(); + + CPDF_FormField* GetFieldInCalculationOrder(int index); + + int FindFieldInCalculationOrder(const CPDF_FormField* pField); + + uint32_t CountFormFonts(); + + CPDF_Font* GetFormFont(uint32_t index, CFX_ByteString& csNameTag); + + CPDF_Font* GetFormFont(CFX_ByteString csNameTag); + + CPDF_Font* GetFormFont(CFX_ByteString csFontName, CFX_ByteString& csNameTag); + + CPDF_Font* GetNativeFormFont(uint8_t iCharSet, CFX_ByteString& csNameTag); + + CPDF_Font* GetNativeFormFont(CFX_ByteString& csNameTag); + + FX_BOOL FindFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag); + + FX_BOOL FindFormFont(CFX_ByteString csFontName, + CPDF_Font*& pFont, + CFX_ByteString& csNameTag); + + inline FX_BOOL FindFormFont(CFX_WideString csFontName, + CPDF_Font*& pFont, + CFX_ByteString& csNameTag) { + return FindFormFont(PDF_EncodeText(csFontName), pFont, csNameTag); + } + + void AddFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag); + + CPDF_Font* AddNativeFormFont(uint8_t iCharSet, CFX_ByteString& csNameTag); + + CPDF_Font* AddNativeFormFont(CFX_ByteString& csNameTag); + + void RemoveFormFont(const CPDF_Font* pFont); + + void RemoveFormFont(CFX_ByteString csNameTag); + + CPDF_DefaultAppearance GetDefaultAppearance(); + + CPDF_Font* GetDefaultFormFont(); + + int GetFormAlignment(); + + CPDF_FormField* CheckRequiredFields( + const std::vector<CPDF_FormField*>* fields, + bool bIncludeOrExclude) const; + + CFDF_Document* ExportToFDF(const CFX_WideStringC& pdf_path, + bool bSimpleFileSpec = false) const; + + CFDF_Document* ExportToFDF(const CFX_WideStringC& pdf_path, + const std::vector<CPDF_FormField*>& fields, + bool bIncludeOrExclude = true, + bool bSimpleFileSpec = false) const; + + FX_BOOL ImportFromFDF(const CFDF_Document* pFDFDoc, FX_BOOL bNotify = FALSE); + + bool ResetForm(const std::vector<CPDF_FormField*>& fields, + bool bIncludeOrExclude = true, + bool bNotify = false); + + bool ResetForm(bool bNotify = false); + + CPDF_FormNotify* GetFormNotify() const { return m_pFormNotify; } + + void SetFormNotify(const CPDF_FormNotify* pNotify); + + FX_BOOL IsUpdated() { return m_bUpdated; } + + void ClearUpdatedFlag() { m_bUpdated = FALSE; } + + FX_BOOL HasXFAForm() const; + + void FixPageFields(const CPDF_Page* pPage); + + protected: + static FX_BOOL m_bUpdateAP; + + void LoadField(CPDF_Dictionary* pFieldDict, int nLevel = 0); + + CPDF_Object* GetFieldAttr(CPDF_Dictionary* pFieldDict, const FX_CHAR* name); + + CPDF_FormField* AddTerminalField(CPDF_Dictionary* pFieldDict); + + CPDF_FormControl* AddControl(const CPDF_FormField* pField, + CPDF_Dictionary* pWidgetDict); + + void FDF_ImportField(CPDF_Dictionary* pField, + const CFX_WideString& parent_name, + FX_BOOL bNotify = FALSE, + int nLevel = 0); + + FX_BOOL ValidateFieldName(CFX_WideString& csNewFieldName, + int iType, + const CPDF_FormField* pExcludedField, + const CPDF_FormControl* pExcludedControl); + + int CompareFieldName(const CFX_WideString& name1, + const CFX_WideString& name2); + + int CompareFieldName(const CFX_ByteString& name1, + const CFX_ByteString& name2); + + CPDF_Document* const m_pDocument; + + FX_BOOL m_bGenerateAP; + + CPDF_Dictionary* m_pFormDict; + + std::map<const CPDF_Dictionary*, CPDF_FormControl*> m_ControlMap; + + std::unique_ptr<CFieldTree> m_pFieldTree; + + CFX_ByteString m_bsEncoding; + + CPDF_FormNotify* m_pFormNotify; + + FX_BOOL m_bUpdated; + friend class CPDF_FormControl; + friend class CPDF_FormField; +}; + +#define FORMFIELD_READONLY 0x01 +#define FORMFIELD_REQUIRED 0x02 +#define FORMFIELD_NOEXPORT 0x04 +#define FORMRADIO_NOTOGGLEOFF 0x100 +#define FORMRADIO_UNISON 0x200 +#define FORMTEXT_MULTILINE 0x100 +#define FORMTEXT_PASSWORD 0x200 +#define FORMTEXT_NOSCROLL 0x400 +#define FORMTEXT_COMB 0x800 +#define FORMCOMBO_EDIT 0x100 +#define FORMLIST_MULTISELECT 0x100 +class CPDF_FormField { + public: + enum Type { + Unknown, + PushButton, + RadioButton, + CheckBox, + Text, + RichText, + File, + ListBox, + ComboBox, + Sign + }; + + CFX_WideString GetFullName(); + + Type GetType() const { return m_Type; } + uint32_t GetFlags() const { return m_Flags; } + + CPDF_Dictionary* GetFieldDict() const { return m_pDict; } + void SetFieldDict(CPDF_Dictionary* pDict) { m_pDict = pDict; } + + FX_BOOL ResetField(FX_BOOL bNotify = FALSE); + + int CountControls() { return m_ControlList.GetSize(); } + + CPDF_FormControl* GetControl(int index) { return m_ControlList.GetAt(index); } + + int GetControlIndex(const CPDF_FormControl* pControl); + + int GetFieldType(); + + CPDF_AAction GetAdditionalAction(); + + CFX_WideString GetAlternateName(); + + CFX_WideString GetMappingName(); + + uint32_t GetFieldFlags(); + + CFX_ByteString GetDefaultStyle(); + + CFX_WideString GetRichTextString(); + + CFX_WideString GetValue(); + + CFX_WideString GetDefaultValue(); + + FX_BOOL SetValue(const CFX_WideString& value, FX_BOOL bNotify = FALSE); + + int GetMaxLen(); + + int CountSelectedItems(); + + int GetSelectedIndex(int index); + + FX_BOOL ClearSelection(FX_BOOL bNotify = FALSE); + + FX_BOOL IsItemSelected(int index); + + FX_BOOL SetItemSelection(int index, + FX_BOOL bSelected, + FX_BOOL bNotify = FALSE); + + FX_BOOL IsItemDefaultSelected(int index); + + int GetDefaultSelectedItem(); + + int CountOptions(); + + CFX_WideString GetOptionLabel(int index); + + CFX_WideString GetOptionValue(int index); + + int FindOption(CFX_WideString csOptLabel); + + int FindOptionValue(const CFX_WideString& csOptValue); + + FX_BOOL CheckControl(int iControlIndex, bool bChecked, bool bNotify = false); + + int GetTopVisibleIndex(); + + int CountSelectedOptions(); + + int GetSelectedOptionIndex(int index); + + FX_BOOL IsOptionSelected(int iOptIndex); + + FX_BOOL SelectOption(int iOptIndex, + FX_BOOL bSelected, + FX_BOOL bNotify = FALSE); + + FX_BOOL ClearSelectedOptions(FX_BOOL bNotify = FALSE); + +#ifdef PDF_ENABLE_XFA + FX_BOOL ClearOptions(FX_BOOL bNotify = FALSE); + + int InsertOption(CFX_WideString csOptLabel, + int index = -1, + FX_BOOL bNotify = FALSE); +#endif // PDF_ENABLE_XFA + + FX_FLOAT GetFontSize() { return m_FontSize; } + + CPDF_Font* GetFont() { return m_pFont; } + + protected: + CPDF_FormField(CPDF_InterForm* pForm, CPDF_Dictionary* pDict); + ~CPDF_FormField(); + + CFX_WideString GetValue(FX_BOOL bDefault); + + FX_BOOL SetValue(const CFX_WideString& value, + FX_BOOL bDefault, + FX_BOOL bNotify); + + void SyncFieldFlags(); + + int FindListSel(CPDF_String* str); + + CFX_WideString GetOptionText(int index, int sub_index); + + void LoadDA(); + + void UpdateAP(CPDF_FormControl* pControl); + + CFX_WideString GetCheckValue(FX_BOOL bDefault); + + FX_BOOL SetCheckValue(const CFX_WideString& value, + FX_BOOL bDefault, + FX_BOOL bNotify); + + CPDF_FormField::Type m_Type; + uint32_t m_Flags; + CPDF_InterForm* m_pForm; + CPDF_Dictionary* m_pDict; + CFX_ArrayTemplate<CPDF_FormControl*> m_ControlList; + FX_FLOAT m_FontSize; + CPDF_Font* m_pFont; + + friend class CPDF_InterForm; + friend class CPDF_FormControl; +}; + +CPDF_Object* FPDF_GetFieldAttr(CPDF_Dictionary* pFieldDict, + const FX_CHAR* name, + int nLevel = 0); +class CPDF_IconFit { + public: + enum ScaleMethod { Always = 0, Bigger, Smaller, Never }; + + explicit CPDF_IconFit(const CPDF_Dictionary* pDict) : m_pDict(pDict) {} + + ScaleMethod GetScaleMethod(); + FX_BOOL IsProportionalScale(); + void GetIconPosition(FX_FLOAT& fLeft, FX_FLOAT& fBottom); + FX_BOOL GetFittingBounds(); + const CPDF_Dictionary* GetDict() const { return m_pDict; } + + protected: + const CPDF_Dictionary* const m_pDict; +}; + +#define TEXTPOS_CAPTION 0 +#define TEXTPOS_ICON 1 +#define TEXTPOS_BELOW 2 +#define TEXTPOS_ABOVE 3 +#define TEXTPOS_RIGHT 4 +#define TEXTPOS_LEFT 5 +#define TEXTPOS_OVERLAID 6 + +class CPDF_FormControl { + public: + enum HighlightingMode { None = 0, Invert, Outline, Push, Toggle }; + + CPDF_FormField::Type GetType() const { return m_pField->GetType(); } + CPDF_InterForm* GetInterForm() const { return m_pForm; } + CPDF_FormField* GetField() const { return m_pField; } + CPDF_Dictionary* GetWidget() const { return m_pWidgetDict; } + CFX_FloatRect GetRect() const; + + void DrawControl(CFX_RenderDevice* pDevice, + CFX_Matrix* pMatrix, + CPDF_Page* pPage, + CPDF_Annot::AppearanceMode mode, + const CPDF_RenderOptions* pOptions = nullptr); + + CFX_ByteString GetCheckedAPState(); + CFX_WideString GetExportValue(); + + bool IsChecked() const; + bool IsDefaultChecked() const; + + HighlightingMode GetHighlightingMode(); + bool HasMKEntry(CFX_ByteString csEntry) const; + int GetRotation(); + + inline FX_ARGB GetBorderColor(int& iColorType) { + return GetColor(iColorType, "BC"); + } + + FX_FLOAT GetOriginalBorderColor(int index) { + return GetOriginalColor(index, "BC"); + } + + void GetOriginalBorderColor(int& iColorType, FX_FLOAT fc[4]) { + GetOriginalColor(iColorType, fc, "BC"); + } + + FX_ARGB GetBackgroundColor(int& iColorType) { + return GetColor(iColorType, "BG"); + } + + FX_FLOAT GetOriginalBackgroundColor(int index) { + return GetOriginalColor(index, "BG"); + } + + void GetOriginalBackgroundColor(int& iColorType, FX_FLOAT fc[4]) { + GetOriginalColor(iColorType, fc, "BG"); + } + + CFX_WideString GetNormalCaption() { return GetCaption("CA"); } + + CFX_WideString GetRolloverCaption() { return GetCaption("RC"); } + + CFX_WideString GetDownCaption() { return GetCaption("AC"); } + + CPDF_Stream* GetNormalIcon() { return GetIcon("I"); } + + CPDF_Stream* GetRolloverIcon() { return GetIcon("RI"); } + + CPDF_Stream* GetDownIcon() { return GetIcon("IX"); } + + CPDF_IconFit GetIconFit(); + + int GetTextPosition(); + + CPDF_Action GetAction(); + + CPDF_AAction GetAdditionalAction(); + + CPDF_DefaultAppearance GetDefaultAppearance(); + + CPDF_Font* GetDefaultControlFont(); + + int GetControlAlignment(); + + protected: + CPDF_FormControl(CPDF_FormField* pField, CPDF_Dictionary* pWidgetDict); + + CFX_ByteString GetOnStateName() const; + void SetOnStateName(const CFX_ByteString& csOn); + + void CheckControl(FX_BOOL bChecked); + + FX_ARGB GetColor(int& iColorType, CFX_ByteString csEntry); + + FX_FLOAT GetOriginalColor(int index, CFX_ByteString csEntry); + + void GetOriginalColor(int& iColorType, + FX_FLOAT fc[4], + CFX_ByteString csEntry); + + CFX_WideString GetCaption(CFX_ByteString csEntry); + + CPDF_Stream* GetIcon(CFX_ByteString csEntry); + + CPDF_ApSettings GetMK() const; + + CPDF_InterForm* m_pForm; + + CPDF_FormField* m_pField; + + CPDF_Dictionary* m_pWidgetDict; + friend class CPDF_InterForm; + friend class CPDF_FormField; +}; + +class CPDF_FormNotify { + public: + virtual ~CPDF_FormNotify() {} + + virtual int BeforeValueChange(CPDF_FormField* pField, + const CFX_WideString& csValue) { + return 0; + } + virtual void AfterValueChange(CPDF_FormField* pField) {} + virtual int BeforeSelectionChange(CPDF_FormField* pField, + const CFX_WideString& csValue) { + return 0; + } + virtual void AfterSelectionChange(CPDF_FormField* pField) {} + virtual void AfterCheckedStatusChange(CPDF_FormField* pField) {} + virtual int BeforeFormReset(CPDF_InterForm* pForm) { return 0; } + virtual void AfterFormReset(CPDF_InterForm* pForm) {} + virtual int BeforeFormImportData(CPDF_InterForm* pForm) { return 0; } + virtual void AfterFormImportData(CPDF_InterForm* pForm) {} +}; + +class CPDF_PageLabel { + public: + explicit CPDF_PageLabel(CPDF_Document* pDocument) : m_pDocument(pDocument) {} + + CFX_WideString GetLabel(int nPage) const; + int32_t GetPageByLabel(const CFX_ByteStringC& bsLabel) const; + int32_t GetPageByLabel(const CFX_WideStringC& wsLabel) const; + + protected: + CPDF_Document* const m_pDocument; +}; + +class CPDF_Metadata { + public: + explicit CPDF_Metadata(CPDF_Document* pDoc); + ~CPDF_Metadata(); + + const CXML_Element* GetRoot() const; + + private: + std::unique_ptr<CXML_Element> m_pXmlElement; +}; + +class CPDF_ViewerPreferences { + public: + explicit CPDF_ViewerPreferences(CPDF_Document* pDoc); + ~CPDF_ViewerPreferences(); + + FX_BOOL IsDirectionR2L() const; + FX_BOOL PrintScaling() const; + int32_t NumCopies() const; + CPDF_Array* PrintPageRange() const; + CFX_ByteString Duplex() const; + + protected: + CPDF_Document* const m_pDoc; +}; + +class CPDF_ApSettings { + public: + explicit CPDF_ApSettings(CPDF_Dictionary* pDict); + + bool HasMKEntry(const CFX_ByteStringC& csEntry) const; + int GetRotation() const; + + FX_ARGB GetBorderColor(int& iColorType) const { + return GetColor(iColorType, "BC"); + } + + FX_FLOAT GetOriginalBorderColor(int index) const { + return GetOriginalColor(index, "BC"); + } + + void GetOriginalBorderColor(int& iColorType, FX_FLOAT fc[4]) const { + GetOriginalColor(iColorType, fc, "BC"); + } + + FX_ARGB GetBackgroundColor(int& iColorType) const { + return GetColor(iColorType, "BG"); + } + + FX_FLOAT GetOriginalBackgroundColor(int index) const { + return GetOriginalColor(index, "BG"); + } + + void GetOriginalBackgroundColor(int& iColorType, FX_FLOAT fc[4]) const { + GetOriginalColor(iColorType, fc, "BG"); + } + + CFX_WideString GetNormalCaption() const { return GetCaption("CA"); } + + CFX_WideString GetRolloverCaption() const { return GetCaption("RC"); } + + CFX_WideString GetDownCaption() const { return GetCaption("AC"); } + + CPDF_Stream* GetNormalIcon() const { return GetIcon("I"); } + + CPDF_Stream* GetRolloverIcon() const { return GetIcon("RI"); } + + CPDF_Stream* GetDownIcon() const { return GetIcon("IX"); } + + CPDF_IconFit GetIconFit() const; + + int GetTextPosition() const; + + protected: + friend class CPDF_FormControl; + + FX_ARGB GetColor(int& iColorType, const CFX_ByteStringC& csEntry) const; + + FX_FLOAT GetOriginalColor(int index, const CFX_ByteStringC& csEntry) const; + + void GetOriginalColor(int& iColorType, + FX_FLOAT fc[4], + const CFX_ByteStringC& csEntry) const; + + CFX_WideString GetCaption(const CFX_ByteStringC& csEntry) const; + + CPDF_Stream* GetIcon(const CFX_ByteStringC& csEntry) const; + + CPDF_Dictionary* const m_pDict; +}; + +CFX_WideString FILESPEC_EncodeFileName(const CFX_WideStringC& filepath); + +#endif // CORE_FPDFDOC_INCLUDE_FPDF_DOC_H_ |