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
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
251 ~CPDF_SyntaxParser();
253 void InitParser(IFX_FileRead* pFileAccess, FX_DWORD HeaderOffset);
255 FX_FILESIZE SavePos()
260 void RestorePos(FX_FILESIZE pos)
265 CPDF_Object* GetObject(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, FX_DWORD gennum, int level, struct PARSE_CONTEXT* pContext = NULL, FX_BOOL bDecrypt = TRUE);
268 CPDF_Object* GetObjectByStrict(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, FX_DWORD gennum, int level, struct PARSE_CONTEXT* pContext = NULL);
272 CFX_ByteString GetString(FX_DWORD objnum, FX_DWORD gennum);
274 CFX_ByteString GetName();
276 CFX_ByteString GetKeyword();
278 void GetBinary(FX_BYTE* buffer, FX_DWORD size);
284 FX_BOOL SearchWord(FX_BSTR word, FX_BOOL bWholeWord, FX_BOOL bForward, FX_FILESIZE limit);
286 int SearchMultiWord(FX_BSTR words, FX_BOOL bWholeWord, FX_FILESIZE limit);
288 FX_FILESIZE FindTag(FX_BSTR tag, FX_FILESIZE limit);
290 void SetEncrypt(CPDF_CryptoHandler* pCryptoHandler)
292 m_pCryptoHandler = pCryptoHandler;
295 FX_BOOL IsEncrypted()
297 return m_pCryptoHandler != NULL;
300 FX_BOOL GetCharAt(FX_FILESIZE pos, FX_BYTE& ch);
302 FX_BOOL ReadBlock(FX_BYTE* pBuf, FX_DWORD size);
304 CFX_ByteString GetNextWord(FX_BOOL& bIsNumber);
307 virtual FX_BOOL GetNextChar(FX_BYTE& ch);
309 FX_BOOL GetCharAtBackward(FX_FILESIZE pos, FX_BYTE& ch);
313 FX_BOOL IsWholeWord(FX_FILESIZE startpos, FX_FILESIZE limit, FX_LPCBYTE tag, FX_DWORD taglen);
315 CFX_ByteString ReadString();
317 CFX_ByteString ReadHexString();
319 CPDF_Stream* ReadStream(CPDF_Dictionary* pDict, PARSE_CONTEXT* pContext, FX_DWORD objnum, FX_DWORD gennum);
323 FX_BOOL m_bFileStream;
325 int m_MetadataObjnum;
327 IFX_FileRead* m_pFileAccess;
329 FX_DWORD m_HeaderOffset;
331 FX_FILESIZE m_FileLen;
337 FX_FILESIZE m_BufOffset;
339 CPDF_CryptoHandler* m_pCryptoHandler;
341 FX_BYTE m_WordBuffer[257];
347 FX_FILESIZE m_dwWordPos;
348 friend class CPDF_Parser;
349 friend class CPDF_DataAvail;
352 #define PDFPARSE_TYPEONLY 1
353 #define PDFPARSE_NOSTREAM 2
354 struct PARSE_CONTEXT {
358 FX_FILESIZE m_DictStart;
360 FX_FILESIZE m_DictEnd;
362 FX_FILESIZE m_DataStart;
364 FX_FILESIZE m_DataEnd;
366 class IPDF_DocParser : public CFX_Object
370 virtual FX_DWORD GetRootObjNum() = 0;
372 virtual FX_DWORD GetInfoObjNum() = 0;
374 virtual CPDF_Object* ParseIndirectObject(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, PARSE_CONTEXT* pContext = NULL) = 0;
376 virtual FX_DWORD GetLastObjNum() = 0;
378 virtual CPDF_Array* GetIDArray() = 0;
380 virtual CPDF_Dictionary* GetEncryptDict() = 0;
382 FX_BOOL IsEncrypted()
384 return GetEncryptDict() != NULL;
387 virtual FX_DWORD GetPermissions(FX_BOOL bCheckRevision = FALSE) = 0;
389 virtual FX_BOOL IsOwner() = 0;
391 virtual FX_BOOL IsFormStream(FX_DWORD objnum, FX_BOOL& bForm) = 0;
394 #define PDFPARSE_ERROR_SUCCESS 0
395 #define PDFPARSE_ERROR_FILE 1
396 #define PDFPARSE_ERROR_FORMAT 2
397 #define PDFPARSE_ERROR_PASSWORD 3
398 #define PDFPARSE_ERROR_HANDLER 4
399 #define PDFPARSE_ERROR_CERT 5
400 class CPDF_Parser FX_FINAL : public IPDF_DocParser
408 FX_DWORD StartParse(FX_LPCSTR filename, FX_BOOL bReParse = FALSE);
410 FX_DWORD StartParse(FX_LPCWSTR filename, FX_BOOL bReParse = FALSE);
412 FX_DWORD StartParse(IFX_FileRead* pFile, FX_BOOL bReParse = FALSE, FX_BOOL bOwnFileRead = TRUE);
414 void CloseParser(FX_BOOL bReParse = FALSE);
416 virtual FX_DWORD GetPermissions(FX_BOOL bCheckRevision = FALSE) FX_OVERRIDE;
418 virtual FX_BOOL IsOwner() FX_OVERRIDE;
420 void SetPassword(const FX_CHAR* password)
422 m_Password = password;
425 CFX_ByteString GetPassword()
430 CPDF_SecurityHandler* GetSecurityHandler()
432 return m_pSecurityHandler;
435 CPDF_CryptoHandler* GetCryptoHandler()
437 return m_Syntax.m_pCryptoHandler;
440 void SetSecurityHandler(CPDF_SecurityHandler* pSecurityHandler, FX_BOOL bForced = FALSE);
442 CFX_ByteString GetRecipient()
444 return m_bsRecipient;
447 CPDF_Dictionary* GetTrailer()
452 FX_FILESIZE GetLastXRefOffset()
454 return m_LastXRefOffset;
457 CPDF_Document* GetDocument()
461 CFX_ArrayTemplate<CPDF_Dictionary *> * GetOtherTrailers()
466 virtual FX_DWORD GetRootObjNum() FX_OVERRIDE;
467 virtual FX_DWORD GetInfoObjNum() FX_OVERRIDE;
468 virtual CPDF_Array* GetIDArray() FX_OVERRIDE;
469 virtual CPDF_Dictionary* GetEncryptDict() FX_OVERRIDE
471 return m_pEncryptDict;
473 virtual CPDF_Object* ParseIndirectObject(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, PARSE_CONTEXT* pContext = NULL) FX_OVERRIDE;
474 virtual FX_DWORD GetLastObjNum() FX_OVERRIDE;
475 virtual FX_BOOL IsFormStream(FX_DWORD objnum, FX_BOOL& bForm) FX_OVERRIDE;
477 FX_FILESIZE GetObjectOffset(FX_DWORD objnum);
479 FX_FILESIZE GetObjectSize(FX_DWORD objnum);
481 int GetObjectVersion(FX_DWORD objnum)
483 return m_ObjVersion[objnum];
486 void GetIndirectBinary(FX_DWORD objnum, FX_BYTE*& pBuffer, FX_DWORD& size);
488 FX_BOOL GetFileStreamOption()
490 return m_Syntax.m_bFileStream;
493 void SetFileStreamOption(FX_BOOL b)
495 m_Syntax.m_bFileStream = b;
498 IFX_FileRead* GetFileAccess() const
500 return m_Syntax.m_pFileAccess;
503 int GetFileVersion() const
505 return m_FileVersion;
508 FX_BOOL IsXRefStream() const
510 return m_bXRefStream;
512 CPDF_Object* ParseIndirectObjectAt(CPDF_IndirectObjects* pObjList, FX_FILESIZE pos, FX_DWORD objnum,
513 struct PARSE_CONTEXT* pContext);
515 CPDF_Object* ParseIndirectObjectAtByStrict(CPDF_IndirectObjects* pObjList, FX_FILESIZE pos, FX_DWORD objnum,
516 struct PARSE_CONTEXT* pContext, FX_FILESIZE *pResultPos);
518 FX_DWORD StartAsynParse(IFX_FileRead* pFile, FX_BOOL bReParse = FALSE, FX_BOOL bOwnFileRead = TRUE);
520 FX_DWORD GetFirstPageNo()
522 return m_dwFirstPageNo;
526 CPDF_Document* m_pDocument;
528 CPDF_SyntaxParser m_Syntax;
529 FX_BOOL m_bOwnFileRead;
530 CPDF_Object* ParseDirect(CPDF_Object* pObj);
532 FX_BOOL LoadAllCrossRefV4(FX_FILESIZE pos);
534 FX_BOOL LoadAllCrossRefV5(FX_FILESIZE pos);
536 FX_BOOL LoadCrossRefV4(FX_FILESIZE pos, FX_FILESIZE streampos, FX_BOOL bSkip, FX_BOOL bFirst);
538 FX_BOOL LoadCrossRefV5(FX_FILESIZE pos, FX_FILESIZE& prev, FX_BOOL bMainXRef);
540 CPDF_Dictionary* LoadTrailerV4();
542 FX_BOOL RebuildCrossRef();
544 FX_DWORD SetEncryptHandler();
546 void ReleaseEncryptHandler();
548 FX_BOOL LoadLinearizedAllCrossRefV4(FX_FILESIZE pos, FX_DWORD dwObjCount);
550 FX_BOOL LoadLinearizedCrossRefV4(FX_FILESIZE pos, FX_DWORD dwObjCount);
552 FX_BOOL LoadLinearizedAllCrossRefV5(FX_FILESIZE pos);
554 FX_DWORD LoadLinearizedMainXRefTable();
556 CFX_MapPtrToPtr m_ObjectStreamMap;
558 CPDF_StreamAcc* GetObjectStream(FX_DWORD number);
560 FX_BOOL IsLinearizedFile(IFX_FileRead* pFileAccess, FX_DWORD offset);
566 CPDF_Dictionary* m_pTrailer;
568 CPDF_Dictionary* m_pEncryptDict;
569 void SetEncryptDictionary(CPDF_Dictionary* pDict);
571 FX_FILESIZE m_LastXRefOffset;
573 FX_BOOL m_bXRefStream;
576 CPDF_SecurityHandler* m_pSecurityHandler;
578 FX_BOOL m_bForceUseSecurityHandler;
580 CFX_ByteString m_bsRecipient;
582 CFX_ByteString m_FilePath;
584 CFX_ByteString m_Password;
586 CFX_FileSizeArray m_CrossRef;
588 CFX_ByteArray m_V5Type;
590 CFX_FileSizeArray m_SortedOffset;
592 CFX_WordArray m_ObjVersion;
593 CFX_ArrayTemplate<CPDF_Dictionary *> m_Trailers;
595 FX_BOOL m_bVersionUpdated;
597 CPDF_Object* m_pLinearized;
599 FX_DWORD m_dwFirstPageNo;
601 FX_DWORD m_dwXrefStartObjNum;
602 friend class CPDF_Creator;
603 friend class CPDF_DataAvail;
605 #define FXCIPHER_NONE 0
606 #define FXCIPHER_RC4 1
607 #define FXCIPHER_AES 2
608 #define FXCIPHER_AES2 3
609 class CPDF_SecurityHandler : public CFX_Object
613 virtual ~CPDF_SecurityHandler() {}
615 virtual FX_BOOL OnInit(CPDF_Parser* pParser, CPDF_Dictionary* pEncryptDict) = 0;
617 virtual FX_DWORD GetPermissions() = 0;
619 virtual FX_BOOL IsOwner() = 0;
621 virtual FX_BOOL GetCryptInfo(int& cipher, FX_LPCBYTE& buffer, int& keylen) = 0;
623 virtual FX_BOOL IsMetadataEncrypted()
628 virtual CPDF_CryptoHandler* CreateCryptoHandler() = 0;
630 virtual CPDF_StandardSecurityHandler* GetStandardHandler()
635 #define PDF_ENCRYPT_CONTENT 0
636 class CPDF_StandardSecurityHandler : public CPDF_SecurityHandler
639 CPDF_StandardSecurityHandler();
641 virtual ~CPDF_StandardSecurityHandler();
642 virtual FX_BOOL OnInit(CPDF_Parser* pParser, CPDF_Dictionary* pEncryptDict);
643 virtual FX_DWORD GetPermissions();
644 virtual FX_BOOL IsOwner()
648 virtual FX_BOOL GetCryptInfo(int& cipher, FX_LPCBYTE& buffer, int& keylen);
649 virtual FX_BOOL IsMetadataEncrypted();
650 virtual CPDF_CryptoHandler* CreateCryptoHandler();
651 virtual CPDF_StandardSecurityHandler* GetStandardHandler()
656 void OnCreate(CPDF_Dictionary* pEncryptDict, CPDF_Array* pIdArray,
657 FX_LPCBYTE user_pass, FX_DWORD user_size,
658 FX_LPCBYTE owner_pass, FX_DWORD owner_size, FX_DWORD type = PDF_ENCRYPT_CONTENT);
660 void OnCreate(CPDF_Dictionary* pEncryptDict, CPDF_Array* pIdArray,
661 FX_LPCBYTE user_pass, FX_DWORD user_size, FX_DWORD type = PDF_ENCRYPT_CONTENT);
663 CFX_ByteString GetUserPassword(FX_LPCBYTE owner_pass, FX_DWORD pass_size);
664 CFX_ByteString GetUserPassword(FX_LPCBYTE owner_pass, FX_DWORD pass_size, FX_INT32 key_len);
674 int CheckPassword(FX_LPCBYTE password, FX_DWORD pass_size, FX_BOOL bOwner, FX_LPBYTE key);
675 int CheckPassword(FX_LPCBYTE password, FX_DWORD pass_size, FX_BOOL bOwner, FX_LPBYTE key, int key_len);
682 CPDF_Parser* m_pParser;
684 CPDF_Dictionary* m_pEncryptDict;
686 FX_BOOL LoadDict(CPDF_Dictionary* pEncryptDict);
687 FX_BOOL LoadDict(CPDF_Dictionary* pEncryptDict, FX_DWORD type, int& cipher, int& key_len);
689 FX_BOOL CheckUserPassword(FX_LPCBYTE password, FX_DWORD pass_size,
690 FX_BOOL bIgnoreEncryptMeta, FX_LPBYTE key, FX_INT32 key_len);
692 FX_BOOL CheckOwnerPassword(FX_LPCBYTE password, FX_DWORD pass_size, FX_LPBYTE key, FX_INT32 key_len);
693 FX_BOOL AES256_CheckPassword(FX_LPCBYTE password, FX_DWORD size, FX_BOOL bOwner, FX_LPBYTE key);
694 void AES256_SetPassword(CPDF_Dictionary* pEncryptDict, FX_LPCBYTE password, FX_DWORD size, FX_BOOL bOwner, FX_LPCBYTE key);
695 void AES256_SetPerms(CPDF_Dictionary* pEncryptDict, FX_DWORD permission, FX_BOOL bEncryptMetadata, FX_LPCBYTE key);
696 void OnCreate(CPDF_Dictionary* pEncryptDict, CPDF_Array* pIdArray,
697 FX_LPCBYTE user_pass, FX_DWORD user_size,
698 FX_LPCBYTE owner_pass, FX_DWORD owner_size, FX_BOOL bDefault, FX_DWORD type);
699 FX_BOOL CheckSecurity(FX_INT32 key_len);
703 FX_DWORD m_Permissions;
707 FX_BYTE m_EncryptKey[32];
711 class CPDF_CryptoHandler : public CFX_Object
715 virtual ~CPDF_CryptoHandler() {}
717 virtual FX_BOOL Init(CPDF_Dictionary* pEncryptDict, CPDF_SecurityHandler* pSecurityHandler) = 0;
719 virtual FX_DWORD DecryptGetSize(FX_DWORD src_size) = 0;
721 virtual FX_LPVOID DecryptStart(FX_DWORD objnum, FX_DWORD gennum) = 0;
723 virtual FX_BOOL DecryptStream(FX_LPVOID context, FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf) = 0;
725 virtual FX_BOOL DecryptFinish(FX_LPVOID context, CFX_BinaryBuf& dest_buf) = 0;
728 virtual FX_DWORD EncryptGetSize(FX_DWORD objnum, FX_DWORD version, FX_LPCBYTE src_buf, FX_DWORD src_size) = 0;
730 virtual FX_BOOL EncryptContent(FX_DWORD objnum, FX_DWORD version, FX_LPCBYTE src_buf, FX_DWORD src_size,
731 FX_LPBYTE dest_buf, FX_DWORD& dest_size) = 0;
733 void Decrypt(FX_DWORD objnum, FX_DWORD version, CFX_ByteString& str);
735 class CPDF_StandardCryptoHandler : public CPDF_CryptoHandler
739 CPDF_StandardCryptoHandler();
741 virtual ~CPDF_StandardCryptoHandler();
743 FX_BOOL Init(int cipher, FX_LPCBYTE key, int keylen);
744 virtual FX_BOOL Init(CPDF_Dictionary* pEncryptDict, CPDF_SecurityHandler* pSecurityHandler);
745 virtual FX_DWORD DecryptGetSize(FX_DWORD src_size);
746 virtual FX_LPVOID DecryptStart(FX_DWORD objnum, FX_DWORD gennum);
747 virtual FX_BOOL DecryptStream(FX_LPVOID context, FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);
748 virtual FX_BOOL DecryptFinish(FX_LPVOID context, CFX_BinaryBuf& dest_buf);
749 virtual FX_DWORD EncryptGetSize(FX_DWORD objnum, FX_DWORD version, FX_LPCBYTE src_buf, FX_DWORD src_size);
750 virtual FX_BOOL EncryptContent(FX_DWORD objnum, FX_DWORD version, FX_LPCBYTE src_buf, FX_DWORD src_size,
751 FX_LPBYTE dest_buf, FX_DWORD& dest_size);
754 virtual void CryptBlock(FX_BOOL bEncrypt, FX_DWORD objnum, FX_DWORD gennum, FX_LPCBYTE src_buf, FX_DWORD src_size,
755 FX_LPBYTE dest_buf, FX_DWORD& dest_size);
756 virtual FX_LPVOID CryptStart(FX_DWORD objnum, FX_DWORD gennum, FX_BOOL bEncrypt);
757 virtual FX_BOOL CryptStream(FX_LPVOID context, FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf, FX_BOOL bEncrypt);
758 virtual FX_BOOL CryptFinish(FX_LPVOID context, CFX_BinaryBuf& dest_buf, FX_BOOL bEncrypt);
760 FX_BYTE m_EncryptKey[32];
766 FX_LPBYTE m_pAESContext;
768 class CPDF_Point : public CFX_Object
772 CPDF_Point(FX_FLOAT xx, FX_FLOAT yy)
783 #define CPDF_Rect CFX_FloatRect
784 #define CPDF_Matrix CFX_AffineMatrix
785 CFX_ByteString PDF_NameDecode(FX_BSTR orig);
786 CFX_ByteString PDF_NameDecode(const CFX_ByteString& orig);
787 CFX_ByteString PDF_NameEncode(const CFX_ByteString& orig);
788 CFX_ByteString PDF_EncodeString(const CFX_ByteString& src, FX_BOOL bHex = FALSE);
789 CFX_WideString PDF_DecodeText(const CFX_ByteString& str, CFX_CharMap* pCharMap = NULL);
790 CFX_WideString PDF_DecodeText(FX_LPCBYTE pData, FX_DWORD size, CFX_CharMap* pCharMap = NULL);
791 CFX_ByteString PDF_EncodeText(FX_LPCWSTR pString, int len = -1, CFX_CharMap* pCharMap = NULL);
792 FX_FLOAT PDF_ClipFloat(FX_FLOAT f);
793 class CFDF_Document : public CPDF_IndirectObjects
797 static CFDF_Document* CreateNewDoc();
799 static CFDF_Document* ParseFile(FX_LPCSTR file_path);
801 static CFDF_Document* ParseFile(FX_LPCWSTR file_path);
803 static CFDF_Document* ParseFile(IFX_FileRead *pFile, FX_BOOL bOwnFile = FALSE);
805 static CFDF_Document* ParseMemory(FX_LPCBYTE pData, FX_DWORD size);
809 FX_BOOL WriteFile(FX_LPCSTR file_path) const;
811 FX_BOOL WriteFile(FX_LPCWSTR file_path) const;
813 FX_BOOL WriteFile(IFX_FileWrite *pFile) const;
815 FX_BOOL WriteBuf(CFX_ByteTextBuf& buf) const;
817 CPDF_Dictionary* GetRoot() const
822 CFX_WideString GetWin32Path() const;
826 void ParseStream(IFX_FileRead *pFile, FX_BOOL bOwnFile);
827 CPDF_Dictionary* m_pRootDict;
828 IFX_FileRead* m_pFile;
832 CFX_WideString FPDF_FileSpec_GetWin32Path(const CPDF_Object* pFileSpec);
833 void FPDF_FileSpec_SetWin32Path(CPDF_Object* pFileSpec, const CFX_WideString& fullpath);
835 void FlateEncode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
836 FX_DWORD FlateDecode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
837 FX_DWORD RunLengthDecode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
838 class CPDF_NumberTree : public CFX_Object
842 CPDF_NumberTree(CPDF_Dictionary* pRoot)
847 CPDF_Object* LookupValue(int num);
850 CPDF_Dictionary* m_pRoot;
857 virtual FX_BOOL IsDataAvail( FX_FILESIZE offset, FX_DWORD size) = 0;
859 class IFX_DownloadHints
863 virtual void AddSegment(FX_FILESIZE offset, FX_DWORD size) = 0;
865 #define PDF_IS_LINEARIZED 1
866 #define PDF_NOT_LINEARIZED 0
867 #define PDF_UNKNOW_LINEARIZED -1
868 #define PDFFORM_NOTAVAIL 0
869 #define PDFFORM_AVAIL 1
870 #define PDFFORM_NOTEXIST 2
875 virtual FX_BOOL IsDocAvail(IFX_DownloadHints* pHints) = 0;
878 virtual void SetDocument(CPDF_Document* pDoc) = 0;
881 virtual FX_BOOL IsPageAvail(int iPage, IFX_DownloadHints* pHints) = 0;
883 virtual FX_BOOL IsLinearized() = 0;
885 virtual FX_INT32 IsFormAvail(IFX_DownloadHints *pHints) = 0;
887 virtual FX_INT32 IsLinearizedPDF() = 0;
889 virtual void GetLinearizedMainXRefInfo(FX_FILESIZE *pPos, FX_DWORD *pSize) = 0;
891 class CPDF_SortObjNumArray : public CFX_Object
895 void AddObjNum(FX_DWORD dwObjNum);
897 FX_BOOL Find(FX_DWORD dwObjNum);
901 m_number_array.RemoveAll();
905 FX_BOOL BinarySearch(FX_DWORD value, int &iNext);
908 CFX_DWordArray m_number_array;
910 enum PDF_PAGENODE_TYPE {
911 PDF_PAGENODE_UNKOWN = 0,
916 class CPDF_PageNode : public CFX_Object
919 CPDF_PageNode() : m_type(PDF_PAGENODE_UNKOWN) {}
921 PDF_PAGENODE_TYPE m_type;
923 CFX_PtrArray m_childNode;
925 enum PDF_DATAAVAIL_STATUS {
926 PDF_DATAAVAIL_HEADER = 0,
927 PDF_DATAAVAIL_FIRSTPAGE,
928 PDF_DATAAVAIL_FIRSTPAGE_PREPARE,
930 PDF_DATAAVAIL_CROSSREF,
931 PDF_DATAAVAIL_CROSSREF_ITEM,
932 PDF_DATAAVAIL_CROSSREF_STREAM,
933 PDF_DATAAVAIL_TRAILER,
934 PDF_DATAAVAIL_LOADALLCRSOSSREF,
937 PDF_DATAAVAIL_ACROFORM,
938 PDF_DATAAVAIL_ACROFORM_SUBOBJECT,
939 PDF_DATAAVAIL_PAGETREE,
941 PDF_DATAAVAIL_PAGE_LATERLOAD,
942 PDF_DATAAVAIL_RESOURCES,
945 PDF_DATAAVAIL_LOADALLFILE,
946 PDF_DATAAVAIL_TRAILER_APPEND
948 class CPDF_DataAvail FX_FINAL : public CFX_Object, public IPDF_DataAvail
952 CPDF_DataAvail(IFX_FileAvail* pFileAvail, IFX_FileRead* pFileRead);
955 virtual FX_BOOL IsDocAvail(IFX_DownloadHints* pHints) FX_OVERRIDE;
957 virtual void SetDocument(CPDF_Document* pDoc) FX_OVERRIDE;
959 virtual FX_BOOL IsPageAvail(int iPage, IFX_DownloadHints* pHints) FX_OVERRIDE;
961 virtual FX_INT32 IsFormAvail(IFX_DownloadHints *pHints) FX_OVERRIDE;
963 virtual FX_INT32 IsLinearizedPDF() FX_OVERRIDE;
965 virtual FX_BOOL IsLinearized() FX_OVERRIDE
967 return m_bLinearized;
970 virtual void GetLinearizedMainXRefInfo(FX_FILESIZE *pPos, FX_DWORD *pSize) FX_OVERRIDE;
971 IFX_FileRead* GetFileRead() const
975 IFX_FileAvail* GetFileAvail() const
980 FX_DWORD GetObjectSize(FX_DWORD objnum, FX_FILESIZE& offset);
981 FX_BOOL IsObjectsAvail(CFX_PtrArray& obj_array, FX_BOOL bParsePage, IFX_DownloadHints* pHints, CFX_PtrArray &ret_array);
982 FX_BOOL CheckDocStatus(IFX_DownloadHints *pHints);
983 FX_BOOL CheckHeader(IFX_DownloadHints* pHints);
984 FX_BOOL CheckFirstPage(IFX_DownloadHints *pHints);
985 FX_BOOL CheckEnd(IFX_DownloadHints *pHints);
986 FX_BOOL CheckCrossRef(IFX_DownloadHints* pHints);
987 FX_BOOL CheckCrossRefItem(IFX_DownloadHints *pHints);
988 FX_BOOL CheckTrailer(IFX_DownloadHints* pHints);
989 FX_BOOL CheckRoot(IFX_DownloadHints* pHints);
990 FX_BOOL CheckInfo(IFX_DownloadHints* pHints);
991 FX_BOOL CheckPages(IFX_DownloadHints* pHints);
992 FX_BOOL CheckPage(IFX_DownloadHints* pHints);
993 FX_BOOL CheckResources(IFX_DownloadHints* pHints);
994 FX_BOOL CheckAnnots(IFX_DownloadHints* pHints);
995 FX_BOOL CheckAcroForm(IFX_DownloadHints* pHints);
996 FX_BOOL CheckAcroFormSubObject(IFX_DownloadHints* pHints);
997 FX_BOOL CheckTrailerAppend(IFX_DownloadHints* pHints);
998 FX_BOOL CheckPageStatus(IFX_DownloadHints* pHints);
999 FX_BOOL CheckAllCrossRefStream(IFX_DownloadHints *pHints);
1001 FX_DWORD CheckCrossRefStream(IFX_DownloadHints *pHints, FX_FILESIZE &xref_offset);
1002 FX_BOOL IsLinearizedFile(FX_LPBYTE pData, FX_DWORD dwLen);
1003 void SetStartOffset(FX_FILESIZE dwOffset);
1004 FX_BOOL GetNextToken(CFX_ByteString &token);
1005 FX_BOOL GetNextChar(FX_BYTE &ch);
1006 CPDF_Object * ParseIndirectObjectAt(FX_FILESIZE pos, FX_DWORD objnum);
1007 CPDF_Object * GetObject(FX_DWORD objnum, IFX_DownloadHints* pHints, FX_BOOL *pExistInFile);
1008 FX_BOOL GetPageKids(CPDF_Parser *pParser, CPDF_Object *pPages);
1009 FX_BOOL PreparePageItem();
1010 FX_BOOL LoadPages(IFX_DownloadHints* pHints);
1011 FX_BOOL LoadAllXref(IFX_DownloadHints* pHints);
1012 FX_BOOL LoadAllFile(IFX_DownloadHints* pHints);
1013 FX_BOOL CheckLinearizedData(IFX_DownloadHints* pHints);
1014 FX_BOOL CheckFileResources(IFX_DownloadHints* pHints);
1015 FX_BOOL CheckPageAnnots(int iPage, IFX_DownloadHints* pHints);
1017 FX_BOOL CheckLinearizedFirstPage(int iPage, IFX_DownloadHints* pHints);
1018 FX_BOOL HaveResourceAncestor(CPDF_Dictionary *pDict);
1019 FX_BOOL CheckPage(FX_INT32 iPage, IFX_DownloadHints* pHints);
1020 FX_BOOL LoadDocPages(IFX_DownloadHints* pHints);
1021 FX_BOOL LoadDocPage(FX_INT32 iPage, IFX_DownloadHints* pHints);
1022 FX_BOOL CheckPageNode(CPDF_PageNode &pageNodes, FX_INT32 iPage, FX_INT32 &iCount, IFX_DownloadHints* pHints);
1023 FX_BOOL CheckUnkownPageNode(FX_DWORD dwPageNo, CPDF_PageNode *pPageNode, IFX_DownloadHints* pHints);
1024 FX_BOOL CheckArrayPageNode(FX_DWORD dwPageNo, CPDF_PageNode *pPageNode, IFX_DownloadHints* pHints);
1025 FX_BOOL CheckPageCount(IFX_DownloadHints* pHints);
1026 FX_BOOL IsFirstCheck(int iPage);
1027 void ResetFirstCheck(int iPage);
1029 CPDF_Parser m_parser;
1031 CPDF_SyntaxParser m_syntaxParser;
1033 CPDF_Object *m_pRoot;
1035 FX_DWORD m_dwRootObjNum;
1037 FX_DWORD m_dwInfoObjNum;
1039 CPDF_Object *m_pLinearized;
1041 CPDF_Object *m_pTrailer;
1043 FX_BOOL m_bDocAvail;
1045 FX_FILESIZE m_dwHeaderOffset;
1047 FX_FILESIZE m_dwLastXRefOffset;
1049 FX_FILESIZE m_dwXRefOffset;
1051 FX_FILESIZE m_dwTrailerOffset;
1053 FX_FILESIZE m_dwCurrentOffset;
1055 PDF_DATAAVAIL_STATUS m_docStatus;
1057 IFX_FileAvail* m_pFileAvail;
1059 IFX_FileRead* m_pFileRead;
1061 FX_FILESIZE m_dwFileLen;
1063 CPDF_Document* m_pDocument;
1065 CPDF_SortObjNumArray m_objnum_array;
1067 CFX_PtrArray m_objs_array;
1071 FX_FILESIZE m_bufferOffset;
1073 FX_DWORD m_bufferSize;
1075 CFX_ByteString m_WordBuf;
1077 FX_BYTE m_WordBuffer[257];
1079 FX_DWORD m_WordSize;
1081 FX_BYTE m_bufferData[512];
1083 CFX_FileSizeArray m_CrossOffset;
1085 CFX_DWordArray m_XRefStreamList;
1087 CFX_DWordArray m_PageObjList;
1089 FX_DWORD m_PagesObjNum;
1091 FX_BOOL m_bLinearized;
1093 FX_DWORD m_dwFirstPageNo;
1095 FX_BOOL m_bLinearedDataOK;
1097 FX_BOOL m_bMainXRefLoadTried;
1099 FX_BOOL m_bMainXRefLoadedOK;
1101 FX_BOOL m_bPagesTreeLoad;
1103 FX_BOOL m_bPagesLoad;
1105 CPDF_Parser * m_pCurrentParser;
1107 FX_FILESIZE m_dwCurrentXRefSteam;
1109 FX_BOOL m_bAnnotsLoad;
1111 FX_BOOL m_bHaveAcroForm;
1113 FX_DWORD m_dwAcroFormObjNum;
1115 FX_BOOL m_bAcroFormLoad;
1117 CPDF_Object * m_pAcroForm;
1119 CFX_PtrArray m_arrayAcroforms;
1121 CPDF_Dictionary * m_pPageDict;
1123 CPDF_Object * m_pPageResource;
1125 FX_BOOL m_bNeedDownLoadResource;
1127 FX_BOOL m_bPageLoadedOK;
1129 FX_BOOL m_bLinearizedFormParamLoad;
1131 CFX_PtrArray m_PagesArray;
1133 FX_DWORD m_dwEncryptObjNum;
1135 FX_FILESIZE m_dwPrevXRefOffset;
1137 FX_BOOL m_bTotalLoadPageTree;
1139 FX_BOOL m_bCurPageDictLoadOK;
1141 CPDF_PageNode m_pageNodes;
1143 CFX_CMapDWordToDWord * m_pageMapCheckState;
1145 CFX_CMapDWordToDWord * m_pagesLoadState;