blob: 9504061fcff7630019bd4636c45a0cffef46c1b8 [file] [log] [blame]
// Copyright 2016 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_INCLUDE_FPDFAPI_FPDF_PARSER_H_
#define CORE_INCLUDE_FPDFAPI_FPDF_PARSER_H_
#include <map>
#include <memory>
#include <set>
#include "core/include/fpdfapi/fpdf_objects.h"
#include "core/include/fxcrt/fx_basic.h"
class CFX_Font;
class CFX_Matrix;
class CPDF_ColorSpace;
class IPDF_CryptoHandler;
class CPDF_Document;
class CPDF_DocPageData;
class CPDF_DocRenderData;
class CPDF_Font;
class CPDF_FontEncoding;
class CPDF_IccProfile;
class CPDF_Image;
class CPDF_Object;
class CPDF_Parser;
class CPDF_Pattern;
class CPDF_StandardSecurityHandler;
class CPDF_SyntaxParser;
class IPDF_SecurityHandler;
#define FPDFPERM_PRINT 0x0004
#define FPDFPERM_MODIFY 0x0008
#define FPDFPERM_EXTRACT 0x0010
#define FPDFPERM_ANNOT_FORM 0x0020
#define FPDFPERM_FILL_FORM 0x0100
#define FPDFPERM_EXTRACT_ACCESS 0x0200
#define FPDFPERM_ASSEMBLE 0x0400
#define FPDFPERM_PRINT_HIGH 0x0800
#define FPDF_PAGE_MAX_NUM 0xFFFFF
// Indexed by 8-bit char code, contains unicode code points.
extern const FX_WORD PDFDocEncoding[256];
CFX_ByteString PDF_NameDecode(const CFX_ByteStringC& orig);
CFX_ByteString PDF_NameDecode(const CFX_ByteString& orig);
CFX_ByteString PDF_NameEncode(const CFX_ByteString& orig);
CFX_ByteString PDF_EncodeString(const CFX_ByteString& src,
FX_BOOL bHex = FALSE);
CFX_WideString PDF_DecodeText(const uint8_t* pData, FX_DWORD size);
CFX_WideString PDF_DecodeText(const CFX_ByteString& bstr);
CFX_ByteString PDF_EncodeText(const FX_WCHAR* pString, int len = -1);
CFX_ByteString PDF_EncodeText(const CFX_WideString& str);
class CFDF_Document : public CPDF_IndirectObjectHolder {
public:
static CFDF_Document* CreateNewDoc();
static CFDF_Document* ParseFile(IFX_FileRead* pFile,
FX_BOOL bOwnFile = FALSE);
static CFDF_Document* ParseMemory(const uint8_t* pData, FX_DWORD size);
~CFDF_Document();
FX_BOOL WriteBuf(CFX_ByteTextBuf& buf) const;
CPDF_Dictionary* GetRoot() const { return m_pRootDict; }
protected:
CFDF_Document();
void ParseStream(IFX_FileRead* pFile, FX_BOOL bOwnFile);
CPDF_Dictionary* m_pRootDict;
IFX_FileRead* m_pFile;
FX_BOOL m_bOwnFile;
};
void FlateEncode(const uint8_t* src_buf,
FX_DWORD src_size,
uint8_t*& dest_buf,
FX_DWORD& dest_size);
void FlateEncode(const uint8_t* src_buf,
FX_DWORD src_size,
int predictor,
int Colors,
int BitsPerComponent,
int Columns,
uint8_t*& dest_buf,
FX_DWORD& dest_size);
FX_DWORD FlateDecode(const uint8_t* src_buf,
FX_DWORD src_size,
uint8_t*& dest_buf,
FX_DWORD& dest_size);
FX_DWORD RunLengthDecode(const uint8_t* src_buf,
FX_DWORD src_size,
uint8_t*& dest_buf,
FX_DWORD& dest_size);
bool IsSignatureDict(const CPDF_Dictionary* pDict);
class IFX_FileAvail {
public:
virtual ~IFX_FileAvail() {}
virtual FX_BOOL IsDataAvail(FX_FILESIZE offset, FX_DWORD size) = 0;
};
class IFX_DownloadHints {
public:
virtual ~IFX_DownloadHints() {}
virtual void AddSegment(FX_FILESIZE offset, FX_DWORD size) = 0;
};
class IPDF_DataAvail {
public:
// Must match PDF_DATA_* definitions in public/fpdf_dataavail.h, but cannot
// #include that header. fpdfsdk/src/fpdf_dataavail.cpp has static_asserts
// to make sure the two sets of values match.
enum DocAvailStatus {
DataError = -1, // PDF_DATA_ERROR
DataNotAvailable = 0, // PDF_DATA_NOTAVAIL
DataAvailable = 1, // PDF_DATA_AVAIL
};
// Must match PDF_*LINEAR* definitions in public/fpdf_dataavail.h, but cannot
// #include that header. fpdfsdk/src/fpdf_dataavail.cpp has static_asserts
// to make sure the two sets of values match.
enum DocLinearizationStatus {
LinearizationUnknown = -1, // PDF_LINEARIZATION_UNKNOWN
NotLinearized = 0, // PDF_NOT_LINEARIZED
Linearized = 1, // PDF_LINEARIZED
};
// Must match PDF_FORM_* definitions in public/fpdf_dataavail.h, but cannot
// #include that header. fpdfsdk/src/fpdf_dataavail.cpp has static_asserts
// to make sure the two sets of values match.
enum DocFormStatus {
FormError = -1, // PDF_FORM_ERROR
FormNotAvailable = 0, // PDF_FORM_NOTAVAIL
FormAvailable = 1, // PDF_FORM_AVAIL
FormNotExist = 2, // PDF_FORM_NOTEXIST
};
static IPDF_DataAvail* Create(IFX_FileAvail* pFileAvail,
IFX_FileRead* pFileRead);
virtual ~IPDF_DataAvail() {}
IFX_FileAvail* GetFileAvail() const { return m_pFileAvail; }
IFX_FileRead* GetFileRead() const { return m_pFileRead; }
virtual DocAvailStatus IsDocAvail(IFX_DownloadHints* pHints) = 0;
virtual void SetDocument(CPDF_Document* pDoc) = 0;
virtual DocAvailStatus IsPageAvail(int iPage, IFX_DownloadHints* pHints) = 0;
virtual FX_BOOL IsLinearized() = 0;
virtual DocFormStatus IsFormAvail(IFX_DownloadHints* pHints) = 0;
virtual DocLinearizationStatus IsLinearizedPDF() = 0;
virtual void GetLinearizedMainXRefInfo(FX_FILESIZE* pPos,
FX_DWORD* pSize) = 0;
protected:
IPDF_DataAvail(IFX_FileAvail* pFileAvail, IFX_FileRead* pFileRead);
IFX_FileAvail* m_pFileAvail;
IFX_FileRead* m_pFileRead;
};
enum PDF_PAGENODE_TYPE {
PDF_PAGENODE_UNKNOWN = 0,
PDF_PAGENODE_PAGE,
PDF_PAGENODE_PAGES,
PDF_PAGENODE_ARRAY,
};
class CPDF_PageNode {
public:
CPDF_PageNode();
~CPDF_PageNode();
PDF_PAGENODE_TYPE m_type;
FX_DWORD m_dwPageNo;
CFX_ArrayTemplate<CPDF_PageNode*> m_childNode;
};
enum PDF_DATAAVAIL_STATUS {
PDF_DATAAVAIL_HEADER = 0,
PDF_DATAAVAIL_FIRSTPAGE,
PDF_DATAAVAIL_FIRSTPAGE_PREPARE,
PDF_DATAAVAIL_HINTTABLE,
PDF_DATAAVAIL_END,
PDF_DATAAVAIL_CROSSREF,
PDF_DATAAVAIL_CROSSREF_ITEM,
PDF_DATAAVAIL_CROSSREF_STREAM,
PDF_DATAAVAIL_TRAILER,
PDF_DATAAVAIL_LOADALLCROSSREF,
PDF_DATAAVAIL_ROOT,
PDF_DATAAVAIL_INFO,
PDF_DATAAVAIL_ACROFORM,
PDF_DATAAVAIL_ACROFORM_SUBOBJECT,
PDF_DATAAVAIL_PAGETREE,
PDF_DATAAVAIL_PAGE,
PDF_DATAAVAIL_PAGE_LATERLOAD,
PDF_DATAAVAIL_RESOURCES,
PDF_DATAAVAIL_DONE,
PDF_DATAAVAIL_ERROR,
PDF_DATAAVAIL_LOADALLFILE,
PDF_DATAAVAIL_TRAILER_APPEND
};
// Public for testing.
FX_DWORD A85Decode(const uint8_t* src_buf,
FX_DWORD src_size,
uint8_t*& dest_buf,
FX_DWORD& dest_size);
// Public for testing.
FX_DWORD HexDecode(const uint8_t* src_buf,
FX_DWORD src_size,
uint8_t*& dest_buf,
FX_DWORD& dest_size);
// Public for testing.
FX_DWORD FPDFAPI_FlateOrLZWDecode(FX_BOOL bLZW,
const uint8_t* src_buf,
FX_DWORD src_size,
CPDF_Dictionary* pParams,
FX_DWORD estimated_size,
uint8_t*& dest_buf,
FX_DWORD& dest_size);
FX_BOOL PDF_DataDecode(const uint8_t* src_buf,
FX_DWORD src_size,
const CPDF_Dictionary* pDict,
uint8_t*& dest_buf,
FX_DWORD& dest_size,
CFX_ByteString& ImageEncoding,
CPDF_Dictionary*& pImageParms,
FX_DWORD estimated_size,
FX_BOOL bImageAcc);
#endif // CORE_INCLUDE_FPDFAPI_FPDF_PARSER_H_