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.
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
10 #include "../fxcrt/fx_ext.h"
12 #ifndef _FPDF_OBJECTS_
13 #include "fpdf_objects.h"
18 class CPDF_SecurityHandler;
19 class CPDF_StandardSecurityHandler;
20 class CPDF_CryptoHandler;
26 class CFX_AffineMatrix;
29 class CPDF_DocPageData;
30 class CPDF_DocRenderData;
35 class CPDF_ColorSpace;
37 class CPDF_FontEncoding;
38 class CPDF_IccProfile;
39 class CFX_PrivateData;
40 #define FPDFPERM_PRINT 0x0004
41 #define FPDFPERM_MODIFY 0x0008
42 #define FPDFPERM_EXTRACT 0x0010
43 #define FPDFPERM_ANNOT_FORM 0x0020
44 #define FPDFPERM_FILL_FORM 0x0100
45 #define FPDFPERM_EXTRACT_ACCESS 0x0200
46 #define FPDFPERM_ASSEMBLE 0x0400
47 #define FPDFPERM_PRINT_HIGH 0x0800
48 #define FPDF_PAGE_MAX_NUM 0xFFFFF
49 class IPDF_EnumPageHandler
52 virtual ~IPDF_EnumPageHandler() { }
53 virtual FX_BOOL EnumPage(CPDF_Dictionary* pPageDict) = 0;
55 class CPDF_Document : public CFX_PrivateData, public CPDF_IndirectObjects
59 CPDF_Document(IPDF_DocParser* pParser);
65 IPDF_DocParser* GetParser() const
70 CPDF_Dictionary* GetRoot() const
75 CPDF_Dictionary* GetInfo() const
80 void GetID(CFX_ByteString& id1, CFX_ByteString& id2) const
86 int GetPageCount() const;
88 CPDF_Dictionary* GetPage(int iPage);
90 int GetPageIndex(FX_DWORD objnum);
92 void EnumPages(IPDF_EnumPageHandler* pHandler);
94 FX_DWORD GetUserPermissions(FX_BOOL bCheckRevision = FALSE) const;
96 FX_BOOL IsOwner() const;
100 CPDF_DocPageData* GetPageData()
102 return GetValidatePageData();
105 void ClearPageData();
107 void RemoveColorSpaceFromPageData(CPDF_Object* pObject);
110 CPDF_DocRenderData* GetRenderData()
112 return GetValidateRenderData();
115 void ClearRenderData();
117 void ClearRenderFont();
120 FX_BOOL IsFormStream(FX_DWORD objnum, FX_BOOL& bForm) const;
125 CPDF_Font* LoadFont(CPDF_Dictionary* pFontDict);
127 CPDF_Font* FindFont(CPDF_Dictionary* pFontDict);
129 CPDF_ColorSpace* LoadColorSpace(CPDF_Object* pCSObj, CPDF_Dictionary* pResources = NULL);
131 CPDF_Pattern* LoadPattern(CPDF_Object* pObj, FX_BOOL bShading, const CFX_AffineMatrix* matrix = NULL);
133 CPDF_Image* LoadImageF(CPDF_Object* pObj);
135 CPDF_StreamAcc* LoadFontFile(CPDF_Stream* pStream);
137 CPDF_IccProfile* LoadIccProfile(CPDF_Stream* pStream);
139 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
141 CPDF_Font* AddWindowsFont(LOGFONTA* pLogFont, FX_BOOL bVert, FX_BOOL bTranslateName = FALSE);
142 CPDF_Font* AddWindowsFont(LOGFONTW* pLogFont, FX_BOOL bVert, FX_BOOL bTranslateName = FALSE);
144 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
145 CPDF_Font* AddMacFont(CTFontRef pFont, FX_BOOL bVert, FX_BOOL bTranslateName = FALSE);
148 CPDF_Font* AddStandardFont(const FX_CHAR* font, CPDF_FontEncoding* pEncoding);
151 CPDF_Font* AddFont(CFX_Font* pFont, int charset, FX_BOOL bVert);
155 CPDF_Dictionary* CreateNewPage(int iPage);
157 void DeletePage(int iPage);
160 void LoadAsynDoc(CPDF_Dictionary *pLinearized);
164 CPDF_Dictionary* m_pRootDict;
166 CPDF_Dictionary* m_pInfoDict;
168 CFX_ByteString m_ID1;
170 CFX_ByteString m_ID2;
173 FX_BOOL m_bLinearized;
175 FX_DWORD m_dwFirstPageNo;
177 FX_DWORD m_dwFirstPageObjNum;
179 CFX_DWordArray m_PageList;
181 int _GetPageCount() const;
182 CPDF_Dictionary* _FindPDFPage(CPDF_Dictionary* pPages, int iPage, int nPagesToGo, int level);
183 int _FindPageIndex(CPDF_Dictionary* pNode, FX_DWORD& skip_count, FX_DWORD objnum, int& index, int level = 0);
184 FX_BOOL IsContentUsedElsewhere(FX_DWORD objnum, CPDF_Dictionary* pPageDict);
185 FX_BOOL CheckOCGVisible(CPDF_Dictionary* pOCG, FX_BOOL bPrinting);
186 CPDF_DocPageData* GetValidatePageData();
187 CPDF_DocRenderData* GetValidateRenderData();
188 friend class CPDF_Creator;
189 friend class CPDF_Parser;
190 friend class CPDF_DataAvail;
191 friend class CPDF_OCContext;
195 CPDF_DocPageData* m_pDocPage;
197 CPDF_DocRenderData* m_pDocRender;
201 #define PDFWORD_EOF 0
202 #define PDFWORD_NUMBER 1
203 #define PDFWORD_TEXT 2
204 #define PDFWORD_DELIMITER 3
205 #define PDFWORD_NAME 4
206 class CPDF_SimpleParser : public CFX_Object
210 CPDF_SimpleParser(FX_LPCBYTE pData, FX_DWORD dwSize);
212 CPDF_SimpleParser(FX_BSTR str);
214 CFX_ByteStringC GetWord();
216 FX_BOOL SearchToken(FX_BSTR token);
218 FX_BOOL SkipWord(FX_BSTR token);
220 FX_BOOL FindTagPair(FX_BSTR start_token, FX_BSTR end_token,
221 FX_DWORD& start_pos, FX_DWORD& end_pos);
223 FX_BOOL FindTagParam(FX_BSTR token, int nParams);
230 void SetPos(FX_DWORD pos)
232 ASSERT(pos <= m_dwSize);
237 void ParseWord(FX_LPCBYTE& pStart, FX_DWORD& dwSize, int& type);
245 class CPDF_SyntaxParser : public CFX_Object
250 virtual ~CPDF_SyntaxParser();
252 void InitParser(IFX_FileRead* pFileAccess, FX_DWORD HeaderOffset);
254 FX_FILESIZE SavePos()
259 void RestorePos(FX_FILESIZE pos)
264 CPDF_Object* GetObject(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, FX_DWORD gennum, int level, struct PARSE_CONTEXT* pContext = NULL, FX_BOOL bDecrypt = TRUE);
267 CPDF_Object* GetObjectByStrict(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, FX_DWORD gennum, int level, struct PARSE_CONTEXT* pContext = NULL);
271 CFX_ByteString GetString(FX_DWORD objnum, FX_DWORD gennum);
273 CFX_ByteString GetName();
275 CFX_ByteString GetKeyword();
277 void GetBinary(FX_BYTE* buffer, FX_DWORD size);
283 FX_BOOL SearchWord(FX_BSTR word, FX_BOOL bWholeWord, FX_BOOL bForward, FX_FILESIZE limit);
285 int SearchMultiWord(FX_BSTR words, FX_BOOL bWholeWord, FX_FILESIZE limit);
287 FX_FILESIZE FindTag(FX_BSTR tag, FX_FILESIZE limit);
289 void SetEncrypt(CPDF_CryptoHandler* pCryptoHandler)
291 m_pCryptoHandler = pCryptoHandler;
294 FX_BOOL IsEncrypted()
296 return m_pCryptoHandler != NULL;
299 FX_BOOL GetCharAt(FX_FILESIZE pos, FX_BYTE& ch);
301 FX_BOOL ReadBlock(FX_BYTE* pBuf, FX_DWORD size);
303 CFX_ByteString GetNextWord(FX_BOOL& bIsNumber);
306 virtual FX_BOOL GetNextChar(FX_BYTE& ch);
308 FX_BOOL GetCharAtBackward(FX_FILESIZE pos, FX_BYTE& ch);
312 FX_BOOL IsWholeWord(FX_FILESIZE startpos, FX_FILESIZE limit, FX_LPCBYTE tag, FX_DWORD taglen);
314 CFX_ByteString ReadString();
316 CFX_ByteString ReadHexString();
318 CPDF_Stream* ReadStream(CPDF_Dictionary* pDict, PARSE_CONTEXT* pContext, FX_DWORD objnum, FX_DWORD gennum);
322 FX_BOOL m_bFileStream;
324 int m_MetadataObjnum;
326 IFX_FileRead* m_pFileAccess;
328 FX_DWORD m_HeaderOffset;
330 FX_FILESIZE m_FileLen;
336 FX_FILESIZE m_BufOffset;
338 CPDF_CryptoHandler* m_pCryptoHandler;
340 FX_BYTE m_WordBuffer[257];
346 FX_FILESIZE m_dwWordPos;
347 friend class CPDF_Parser;
348 friend class CPDF_DataAvail;
351 #define PDFPARSE_TYPEONLY 1
352 #define PDFPARSE_NOSTREAM 2
353 struct PARSE_CONTEXT {
357 FX_FILESIZE m_DictStart;
359 FX_FILESIZE m_DictEnd;
361 FX_FILESIZE m_DataStart;
363 FX_FILESIZE m_DataEnd;
365 class IPDF_DocParser : public CFX_Object
368 virtual ~IPDF_DocParser() { }
369 virtual FX_DWORD GetRootObjNum() = 0;
371 virtual FX_DWORD GetInfoObjNum() = 0;
373 virtual CPDF_Object* ParseIndirectObject(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, PARSE_CONTEXT* pContext = NULL) = 0;
375 virtual FX_DWORD GetLastObjNum() = 0;
377 virtual CPDF_Array* GetIDArray() = 0;
379 virtual CPDF_Dictionary* GetEncryptDict() = 0;
381 FX_BOOL IsEncrypted()
383 return GetEncryptDict() != NULL;
386 virtual FX_DWORD GetPermissions(FX_BOOL bCheckRevision = FALSE) = 0;
388 virtual FX_BOOL IsOwner() = 0;
390 virtual FX_BOOL IsFormStream(FX_DWORD objnum, FX_BOOL& bForm) = 0;
393 #define PDFPARSE_ERROR_SUCCESS 0
394 #define PDFPARSE_ERROR_FILE 1
395 #define PDFPARSE_ERROR_FORMAT 2
396 #define PDFPARSE_ERROR_PASSWORD 3
397 #define PDFPARSE_ERROR_HANDLER 4
398 #define PDFPARSE_ERROR_CERT 5
399 class CPDF_Parser FX_FINAL : public IPDF_DocParser
404 ~CPDF_Parser() override;
406 FX_DWORD StartParse(FX_LPCSTR filename, FX_BOOL bReParse = FALSE);
408 FX_DWORD StartParse(FX_LPCWSTR filename, FX_BOOL bReParse = FALSE);
410 FX_DWORD StartParse(IFX_FileRead* pFile, FX_BOOL bReParse = FALSE, FX_BOOL bOwnFileRead = TRUE);
412 void CloseParser(FX_BOOL bReParse = FALSE);
414 virtual FX_DWORD GetPermissions(FX_BOOL bCheckRevision = FALSE) FX_OVERRIDE;
416 virtual FX_BOOL IsOwner() FX_OVERRIDE;
418 void SetPassword(const FX_CHAR* password)
420 m_Password = password;
423 CFX_ByteString GetPassword()
428 CPDF_SecurityHandler* GetSecurityHandler()
430 return m_pSecurityHandler;
433 CPDF_CryptoHandler* GetCryptoHandler()
435 return m_Syntax.m_pCryptoHandler;
438 void SetSecurityHandler(CPDF_SecurityHandler* pSecurityHandler, FX_BOOL bForced = FALSE);
440 CFX_ByteString GetRecipient()
442 return m_bsRecipient;
445 CPDF_Dictionary* GetTrailer()
450 FX_FILESIZE GetLastXRefOffset()
452 return m_LastXRefOffset;
455 CPDF_Document* GetDocument()
459 CFX_ArrayTemplate<CPDF_Dictionary *> * GetOtherTrailers()
464 virtual FX_DWORD GetRootObjNum() FX_OVERRIDE;
465 virtual FX_DWORD GetInfoObjNum() FX_OVERRIDE;
466 virtual CPDF_Array* GetIDArray() FX_OVERRIDE;
467 virtual CPDF_Dictionary* GetEncryptDict() FX_OVERRIDE
469 return m_pEncryptDict;
471 virtual CPDF_Object* ParseIndirectObject(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, PARSE_CONTEXT* pContext = NULL) FX_OVERRIDE;
472 virtual FX_DWORD GetLastObjNum() FX_OVERRIDE;
473 virtual FX_BOOL IsFormStream(FX_DWORD objnum, FX_BOOL& bForm) FX_OVERRIDE;
475 FX_FILESIZE GetObjectOffset(FX_DWORD objnum);
477 FX_FILESIZE GetObjectSize(FX_DWORD objnum);
479 int GetObjectVersion(FX_DWORD objnum)
481 return m_ObjVersion[objnum];
484 void GetIndirectBinary(FX_DWORD objnum, FX_BYTE*& pBuffer, FX_DWORD& size);
486 FX_BOOL GetFileStreamOption()
488 return m_Syntax.m_bFileStream;
491 void SetFileStreamOption(FX_BOOL b)
493 m_Syntax.m_bFileStream = b;
496 IFX_FileRead* GetFileAccess() const
498 return m_Syntax.m_pFileAccess;
501 int GetFileVersion() const
503 return m_FileVersion;
506 FX_BOOL IsXRefStream() const
508 return m_bXRefStream;
510 CPDF_Object* ParseIndirectObjectAt(CPDF_IndirectObjects* pObjList, FX_FILESIZE pos, FX_DWORD objnum,
511 struct PARSE_CONTEXT* pContext);
513 CPDF_Object* ParseIndirectObjectAtByStrict(CPDF_IndirectObjects* pObjList, FX_FILESIZE pos, FX_DWORD objnum,
514 struct PARSE_CONTEXT* pContext, FX_FILESIZE *pResultPos);
516 FX_DWORD StartAsynParse(IFX_FileRead* pFile, FX_BOOL bReParse = FALSE, FX_BOOL bOwnFileRead = TRUE);
518 FX_DWORD GetFirstPageNo()
520 return m_dwFirstPageNo;
524 CPDF_Document* m_pDocument;
526 CPDF_SyntaxParser m_Syntax;
527 FX_BOOL m_bOwnFileRead;
528 CPDF_Object* ParseDirect(CPDF_Object* pObj);
530 FX_BOOL LoadAllCrossRefV4(FX_FILESIZE pos);
532 FX_BOOL LoadAllCrossRefV5(FX_FILESIZE pos);
534 FX_BOOL LoadCrossRefV4(FX_FILESIZE pos, FX_FILESIZE streampos, FX_BOOL bSkip, FX_BOOL bFirst);
536 FX_BOOL LoadCrossRefV5(FX_FILESIZE pos, FX_FILESIZE& prev, FX_BOOL bMainXRef);
538 CPDF_Dictionary* LoadTrailerV4();
540 FX_BOOL RebuildCrossRef();
542 FX_DWORD SetEncryptHandler();
544 void ReleaseEncryptHandler();
546 FX_BOOL LoadLinearizedAllCrossRefV4(FX_FILESIZE pos, FX_DWORD dwObjCount);
548 FX_BOOL LoadLinearizedCrossRefV4(FX_FILESIZE pos, FX_DWORD dwObjCount);
550 FX_BOOL LoadLinearizedAllCrossRefV5(FX_FILESIZE pos);
552 FX_DWORD LoadLinearizedMainXRefTable();
554 CFX_MapPtrToPtr m_ObjectStreamMap;
556 CPDF_StreamAcc* GetObjectStream(FX_DWORD number);
558 FX_BOOL IsLinearizedFile(IFX_FileRead* pFileAccess, FX_DWORD offset);
564 CPDF_Dictionary* m_pTrailer;
566 CPDF_Dictionary* m_pEncryptDict;
567 void SetEncryptDictionary(CPDF_Dictionary* pDict);
569 FX_FILESIZE m_LastXRefOffset;
571 FX_BOOL m_bXRefStream;
574 CPDF_SecurityHandler* m_pSecurityHandler;
576 FX_BOOL m_bForceUseSecurityHandler;
578 CFX_ByteString m_bsRecipient;
580 CFX_ByteString m_FilePath;
582 CFX_ByteString m_Password;
584 CFX_FileSizeArray m_CrossRef;
586 CFX_ByteArray m_V5Type;
588 CFX_FileSizeArray m_SortedOffset;
590 CFX_WordArray m_ObjVersion;
591 CFX_ArrayTemplate<CPDF_Dictionary *> m_Trailers;
593 FX_BOOL m_bVersionUpdated;
595 CPDF_Object* m_pLinearized;
597 FX_DWORD m_dwFirstPageNo;
599 FX_DWORD m_dwXrefStartObjNum;
600 friend class CPDF_Creator;
601 friend class CPDF_DataAvail;
603 #define FXCIPHER_NONE 0
604 #define FXCIPHER_RC4 1
605 #define FXCIPHER_AES 2
606 #define FXCIPHER_AES2 3
607 class CPDF_SecurityHandler : public CFX_Object
611 virtual ~CPDF_SecurityHandler() {}
613 virtual FX_BOOL OnInit(CPDF_Parser* pParser, CPDF_Dictionary* pEncryptDict) = 0;
615 virtual FX_DWORD GetPermissions() = 0;
617 virtual FX_BOOL IsOwner() = 0;
619 virtual FX_BOOL GetCryptInfo(int& cipher, FX_LPCBYTE& buffer, int& keylen) = 0;
621 virtual FX_BOOL IsMetadataEncrypted()
626 virtual CPDF_CryptoHandler* CreateCryptoHandler() = 0;
628 virtual CPDF_StandardSecurityHandler* GetStandardHandler()
633 #define PDF_ENCRYPT_CONTENT 0
634 class CPDF_StandardSecurityHandler : public CPDF_SecurityHandler
637 CPDF_StandardSecurityHandler();
639 virtual ~CPDF_StandardSecurityHandler();
640 virtual FX_BOOL OnInit(CPDF_Parser* pParser, CPDF_Dictionary* pEncryptDict);
641 virtual FX_DWORD GetPermissions();
642 virtual FX_BOOL IsOwner()
646 virtual FX_BOOL GetCryptInfo(int& cipher, FX_LPCBYTE& buffer, int& keylen);
647 virtual FX_BOOL IsMetadataEncrypted();
648 virtual CPDF_CryptoHandler* CreateCryptoHandler();
649 virtual CPDF_StandardSecurityHandler* GetStandardHandler()
654 void OnCreate(CPDF_Dictionary* pEncryptDict, CPDF_Array* pIdArray,
655 FX_LPCBYTE user_pass, FX_DWORD user_size,
656 FX_LPCBYTE owner_pass, FX_DWORD owner_size, FX_DWORD type = PDF_ENCRYPT_CONTENT);
658 void OnCreate(CPDF_Dictionary* pEncryptDict, CPDF_Array* pIdArray,
659 FX_LPCBYTE user_pass, FX_DWORD user_size, FX_DWORD type = PDF_ENCRYPT_CONTENT);
661 CFX_ByteString GetUserPassword(FX_LPCBYTE owner_pass, FX_DWORD pass_size);
662 CFX_ByteString GetUserPassword(FX_LPCBYTE owner_pass, FX_DWORD pass_size, FX_INT32 key_len);
672 int CheckPassword(FX_LPCBYTE password, FX_DWORD pass_size, FX_BOOL bOwner, FX_LPBYTE key);
673 int CheckPassword(FX_LPCBYTE password, FX_DWORD pass_size, FX_BOOL bOwner, FX_LPBYTE key, int key_len);
680 CPDF_Parser* m_pParser;
682 CPDF_Dictionary* m_pEncryptDict;
684 FX_BOOL LoadDict(CPDF_Dictionary* pEncryptDict);
685 FX_BOOL LoadDict(CPDF_Dictionary* pEncryptDict, FX_DWORD type, int& cipher, int& key_len);
687 FX_BOOL CheckUserPassword(FX_LPCBYTE password, FX_DWORD pass_size,
688 FX_BOOL bIgnoreEncryptMeta, FX_LPBYTE key, FX_INT32 key_len);
690 FX_BOOL CheckOwnerPassword(FX_LPCBYTE password, FX_DWORD pass_size, FX_LPBYTE key, FX_INT32 key_len);
691 FX_BOOL AES256_CheckPassword(FX_LPCBYTE password, FX_DWORD size, FX_BOOL bOwner, FX_LPBYTE key);
692 void AES256_SetPassword(CPDF_Dictionary* pEncryptDict, FX_LPCBYTE password, FX_DWORD size, FX_BOOL bOwner, FX_LPCBYTE key);
693 void AES256_SetPerms(CPDF_Dictionary* pEncryptDict, FX_DWORD permission, FX_BOOL bEncryptMetadata, FX_LPCBYTE key);
694 void OnCreate(CPDF_Dictionary* pEncryptDict, CPDF_Array* pIdArray,
695 FX_LPCBYTE user_pass, FX_DWORD user_size,
696 FX_LPCBYTE owner_pass, FX_DWORD owner_size, FX_BOOL bDefault, FX_DWORD type);
697 FX_BOOL CheckSecurity(FX_INT32 key_len);
701 FX_DWORD m_Permissions;
705 FX_BYTE m_EncryptKey[32];
709 class CPDF_CryptoHandler : public CFX_Object
713 virtual ~CPDF_CryptoHandler() {}
715 virtual FX_BOOL Init(CPDF_Dictionary* pEncryptDict, CPDF_SecurityHandler* pSecurityHandler) = 0;
717 virtual FX_DWORD DecryptGetSize(FX_DWORD src_size) = 0;
719 virtual FX_LPVOID DecryptStart(FX_DWORD objnum, FX_DWORD gennum) = 0;
721 virtual FX_BOOL DecryptStream(FX_LPVOID context, FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf) = 0;
723 virtual FX_BOOL DecryptFinish(FX_LPVOID context, CFX_BinaryBuf& dest_buf) = 0;
726 virtual FX_DWORD EncryptGetSize(FX_DWORD objnum, FX_DWORD version, FX_LPCBYTE src_buf, FX_DWORD src_size) = 0;
728 virtual FX_BOOL EncryptContent(FX_DWORD objnum, FX_DWORD version, FX_LPCBYTE src_buf, FX_DWORD src_size,
729 FX_LPBYTE dest_buf, FX_DWORD& dest_size) = 0;
731 void Decrypt(FX_DWORD objnum, FX_DWORD version, CFX_ByteString& str);
733 class CPDF_StandardCryptoHandler : public CPDF_CryptoHandler
737 CPDF_StandardCryptoHandler();
739 virtual ~CPDF_StandardCryptoHandler();
741 FX_BOOL Init(int cipher, FX_LPCBYTE key, int keylen);
742 virtual FX_BOOL Init(CPDF_Dictionary* pEncryptDict, CPDF_SecurityHandler* pSecurityHandler);
743 virtual FX_DWORD DecryptGetSize(FX_DWORD src_size);
744 virtual FX_LPVOID DecryptStart(FX_DWORD objnum, FX_DWORD gennum);
745 virtual FX_BOOL DecryptStream(FX_LPVOID context, FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);
746 virtual FX_BOOL DecryptFinish(FX_LPVOID context, CFX_BinaryBuf& dest_buf);
747 virtual FX_DWORD EncryptGetSize(FX_DWORD objnum, FX_DWORD version, FX_LPCBYTE src_buf, FX_DWORD src_size);
748 virtual FX_BOOL EncryptContent(FX_DWORD objnum, FX_DWORD version, FX_LPCBYTE src_buf, FX_DWORD src_size,
749 FX_LPBYTE dest_buf, FX_DWORD& dest_size);
752 virtual void CryptBlock(FX_BOOL bEncrypt, FX_DWORD objnum, FX_DWORD gennum, FX_LPCBYTE src_buf, FX_DWORD src_size,
753 FX_LPBYTE dest_buf, FX_DWORD& dest_size);
754 virtual FX_LPVOID CryptStart(FX_DWORD objnum, FX_DWORD gennum, FX_BOOL bEncrypt);
755 virtual FX_BOOL CryptStream(FX_LPVOID context, FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf, FX_BOOL bEncrypt);
756 virtual FX_BOOL CryptFinish(FX_LPVOID context, CFX_BinaryBuf& dest_buf, FX_BOOL bEncrypt);
758 FX_BYTE m_EncryptKey[32];
764 FX_LPBYTE m_pAESContext;
766 class CPDF_Point : public CFX_Object
770 CPDF_Point(FX_FLOAT xx, FX_FLOAT yy)
781 #define CPDF_Rect CFX_FloatRect
782 #define CPDF_Matrix CFX_AffineMatrix
783 CFX_ByteString PDF_NameDecode(FX_BSTR orig);
784 CFX_ByteString PDF_NameDecode(const CFX_ByteString& orig);
785 CFX_ByteString PDF_NameEncode(const CFX_ByteString& orig);
786 CFX_ByteString PDF_EncodeString(const CFX_ByteString& src, FX_BOOL bHex = FALSE);
787 CFX_WideString PDF_DecodeText(const CFX_ByteString& str, CFX_CharMap* pCharMap = NULL);
788 CFX_WideString PDF_DecodeText(FX_LPCBYTE pData, FX_DWORD size, CFX_CharMap* pCharMap = NULL);
789 CFX_ByteString PDF_EncodeText(FX_LPCWSTR pString, int len = -1, CFX_CharMap* pCharMap = NULL);
790 FX_FLOAT PDF_ClipFloat(FX_FLOAT f);
791 class CFDF_Document : public CPDF_IndirectObjects
795 static CFDF_Document* CreateNewDoc();
797 static CFDF_Document* ParseFile(FX_LPCSTR file_path);
799 static CFDF_Document* ParseFile(FX_LPCWSTR file_path);
801 static CFDF_Document* ParseFile(IFX_FileRead *pFile, FX_BOOL bOwnFile = FALSE);
803 static CFDF_Document* ParseMemory(FX_LPCBYTE pData, FX_DWORD size);
807 FX_BOOL WriteFile(FX_LPCSTR file_path) const;
809 FX_BOOL WriteFile(FX_LPCWSTR file_path) const;
811 FX_BOOL WriteFile(IFX_FileWrite *pFile) const;
813 FX_BOOL WriteBuf(CFX_ByteTextBuf& buf) const;
815 CPDF_Dictionary* GetRoot() const
820 CFX_WideString GetWin32Path() const;
824 void ParseStream(IFX_FileRead *pFile, FX_BOOL bOwnFile);
825 CPDF_Dictionary* m_pRootDict;
826 IFX_FileRead* m_pFile;
830 CFX_WideString FPDF_FileSpec_GetWin32Path(const CPDF_Object* pFileSpec);
831 void FPDF_FileSpec_SetWin32Path(CPDF_Object* pFileSpec, const CFX_WideString& fullpath);
833 void FlateEncode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
834 FX_DWORD FlateDecode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
835 FX_DWORD RunLengthDecode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
836 class CPDF_NumberTree : public CFX_Object
840 CPDF_NumberTree(CPDF_Dictionary* pRoot)
845 CPDF_Object* LookupValue(int num);
848 CPDF_Dictionary* m_pRoot;
854 virtual ~IFX_FileAvail() { }
855 virtual FX_BOOL IsDataAvail( FX_FILESIZE offset, FX_DWORD size) = 0;
857 class IFX_DownloadHints
860 virtual ~IFX_DownloadHints() { }
861 virtual void AddSegment(FX_FILESIZE offset, FX_DWORD size) = 0;
863 #define PDF_IS_LINEARIZED 1
864 #define PDF_NOT_LINEARIZED 0
865 #define PDF_UNKNOW_LINEARIZED -1
866 #define PDFFORM_NOTAVAIL 0
867 #define PDFFORM_AVAIL 1
868 #define PDFFORM_NOTEXIST 2
872 static IPDF_DataAvail* Create(IFX_FileAvail* pFileAvail, IFX_FileRead* pFileRead);
873 virtual ~IPDF_DataAvail() { }
875 IFX_FileAvail* GetFileAvail() const { return m_pFileAvail; }
876 IFX_FileRead* GetFileRead() const { return m_pFileRead; }
878 virtual FX_BOOL IsDocAvail(IFX_DownloadHints* pHints) = 0;
879 virtual void SetDocument(CPDF_Document* pDoc) = 0;
880 virtual FX_BOOL IsPageAvail(int iPage, IFX_DownloadHints* pHints) = 0;
881 virtual FX_BOOL IsLinearized() = 0;
882 virtual FX_INT32 IsFormAvail(IFX_DownloadHints *pHints) = 0;
883 virtual FX_INT32 IsLinearizedPDF() = 0;
884 virtual void GetLinearizedMainXRefInfo(FX_FILESIZE *pPos, FX_DWORD *pSize) = 0;
887 IPDF_DataAvail(IFX_FileAvail* pFileAvail, IFX_FileRead* pFileRead);
889 IFX_FileAvail* m_pFileAvail;
890 IFX_FileRead* m_pFileRead;
892 class CPDF_SortObjNumArray : public CFX_Object
896 void AddObjNum(FX_DWORD dwObjNum);
898 FX_BOOL Find(FX_DWORD dwObjNum);
902 m_number_array.RemoveAll();
906 FX_BOOL BinarySearch(FX_DWORD value, int &iNext);
909 CFX_DWordArray m_number_array;
911 enum PDF_PAGENODE_TYPE {
912 PDF_PAGENODE_UNKOWN = 0,
917 class CPDF_PageNode : public CFX_Object
920 CPDF_PageNode() : m_type(PDF_PAGENODE_UNKOWN) {}
922 PDF_PAGENODE_TYPE m_type;
924 CFX_PtrArray m_childNode;
926 enum PDF_DATAAVAIL_STATUS {
927 PDF_DATAAVAIL_HEADER = 0,
928 PDF_DATAAVAIL_FIRSTPAGE,
929 PDF_DATAAVAIL_FIRSTPAGE_PREPARE,
931 PDF_DATAAVAIL_CROSSREF,
932 PDF_DATAAVAIL_CROSSREF_ITEM,
933 PDF_DATAAVAIL_CROSSREF_STREAM,
934 PDF_DATAAVAIL_TRAILER,
935 PDF_DATAAVAIL_LOADALLCRSOSSREF,
938 PDF_DATAAVAIL_ACROFORM,
939 PDF_DATAAVAIL_ACROFORM_SUBOBJECT,
940 PDF_DATAAVAIL_PAGETREE,
942 PDF_DATAAVAIL_PAGE_LATERLOAD,
943 PDF_DATAAVAIL_RESOURCES,
946 PDF_DATAAVAIL_LOADALLFILE,
947 PDF_DATAAVAIL_TRAILER_APPEND