// Use DLLs (x64, x86) from https://github.com/bblanchon/pdfium-binaries
//
// DLL Version: chromium/6611

unit EM.PdfiumLib;
{$IFDEF FPC}
  {$MODE DelphiUnicode}
{$ENDIF FPC}

{$IFNDEF FPC}
  {$A8,B-,E-,F-,G+,H+,I+,J-,K-,M-,N-,P+,Q-,R-,S-,T-,U-,V+,X+,Z1}
  {$STRINGCHECKS OFF} // It only slows down Delphi strings in Delphi 2009 and 2010
{$ENDIF ~FPC}
{$SCOPEDENUMS ON}

{.$DEFINE DLLEXPORT} // stdcall in WIN32 instead of CDECL in WIN32 (The library switches between those from release to release)

{$DEFINE PDF_USE_SKIA}
{$DEFINE PDF_ENABLE_XFA}
{$DEFINE PDF_ENABLE_V8}

interface

uses
  {$IFDEF FPC}
    {$IFDEF MSWINDOWS}
  Windows;
    {$ELSE}
  dynlibs;
    {$ENDIF MSWINDOWS}
  {$ELSE}
    {$IF CompilerVersion >= 23.0} // XE2+
  WinApi.Windows;
    {$ELSE}
  Windows;
    {$IFEND}
  {$ENDIF FPC}

type
  // Delphi/FPC version compatibility types
  {$IF not declared(SIZE_T)}
  SIZE_T = LongWord;
  {$IFEND}
  {$IF not declared(DWORD)}
  DWORD = UInt32;
  {$IFEND}
  {$IF not declared(UINT)}
  UINT = LongWord;
  {$IFEND}
  {$IF not declared(PUINT)}
  PUINT = ^UINT;
  {$IFEND}
  TIME_T = Longint;
  PTIME_T = ^TIME_T;

// Returns True if the pdfium.dll supports Skia.
function PDF_IsSkiaAvailable: Boolean;


// *** _FPDFVIEW_H_ ***

{.$IFDEF PDF_ENABLE_XFA}
// PDF_USE_XFA is set in confirmation that this version of PDFium can support
// XFA forms as requested by the PDF_ENABLE_XFA setting.
function PDF_USE_XFA: Boolean;
{.$ENDIF PDF_ENABLE_XFA}

const
  // PDF object types
  FPDF_OBJECT_UNKNOWN = 0;
  FPDF_OBJECT_BOOLEAN = 1;
  FPDF_OBJECT_NUMBER = 2;
  FPDF_OBJECT_STRING = 3;
  FPDF_OBJECT_NAME = 4;
  FPDF_OBJECT_ARRAY = 5;
  FPDF_OBJECT_DICTIONARY = 6;
  FPDF_OBJECT_STREAM = 7;
  FPDF_OBJECT_NULLOBJ = 8;
  FPDF_OBJECT_REFERENCE = 9;

// PDF text rendering modes
type
  FPDF_TEXT_RENDERMODE = Integer;
const
  FPDF_TEXTRENDERMODE_UNKNOWN = -1;
  FPDF_TEXTRENDERMODE_FILL = 0;
  FPDF_TEXTRENDERMODE_STROKE = 1;
  FPDF_TEXTRENDERMODE_FILL_STROKE = 2;
  FPDF_TEXTRENDERMODE_INVISIBLE = 3;
  FPDF_TEXTRENDERMODE_FILL_CLIP = 4;
  FPDF_TEXTRENDERMODE_STROKE_CLIP = 5;
  FPDF_TEXTRENDERMODE_FILL_STROKE_CLIP = 6;
  FPDF_TEXTRENDERMODE_CLIP = 7;
  FPDF_TEXTRENDERMODE_LAST = FPDF_TEXTRENDERMODE_CLIP;

type
  // Helper data type for type safety.
  __FPDF_PTRREC = record end;
  __PFPDF_PTRREC = ^__FPDF_PTRREC;
  PFPDF_LINK = ^FPDF_LINK; // array
  PFPDF_PAGE = ^FPDF_PAGE; // array

  // PDF types - use incomplete types (never completed) to force API type safety.
  FPDF_ACTION             = type __PFPDF_PTRREC;
  FPDF_ANNOTATION         = type __PFPDF_PTRREC;
  FPDF_ATTACHMENT         = type __PFPDF_PTRREC;
  FPDF_AVAIL              = type __PFPDF_PTRREC;
  FPDF_BITMAP             = type __PFPDF_PTRREC;
  FPDF_BOOKMARK           = type __PFPDF_PTRREC;
  FPDF_CLIPPATH           = type __PFPDF_PTRREC;
  FPDF_DEST               = type __PFPDF_PTRREC;
  FPDF_DOCUMENT           = type __PFPDF_PTRREC;
  FPDF_FONT               = type __PFPDF_PTRREC;
  FPDF_FORMHANDLE         = type __PFPDF_PTRREC;
  FPDF_GLYPHPATH          = type __PFPDF_PTRREC;
  FPDF_JAVASCRIPT_ACTION  = type __PFPDF_PTRREC;
  FPDF_LINK               = type __PFPDF_PTRREC;
  FPDF_PAGE               = type __PFPDF_PTRREC;
  FPDF_PAGELINK           = type __PFPDF_PTRREC;
  FPDF_PAGEOBJECT         = type __PFPDF_PTRREC;  // (text, path, etc.)
  FPDF_PAGEOBJECTMARK     = type __PFPDF_PTRREC;
  FPDF_PAGERANGE          = type __PFPDF_PTRREC;
  FPDF_PATHSEGMENT        = type __PFPDF_PTRREC;
  FPDF_SCHHANDLE          = type __PFPDF_PTRREC;
  FPDF_SIGNATURE          = type __PFPDF_PTRREC;
  FPDF_SKIA_CANVAS        = type Pointer;  // Passed into Skia as an SkCanvas.
  FPDF_STRUCTELEMENT      = type __PFPDF_PTRREC;
  FPDF_STRUCTELEMENT_ATTR = type __PFPDF_PTRREC;
  FPDF_STRUCTELEMENT_ATTR_VALUE = type __PFPDF_PTRREC;
  FPDF_STRUCTTREE         = type __PFPDF_PTRREC;
  FPDF_TEXTPAGE           = type __PFPDF_PTRREC;
  FPDF_WIDGET             = type __PFPDF_PTRREC;
  FPDF_XOBJECT            = type __PFPDF_PTRREC;

  // Basic data types
  FPDF_BOOL  = Integer;
  FPDF_RESULT = Integer;
  FPDF_DWORD = LongWord;
  FS_FLOAT = Single;
  PFS_FLOAT = ^FS_FLOAT;

  // Duplex types
  FPDF_DUPLEXTYPE = (
    DuplexUndefined = 0,
    Simplex,
    DuplexFlipShortEdge,
    DuplexFlipLongEdge
  );

  // String types
  PFPDF_WCHAR = PWideChar;
  FPDF_WCHAR = WideChar;

  // The public PDFium API uses three types of strings: byte string, wide string
  // (UTF-16LE encoded), and platform dependent string.

  // Public PDFium API type for byte strings.
  FPDF_BYTESTRING = PAnsiChar;

  // The public PDFium API always uses UTF-16LE encoded wide strings, each
  // character uses 2 bytes (except surrogation), with the low byte first.
  FPDF_WIDESTRING = PFPDF_WCHAR;

  // Structure for persisting a string beyond the duration of a callback.
  // Note: although represented as a char*, string may be interpreted as
  // a UTF-16LE formated string. Used only by XFA callbacks.
  PFPDF_BSTR = ^FPDF_BSTR;
  FPDF_BSTR = record
    str: PAnsiChar; // String buffer, manipulate only with FPDF_BStr_* methods.
    len: Integer;   // Length of the string, in bytes.
  end;
  PFPdfBStr = ^TFPdfBStr;
  TFPdfBStr = FPDF_BSTR;

  // For Windows programmers: In most cases it's OK to treat FPDF_WIDESTRING as a
  // Windows unicode string, however, special care needs to be taken if you
  // expect to process Unicode larger than 0xffff.
  //
  // For Linux/Unix programmers: most compiler/library environments use 4 bytes
  // for a Unicode character, and you have to convert between FPDF_WIDESTRING and
  // system wide string by yourself.
  FPDF_STRING = PAnsiChar;

  // Matrix for transformation, in the form [a b c d e f], equivalent to:
  // | a  b  0 |
  // | c  d  0 |
  // | e  f  1 |
  //
  // Translation is performed with [1 0 0 1 tx ty].
  // Scaling is performed with [sx 0 0 sy 0 0].
  // See PDF Reference 1.7, 4.2.2 Common Transformations for more.
  PFS_MATRIX = ^FS_MATRIX;
  FS_MATRIX = record
    a: Single;
    b: Single;
    c: Single;
    d: Single;
    e: Single;
    f: Single;
  end;
  PFSMatrix = ^TFSMatrix;
  TFSMatrix = FS_MATRIX;

  // Rectangle area(float) in device or page coordinate system.
  PFS_RECTF = ^FS_RECTF;
  FS_RECTF = record
    // The x-coordinate of the left-top corner.
    left: Single;
    // The y-coordinate of the left-top corner.
    top: Single;
    // The x-coordinate of the right-bottom corner.
    right: Single;
    // The y-coordinate of the right-bottom corner.
    bottom: Single;
  end;
  // Const Pointer to FS_RECTF structure.
  FS_LPCRECTF = ^FS_RECTF;
  PFSRectF = ^TFSRectF;
  TFSRectF = FS_RECTF;

  // Rectangle size. Coordinate system agnostic.
  PFS_SIZEF = ^FS_SIZEF;
  FS_SIZEF = record
    width: Single;
    height: Single;
  end;
  PFSSizeF = ^TFSSizeF;
  TFSSizeF = FS_SIZEF;

  // Const Pointer to FS_SIZEF structure.
  PFS_POINTF = ^FS_POINTF;
  FS_POINTF = record
    x: Single;
    y: Single;
  end;
  PFSPointF = ^TFSPointF;
  TFSPointF = FS_POINTF;

  // Const Pointer to FS_POINTF structure.
  FS_LPCPOINTF = ^FS_POINTF;

  PFS_QUADPOINTSF = ^FS_QUADPOINTSF;
  FS_QUADPOINTSF = record
    x1: FS_FLOAT;
    y1: FS_FLOAT;
    x2: FS_FLOAT;
    y2: FS_FLOAT;
    x3: FS_FLOAT;
    y3: FS_FLOAT;
    x4: FS_FLOAT;
    y4: FS_FLOAT;
  end;
  PFSQuadPointsF = ^TFSQuadPointsF;
  TFSQuadPointsF = FS_QUADPOINTSF;

  // Annotation enums.
  FPDF_ANNOTATION_SUBTYPE = Integer;
  PFPDF_ANNOTATION_SUBTYPE = ^FPDF_ANNOTATION_SUBTYPE;
  FPDF_ANNOT_APPEARANCEMODE = Integer;

  // Dictionary value types.
  FPDF_OBJECT_TYPE = Integer;

// PDF renderer types - Experimental.
// Selection of 2D graphics library to use for rendering to FPDF_BITMAPs.
type
  FPDF_RENDERER_TYPE = Integer;
const
  // Anti-Grain Geometry - https://sourceforge.net/projects/agg/
  FPDF_RENDERERTYPE_AGG = 0;
  // Skia - https://skia.org/
  FPDF_RENDERERTYPE_SKIA = 1;

type
  // Process-wide options for initializing the library.
  PFPDF_LIBRARY_CONFIG = ^FPDF_LIBRARY_CONFIG;
  FPDF_LIBRARY_CONFIG = record
    // Version number of the interface. Currently must be 2.
    // Support for version 1 will be deprecated in the future.
    version: Integer;

    // Array of paths to scan in place of the defaults when using built-in
    // FXGE font loading code. The array is terminated by a NULL pointer.
    // The Array may be NULL itself to use the default paths. May be ignored
    // entirely depending upon the platform.
    m_pUserFontPaths: PPAnsiChar;

    // Version 2.

    // Pointer to the v8::Isolate to use, or NULL to force PDFium to create one.
    m_pIsolate: Pointer;

    // The embedder data slot to use in the v8::Isolate to store PDFium's
    // per-isolate data. The value needs to be in the range
    // [0, |v8::Internals::kNumIsolateDataLots|). Note that 0 is fine for most
    // embedders.
    m_v8EmbedderSlot: Cardinal;

    // Version 3 - Experimental.

    // Pointer to the V8::Platform to use.
    m_pPlatform: Pointer;

    // Version 4 - Experimental.

    // Explicit specification of core renderer to use. |m_RendererType| must be
    // a valid value for |FPDF_LIBRARY_CONFIG| versions of this level or higher,
    // or else the initialization will fail with an immediate crash.
    // Note that use of a specified |FPDF_RENDERER_TYPE| value for which the
    // corresponding render library is not included in the build will similarly
    // fail with an immediate crash.
    m_RendererType: FPDF_RENDERER_TYPE;
  end;
  PFPdfLibraryConfig = ^TFPdfLibraryConfig;
  TFPdfLibraryConfig = FPDF_LIBRARY_CONFIG;

// Function: FPDF_InitLibraryWithConfig
//          Initialize the PDFium library and allocate global resources for it.
// Parameters:
//          config - configuration information as above.
// Return value:
//          None.
// Comments:
//          You have to call this function before you can call any PDF
//          processing functions.
var
  FPDF_InitLibraryWithConfig: procedure(config: PFPDF_LIBRARY_CONFIG); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_InitLibrary
//          Initialize the PDFium library (alternative form).
// Parameters:
//          None
// Return value:
//          None.
// Comments:
//          Convenience function to call FPDF_InitLibraryWithConfig() with a
//          default configuration for backwards compatibility purposes. New
//          code should call FPDF_InitLibraryWithConfig() instead. This will
//          be deprecated in the future.
var
  FPDF_InitLibrary: procedure(); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_DestroyLibary
//          Release global resources allocated to the PDFium library by
//          FPDF_InitLibrary() or FPDF_InitLibraryWithConfig().
// Parameters:
//          None.
// Return value:
//          None.
// Comments:
//          After this function is called, you must not call any PDF
//          processing functions.
//
//          Calling this function does not automatically close other
//          objects. It is recommended to close other objects before
//          closing the library with this function.
var
  FPDF_DestroyLibrary: procedure(); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Policy for accessing the local machine time.
const
  FPDF_POLICY_MACHINETIME_ACCESS = 0;

// Function: FPDF_SetSandBoxPolicy
//          Set the policy for the sandbox environment.
// Parameters:
//          policy -   The specified policy for setting, for example:
//                     FPDF_POLICY_MACHINETIME_ACCESS.
//          enable -   True to enable, false to disable the policy.
// Return value:
//          None.
var
  FPDF_SetSandBoxPolicy: procedure(policy: FPDF_DWORD; enable: FPDF_BOOL); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

{$IFDEF MSWINDOWS}
// Experimental API.
// Function: FPDF_SetPrintMode
//          Set printing mode when printing on Windows.
// Parameters:
//          mode - FPDF_PRINTMODE_EMF to output EMF (default)
//                 FPDF_PRINTMODE_TEXTONLY to output text only (for charstream
//                 devices)
//                 FPDF_PRINTMODE_POSTSCRIPT2 to output level 2 PostScript into
//                 EMF as a series of GDI comments.
//                 FPDF_PRINTMODE_POSTSCRIPT3 to output level 3 PostScript into
//                 EMF as a series of GDI comments.
//                 FPDF_PRINTMODE_POSTSCRIPT2_PASSTHROUGH to output level 2
//                 PostScript via ExtEscape() in PASSTHROUGH mode.
//                 FPDF_PRINTMODE_POSTSCRIPT3_PASSTHROUGH to output level 3
//                 PostScript via ExtEscape() in PASSTHROUGH mode.
//                 FPDF_PRINTMODE_EMF_IMAGE_MASKS to output EMF, with more
//                 efficient processing of documents containing image masks.
//                 FPDF_PRINTMODE_POSTSCRIPT3_TYPE42 to output level 3
//                 PostScript with embedded Type 42 fonts, when applicable, into
//                 EMF as a series of GDI comments.
//                 FPDF_PRINTMODE_POSTSCRIPT3_TYPE42_PASSTHROUGH to output level
//                 3 PostScript with embedded Type 42 fonts, when applicable,
//                 via ExtEscape() in PASSTHROUGH mode.
// Return value:
//          True if successful, false if unsuccessful (typically invalid input).
var
  FPDF_SetPrintMode: function(mode: Integer): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};
{$ENDIF MSWINDOWS}

// Function: FPDF_LoadDocument
//          Open and load a PDF document.
// Parameters:
//          file_path -  Path to the PDF file (including extension).
//          password  -  A string used as the password for the PDF file.
//                       If no password is needed, empty or NULL can be used.
//                       See comments below regarding the encoding.
// Return value:
//          A handle to the loaded document, or NULL on failure.
// Comments:
//          Loaded document can be closed by FPDF_CloseDocument().
//          If this function fails, you can use FPDF_GetLastError() to retrieve
//          the reason why it failed.
//
//          The encoding for |file_path| is UTF-8.
//
//          The encoding for |password| can be either UTF-8 or Latin-1. PDFs,
//          depending on the security handler revision, will only accept one or
//          the other encoding. If |password|'s encoding and the PDF's expected
//          encoding do not match, FPDF_LoadDocument() will automatically
//          convert |password| to the other encoding.
var
  FPDF_LoadDocument: function(file_path: FPDF_STRING; password: FPDF_BYTESTRING): FPDF_DOCUMENT; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_LoadMemDocument
//          Open and load a PDF document from memory.
// Parameters:
//          data_buf    -   Pointer to a buffer containing the PDF document.
//          size        -   Number of bytes in the PDF document.
//          password    -   A string used as the password for the PDF file.
//                          If no password is needed, empty or NULL can be used.
// Return value:
//          A handle to the loaded document, or NULL on failure.
// Comments:
//          The memory buffer must remain valid when the document is open.
//          The loaded document can be closed by FPDF_CloseDocument.
//          If this function fails, you can use FPDF_GetLastError() to retrieve
//          the reason why it failed.
//
//          See the comments for FPDF_LoadDocument() regarding the encoding for
//          |password|.
// Notes:
//          If PDFium is built with the XFA module, the application should call
//          FPDF_LoadXFA() function after the PDF document loaded to support XFA
//          fields defined in the fpdfformfill.h file.
var
  FPDF_LoadMemDocument: function(data_buf: Pointer; size: Integer; password: FPDF_BYTESTRING): FPDF_DOCUMENT; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDF_LoadMemDocument64
//          Open and load a PDF document from memory.
// Parameters:
//          data_buf    -   Pointer to a buffer containing the PDF document.
//          size        -   Number of bytes in the PDF document.
//          password    -   A string used as the password for the PDF file.
//                          If no password is needed, empty or NULL can be used.
// Return value:
//          A handle to the loaded document, or NULL on failure.
// Comments:
//          The memory buffer must remain valid when the document is open.
//          The loaded document can be closed by FPDF_CloseDocument.
//          If this function fails, you can use FPDF_GetLastError() to retrieve
//          the reason why it failed.
//
//          See the comments for FPDF_LoadDocument() regarding the encoding for
//          |password|.
// Notes:
//          If PDFium is built with the XFA module, the application should call
//          FPDF_LoadXFA() function after the PDF document loaded to support XFA
//          fields defined in the fpdfformfill.h file.
var
  FPDF_LoadMemDocument64: function(data_buf: Pointer; size: SIZE_T; password: FPDF_BYTESTRING): FPDF_DOCUMENT; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Structure for custom file access.
type
  PFPDF_FILEACCESS = ^FPDF_FILEACCESS;
  FPDF_FILEACCESS = record
    // File length, in bytes.
    m_FileLen: LongWord;

    // A function pointer for getting a block of data from a specific position.
    // Position is specified by byte offset from the beginning of the file.
    // The pointer to the buffer is never NULL and the size is never 0.
    // The position and size will never go out of range of the file length.
    // It may be possible for PDFium to call this function multiple times for
    // the same position.
    // Return value: should be non-zero if successful, zero for error.
    m_GetBlock: function(param: Pointer; position: LongWord; pBuf: PByte; size: LongWord): Integer; cdecl;

    // A custom pointer for all implementation specific data.  This pointer will
    // be used as the first parameter to the m_GetBlock callback.
    m_Param: Pointer;
  end;
  PFPdfFileAccess = ^TFPdfFileAccess;
  TFPdfFileAccess = FPDF_FILEACCESS;

  // Structure for file reading or writing (I/O).
  //
  // Note: This is a handler and should be implemented by callers,
  // and is only used from XFA.
  PFPDF_FILEHANDLER = ^FPDF_FILEHANDLER;
  FPDF_FILEHANDLER = record
    // User-defined data.
    // Note: Callers can use this field to track controls.
    clientData: Pointer;

    // Callback function to release the current file stream object.
    //
    // Parameters:
    //       clientData   -  Pointer to user-defined data.
    // Returns:
    //       None.
    Release: procedure(clientData: Pointer); cdecl;

    // Callback function to retrieve the current file stream size.
    //
    // Parameters:
    //       clientData   -  Pointer to user-defined data.
    // Returns:
    //       Size of file stream.
    GetSize: function(clientData: Pointer): FPDF_DWORD; cdecl;

    // Callback function to read data from the current file stream.
    //
    // Parameters:
    //       clientData   -  Pointer to user-defined data.
    //       offset       -  Offset position starts from the beginning of file
    //                       stream. This parameter indicates reading position.
    //       buffer       -  Memory buffer to store data which are read from
    //                       file stream. This parameter should not be NULL.
    //       size         -  Size of data which should be read from file stream,
    //                       in bytes. The buffer indicated by |buffer| must be
    //                       large enough to store specified data.
    // Returns:
    //       0 for success, other value for failure.
    ReadBlock: function(clientData: Pointer; offset: FPDF_DWORD; buffer: Pointer; size: FPDF_DWORD): FPDF_RESULT; cdecl;

    // Callback function to write data into the current file stream.
    //
    // Parameters:
    //       clientData   -  Pointer to user-defined data.
    //       offset       -  Offset position starts from the beginning of file
    //                       stream. This parameter indicates writing position.
    //       buffer       -  Memory buffer contains data which is written into
    //                       file stream. This parameter should not be NULL.
    //       size         -  Size of data which should be written into file
    //                       stream, in bytes.
    // Returns:
    //       0 for success, other value for failure.
    WriteBlock: function(clientData: Pointer; offset: FPDF_DWORD; const buffer: Pointer; size: FPDF_DWORD): FPDF_RESULT; cdecl;

    // Callback function to flush all internal accessing buffers.
    //
    // Parameters:
    //       clientData   -  Pointer to user-defined data.
    // Returns:
    //       0 for success, other value for failure.
    Flush: function(clientData: Pointer): FPDF_RESULT; cdecl;

    // Callback function to change file size.
    //
    // Description:
    //       This function is called under writing mode usually. Implementer
    //       can determine whether to realize it based on application requests.
    // Parameters:
    //       clientData   -  Pointer to user-defined data.
    //       size         -  New size of file stream, in bytes.
    // Returns:
    //       0 for success, other value for failure.
    Truncate: function(clientData: Pointer; size: FPDF_DWORD): FPDF_RESULT; cdecl;
  end;
  PFPdfFileHandler = ^TFPdfFileHandler;
  TFPdfFileHandler = FPDF_FILEHANDLER;

// Function: FPDF_LoadCustomDocument
//          Load PDF document from a custom access descriptor.
// Parameters:
//          pFileAccess -   A structure for accessing the file.
//          password    -   Optional password for decrypting the PDF file.
// Return value:
//          A handle to the loaded document, or NULL on failure.
// Comments:
//          The application must keep the file resources |pFileAccess| points to
//          valid until the returned FPDF_DOCUMENT is closed. |pFileAccess|
//          itself does not need to outlive the FPDF_DOCUMENT.
//
//          The loaded document can be closed with FPDF_CloseDocument().
//
//          See the comments for FPDF_LoadDocument() regarding the encoding for
//          |password|.
// Notes:
//          If PDFium is built with the XFA module, the application should call
//          FPDF_LoadXFA() function after the PDF document loaded to support XFA
//          fields defined in the fpdfformfill.h file.
var
  FPDF_LoadCustomDocument: function(pFileAccess: PFPDF_FILEACCESS; password: FPDF_BYTESTRING): FPDF_DOCUMENT; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_GetFileVersion
//          Get the file version of the given PDF document.
// Parameters:
//          doc         -   Handle to a document.
//          fileVersion -   The PDF file version. File version: 14 for 1.4, 15 for 1.5, ...
// Return value:
//          True if succeeds, false otherwise.
// Comments:
//          If the document was created by FPDF_CreateNewDocument,
//          then this function will always fail.
var
  FPDF_GetFileVersion: function(doc: FPDF_DOCUMENT; var fileVersion: Integer): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

const
  FPDF_ERR_SUCCESS   = 0;    // No error.
  FPDF_ERR_UNKNOWN   = 1;    // Unknown error.
  FPDF_ERR_FILE      = 2;    // File not found or could not be opened.
  FPDF_ERR_FORMAT    = 3;    // File not in PDF format or corrupted.
  FPDF_ERR_PASSWORD  = 4;    // Password required or incorrect password.
  FPDF_ERR_SECURITY  = 5;    // Unsupported security scheme.
  FPDF_ERR_PAGE      = 6;    // Page not found or content error.
{$IFDEF PDF_ENABLE_XFA}
  FPDF_ERR_XFALOAD   = 7;    // Load XFA error.
  FPDF_ERR_XFALAYOUT = 8;    // Layout XFA error.
{$ENDIF PDF_ENABLE_XFA}

// Function: FPDF_GetLastError
//          Get last error code when a function fails.
// Parameters:
//          None.
// Return value:
//          A 32-bit integer indicating error code as defined above.
// Comments:
//          If the previous SDK call succeeded, the return value of this
//          function is not defined. This function only works in conjunction
//          with APIs that mention FPDF_GetLastError() in their documentation.
var
  FPDF_GetLastError: function(): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDF_DocumentHasValidCrossReferenceTable
//          Whether the document's cross reference table is valid or not.
// Parameters:
//          document    -   Handle to a document. Returned by FPDF_LoadDocument.
// Return value:
//          True if the PDF parser did not encounter problems parsing the cross
//          reference table. False if the parser could not parse the cross
//          reference table and the table had to be rebuild from other data
//          within the document.
// Comments:
//          The return value can change over time as the PDF parser evolves.
var
  FPDF_DocumentHasValidCrossReferenceTable: function(document: FPDF_DOCUMENT): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDF_GetTrailerEnds
//          Get the byte offsets of trailer ends.
// Parameters:
//          document    -   Handle to document. Returned by FPDF_LoadDocument().
//          buffer      -   The address of a buffer that receives the
//                          byte offsets.
//          length      -   The size, in ints, of |buffer|.
// Return value:
//          Returns the number of ints in the buffer on success, 0 on error.
//
// |buffer| is an array of integers that describes the exact byte offsets of the
// trailer ends in the document. If |length| is less than the returned length,
// or |document| or |buffer| is NULL, |buffer| will not be modified.
var
  FPDF_GetTrailerEnds: function(document: FPDF_DOCUMENT; buffer: PUINT; length: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_GetDocPermissions
//          Get file permission flags of the document.
// Parameters:
//          document    -   Handle to a document. Returned by FPDF_LoadDocument.
// Return value:
//          A 32-bit integer indicating permission flags. Please refer to the
//          PDF Reference for detailed descriptions. If the document is not
//          protected or was unlocked by the owner, 0xffffffff will be returned.
var
  FPDF_GetDocPermissions: function(document: FPDF_DOCUMENT): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_GetDocUserPermissions
//          Get user file permission flags of the document.
// Parameters:
//          document    -   Handle to a document. Returned by FPDF_LoadDocument.
// Return value:
//          A 32-bit integer indicating permission flags. Please refer to the
//          PDF Reference for detailed descriptions. If the document is not
//          protected, 0xffffffff will be returned. Always returns user
//          permissions, even if the document was unlocked by the owner.
var
  FPDF_GetDocUserPermissions: function(document: FPDF_DOCUMENT): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_GetSecurityHandlerRevision
//          Get the revision for the security handler.
// Parameters:
//          document    -   Handle to a document. Returned by FPDF_LoadDocument.
// Return value:
//          The security handler revision number. Please refer to the PDF
//          Reference for a detailed description. If the document is not
//          protected, -1 will be returned.
var
  FPDF_GetSecurityHandlerRevision: function(document: FPDF_DOCUMENT): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_GetPageCount
//          Get total number of pages in the document.
// Parameters:
//          document    -   Handle to document. Returned by FPDF_LoadDocument.
// Return value:
//          Total number of pages in the document.
var
  FPDF_GetPageCount: function(document: FPDF_DOCUMENT): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_LoadPage
//          Load a page inside the document.
// Parameters:
//          document    -   Handle to document. Returned by FPDF_LoadDocument
//          page_index  -   Index number of the page. 0 for the first page.
// Return value:
//          A handle to the loaded page, or NULL if page load fails.
// Comments:
//          The loaded page can be rendered to devices using FPDF_RenderPage.
//          The loaded page can be closed using FPDF_ClosePage.
var
  FPDF_LoadPage: function(document: FPDF_DOCUMENT; page_index: Integer): FPDF_PAGE; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API
// Function: FPDF_GetPageWidthF
//          Get page width.
// Parameters:
//          page        -   Handle to the page. Returned by FPDF_LoadPage().
// Return value:
//          Page width (excluding non-displayable area) measured in points.
//          One point is 1/72 inch (around 0.3528 mm).
var
  FPDF_GetPageWidthF: function(page: FPDF_PAGE): Single; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};


// Function: FPDF_GetPageWidth
//          Get page width.
// Parameters:
//          page        -   Handle to the page. Returned by FPDF_LoadPage.
// Return value:
//          Page width (excluding non-displayable area) measured in points.
//          One point is 1/72 inch (around 0.3528 mm).
// Note:
//          Prefer FPDF_GetPageWidthF() above. This will be deprecated in the
//          future.
var
  FPDF_GetPageWidth: function(page: FPDF_PAGE): Double; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API
// Function: FPDF_GetPageHeightF
//          Get page height.
// Parameters:
//          page        -   Handle to the page. Returned by FPDF_LoadPage().
// Return value:
//          Page height (excluding non-displayable area) measured in points.
//          One point is 1/72 inch (around 0.3528 mm)
var
  FPDF_GetPageHeightF: function(page: FPDF_PAGE): Single; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_GetPageHeight
//          Get page height.
// Parameters:
//          page        -   Handle to the page. Returned by FPDF_LoadPage.
// Return value:
//          Page height (excluding non-displayable area) measured in points.
//          One point is 1/72 inch (around 0.3528 mm)
// Note:
//          Prefer FPDF_GetPageHeightF() above. This will be deprecated in the
//          future.
var
  FPDF_GetPageHeight: function(page: FPDF_PAGE): Double; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDF_GetPageBoundingBox
//          Get the bounding box of the page. This is the intersection between
//          its media box and its crop box.
// Parameters:
//          page        -   Handle to the page. Returned by FPDF_LoadPage.
//          rect        -   Pointer to a rect to receive the page bounding box.
//                          On an error, |rect| won't be filled.
// Return value:
//          True for success.
var
  FPDF_GetPageBoundingBox: function(page: FPDF_PAGE; rect: PFS_RECTF): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDF_GetPageSizeByIndexF
//          Get the size of the page at the given index.
// Parameters:
//          document    -   Handle to document. Returned by FPDF_LoadDocument().
//          page_index  -   Page index, zero for the first page.
//          size        -   Pointer to a FS_SIZEF to receive the page size.
//                          (in points).
// Return value:
//          Non-zero for success. 0 for error (document or page not found).
var
  FPDF_GetPageSizeByIndexF: function(document: FPDF_DOCUMENT; page_index: Integer; size: PFS_SIZEF): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_GetPageSizeByIndex
//          Get the size of the page at the given index.
// Parameters:
//          document    -   Handle to document. Returned by FPDF_LoadDocument.
//          page_index  -   Page index, zero for the first page.
//          width       -   Pointer to a double to receive the page width
//                          (in points).
//          height      -   Pointer to a double to receive the page height
//                          (in points).
// Return value:
//          Non-zero for success. 0 for error (document or page not found).
// Note:
//          Prefer FPDF_GetPageSizeByIndexF() above. This will be deprecated in
//          the future.
var
  FPDF_GetPageSizeByIndex: function(document: FPDF_DOCUMENT; page_index: Integer; var width, height: Double): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Page rendering flags. They can be combined with bit-wise OR.
const
  FPDF_ANNOT                    = $01;   // Set if annotations are to be rendered.
  FPDF_LCD_TEXT                 = $02;   // Set if using text rendering optimized for LCD display. This flag will only take effect if anti-aliasing is enabled for text.
  FPDF_NO_NATIVETEXT            = $04;   // Don't use the native text output available on some platforms
  FPDF_GRAYSCALE                = $08 deprecated; // Obsolete, has no effect, retained for compatibility.
  FPDF_DEBUG_INFO               = $80 deprecated; // Obsolete, has no effect, retained for compatibility.
  FPDF_NO_CATCH                 = $100;  // Set if you don't want to catch exceptions.
  FPDF_RENDER_LIMITEDIMAGECACHE = $200;  // Limit image cache size.
  FPDF_RENDER_FORCEHALFTONE     = $400;  // Always use halftone for image stretching.
  FPDF_PRINTING                 = $800;  // Render for printing.
  FPDF_RENDER_NO_SMOOTHTEXT     = $1000; // Set to disable anti-aliasing on text. This flag will also disable LCD optimization for text rendering.
  FPDF_RENDER_NO_SMOOTHIMAGE    = $2000; // Set to disable anti-aliasing on images.
  FPDF_RENDER_NO_SMOOTHPATH     = $4000; // Set to disable anti-aliasing on paths.
  // Set whether to render in a reverse Byte order, this flag is only used when
  // rendering to a bitmap.
  FPDF_REVERSE_BYTE_ORDER       = $10;
  // Set whether fill paths need to be stroked. This flag is only used when
  // FPDF_COLORSCHEME is passed in, since with a single fill color for paths the
  // boundaries of adjacent fill paths are less visible.
  FPDF_CONVERT_FILL_TO_STROKE   = $20;

type
  // Struct for color scheme.
  // Each should be a 32-bit value specifying the color, in 8888 ARGB format.

  PFPDF_COLORSCHEME = ^FPDF_COLORSCHEME;
  FPDF_COLORSCHEME = record
    path_fill_color: FPDF_DWORD;
    path_stroke_color: FPDF_DWORD;
    text_fill_color: FPDF_DWORD;
    text_stroke_color: FPDF_DWORD;
  end;
  PFPdfColorScheme = ^TFPdfColorScheme;
  TFPdfColorScheme = FPDF_COLORSCHEME;

{$IFDEF MSWINDOWS}
// Function: FPDF_RenderPage
//          Render contents of a page to a device (screen, bitmap, or printer).
//          This function is only supported on Windows.
// Parameters:
//          dc          -   Handle to the device context.
//          page        -   Handle to the page. Returned by FPDF_LoadPage.
//          start_x     -   Left pixel position of the display area in
//                          device coordinates.
//          start_y     -   Top pixel position of the display area in device
//                          coordinates.
//          size_x      -   Horizontal size (in pixels) for displaying the page.
//          size_y      -   Vertical size (in pixels) for displaying the page.
//          rotate      -   Page orientation:
//                            0 (normal)
//                            1 (rotated 90 degrees clockwise)
//                            2 (rotated 180 degrees)
//                            3 (rotated 90 degrees counter-clockwise)
//          flags       -   0 for normal display, or combination of flags
//                          defined above.
// Return value:
//          None.
var
  FPDF_RenderPage: procedure(DC: HDC; page: FPDF_PAGE; start_x, start_y, size_x, size_y: Integer;
    rotate: Integer; flags: Integer); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};
{$ENDIF MSWINDOWS}

// Function: FPDF_RenderPageBitmap
//          Render contents of a page to a device independent bitmap.
// Parameters:
//          bitmap      -   Handle to the device independent bitmap (as the
//                          output buffer). The bitmap handle can be created
//                          by FPDFBitmap_Create or retrieved from an image
//                          object by FPDFImageObj_GetBitmap.
//          page        -   Handle to the page. Returned by FPDF_LoadPage
//          start_x     -   Left pixel position of the display area in
//                          bitmap coordinates.
//          start_y     -   Top pixel position of the display area in bitmap
//                          coordinates.
//          size_x      -   Horizontal size (in pixels) for displaying the page.
//          size_y      -   Vertical size (in pixels) for displaying the page.
//          rotate      -   Page orientation:
//                            0 (normal)
//                            1 (rotated 90 degrees clockwise)
//                            2 (rotated 180 degrees)
//                            3 (rotated 90 degrees counter-clockwise)
//          flags       -   0 for normal display, or combination of the Page
//                          Rendering flags defined above. With the FPDF_ANNOT
//                          flag, it renders all annotations that do not require
//                          user-interaction, which are all annotations except
//                          widget and popup annotations.
// Return value:
//          None.
var
  FPDF_RenderPageBitmap: procedure(bitmap: FPDF_BITMAP; page: FPDF_PAGE; start_x, start_y, size_x, size_y: Integer;
    rotate: Integer; flags: Integer); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_RenderPageBitmapWithMatrix
//          Render contents of a page to a device independent bitmap.
// Parameters:
//          bitmap      -   Handle to the device independent bitmap (as the
//                          output buffer). The bitmap handle can be created
//                          by FPDFBitmap_Create or retrieved by
//                          FPDFImageObj_GetBitmap.
//          page        -   Handle to the page. Returned by FPDF_LoadPage.
//          matrix      -   The transform matrix, which must be invertible.
//                          See PDF Reference 1.7, 4.2.2 Common Transformations.
//          clipping    -   The rect to clip to in device coords.
//          flags       -   0 for normal display, or combination of the Page
//                          Rendering flags defined above. With the FPDF_ANNOT
//                          flag, it renders all annotations that do not require
//                          user-interaction, which are all annotations except
//                          widget and popup annotations.
// Return value:
//          None. Note that behavior is undefined if det of |matrix| is 0.
var
  FPDF_RenderPageBitmapWithMatrix: procedure(bitmap: FPDF_BITMAP; page: FPDF_PAGE; matrix: PFS_MATRIX;
    clipping: PFS_RECTF; flags: Integer); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

{$IFDEF PDF_USE_SKIA}
// Function: FPDF_RenderPageSkia
//          Render contents of a page to a Skia SkCanvas.
// Parameters:
//          canvas      -   SkCanvas to render to.
//          page        -   Handle to the page.
//          size_x      -   Horizontal size (in pixels) for displaying the page.
//          size_y      -   Vertical size (in pixels) for displaying the page.
// Return value:
//          None.
var
  FPDF_RenderPageSkia: procedure(canvas: FPDF_SKIA_CANVAS; page: FPDF_PAGE; size_x, size_y: Integer); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};
{$ENDIF PDF_USE_SKIA}

// Function: FPDF_ClosePage
//          Close a loaded PDF page.
// Parameters:
//          page        -   Handle to the loaded page.
// Return value:
//          None.
var
  FPDF_ClosePage: procedure(page: FPDF_PAGE); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_CloseDocument
//          Close a loaded PDF document.
// Parameters:
//          document    -   Handle to the loaded document.
// Return value:
//          None.
var
  FPDF_CloseDocument: procedure(document: FPDF_DOCUMENT); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_DeviceToPage
//          Convert the screen coordinates of a point to page coordinates.
// Parameters:
//          page        -   Handle to the page. Returned by FPDF_LoadPage.
//          start_x     -   Left pixel position of the display area in
//                          device coordinates.
//          start_y     -   Top pixel position of the display area in device
//                          coordinates.
//          size_x      -   Horizontal size (in pixels) for displaying the page.
//          size_y      -   Vertical size (in pixels) for displaying the page.
//          rotate      -   Page orientation:
//                            0 (normal)
//                            1 (rotated 90 degrees clockwise)
//                            2 (rotated 180 degrees)
//                            3 (rotated 90 degrees counter-clockwise)
//          device_x    -   X value in device coordinates to be converted.
//          device_y    -   Y value in device coordinates to be converted.
//          page_x      -   A pointer to a double receiving the converted X
//                          value in page coordinates.
//          page_y      -   A pointer to a double receiving the converted Y
//                          value in page coordinates.
// Return value:
//          Returns true if the conversion succeeds, and |page_x| and |page_y|
//          successfully receives the converted coordinates.
// Comments:
//          The page coordinate system has its origin at the left-bottom corner
//          of the page, with the X-axis on the bottom going to the right, and
//          the Y-axis on the left side going up.
//
//          NOTE: this coordinate system can be altered when you zoom, scroll,
//          or rotate a page, however, a point on the page should always have
//          the same coordinate values in the page coordinate system.
//
//          The device coordinate system is device dependent. For screen device,
//          its origin is at the left-top corner of the window. However this
//          origin can be altered by the Windows coordinate transformation
//          utilities.
//
//          You must make sure the start_x, start_y, size_x, size_y
//          and rotate parameters have exactly same values as you used in
//          the FPDF_RenderPage() function call.
var
  FPDF_DeviceToPage: procedure(page: FPDF_PAGE; start_x, start_y, size_x, size_y: Integer;
    rotate: Integer; device_x, device_y: Integer; var page_x, page_y: Double); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_PageToDevice
//          Convert the page coordinates of a point to screen coordinates.
// Parameters:
//          page        -   Handle to the page. Returned by FPDF_LoadPage.
//          start_x     -   Left pixel position of the display area in
//                          device coordinates.
//          start_y     -   Top pixel position of the display area in device
//                          coordinates.
//          size_x      -   Horizontal size (in pixels) for displaying the page.
//          size_y      -   Vertical size (in pixels) for displaying the page.
//          rotate      -   Page orientation:
//                            0 (normal)
//                            1 (rotated 90 degrees clockwise)
//                            2 (rotated 180 degrees)
//                            3 (rotated 90 degrees counter-clockwise)
//          page_x      -   X value in page coordinates.
//          page_y      -   Y value in page coordinate.
//          device_x    -   A pointer to an integer receiving the result X
//                          value in device coordinates.
//          device_y    -   A pointer to an integer receiving the result Y
//                          value in device coordinates.
// Return value:
//          Returns true if the conversion succeeds, and |device_x| and
//          |device_y| successfully receives the converted coordinates.
// Comments:
//          See comments for FPDF_DeviceToPage().
var
  FPDF_PageToDevice: procedure(page: FPDF_PAGE; start_x, start_y, size_x, size_y: Integer;
    rotate: Integer; page_x, page_y: Double; var device_x, device_y: Integer); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDFBitmap_Create
//          Create a device independent bitmap (FXDIB).
// Parameters:
//          width       -   The number of pixels in width for the bitmap.
//                          Must be greater than 0.
//          height      -   The number of pixels in height for the bitmap.
//                          Must be greater than 0.
//          alpha       -   A flag indicating whether the alpha channel is used.
//                          Non-zero for using alpha, zero for not using.
// Return value:
//          The created bitmap handle, or NULL if a parameter error or out of
//          memory.
// Comments:
//          The bitmap always uses 4 bytes per pixel. The first byte is always
//          double word aligned.
//
//          The byte order is BGRx (the last byte unused if no alpha channel) or
//          BGRA.
//
//          The pixels in a horizontal line are stored side by side, with the
//          left most pixel stored first (with lower memory address).
//          Each line uses width * 4 bytes.
//
//          Lines are stored one after another, with the top most line stored
//          first. There is no gap between adjacent lines.
//
//          This function allocates enough memory for holding all pixels in the
//          bitmap, but it doesn't initialize the buffer. Applications can use
//          FPDFBitmap_FillRect() to fill the bitmap using any color. If the OS
//          allows it, this function can allocate up to 4 GB of memory.
  FPDFBitmap_Create: function(width, height: Integer; alpha: Integer): FPDF_BITMAP; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};


const
  // More DIB formats
  FPDFBitmap_Unknown = 0; // Unknown or unsupported format.
  FPDFBitmap_Gray    = 1; // Gray scale bitmap, one byte per pixel.
  FPDFBitmap_BGR     = 2; // 3 bytes per pixel, byte order: blue, green, red.
  FPDFBitmap_BGRx    = 3; // 4 bytes per pixel, byte order: blue, green, red, unused.
  FPDFBitmap_BGRA    = 4; // 4 bytes per pixel, byte order: blue, green, red, alpha.

// Function: FPDFBitmap_CreateEx
//          Create a device independent bitmap (FXDIB)
// Parameters:
//          width       -   The number of pixels in width for the bitmap.
//                          Must be greater than 0.
//          height      -   The number of pixels in height for the bitmap.
//                          Must be greater than 0.
//          format      -   A number indicating for bitmap format, as defined
//                          above.
//          first_scan  -   A pointer to the first byte of the first line if
//                          using an external buffer. If this parameter is NULL,
//                          then the a new buffer will be created.
//                          then a new buffer will be created.
//          stride      -   Number of bytes for each scan line. The value must
//                          be 0 or greater. When the value is 0,
//                          FPDFBitmap_CreateEx() will automatically calculate
//                          the appropriate value using |width| and |format|.
//                          When using an external buffer, it is recommended for
//                          the caller to pass in the value.
//                          When not using an external buffer, it is recommended
//                          for the caller to pass in 0.
// Return value:
//          The bitmap handle, or NULL if parameter error or out of memory.
// Comments:
//          Similar to FPDFBitmap_Create function, but allows for more formats
//          and an external buffer is supported. The bitmap created by this
//          function can be used in any place that a FPDF_BITMAP handle is
//          required.
//
//          If an external buffer is used, then the caller should destroy the
//          buffer. FPDFBitmap_Destroy() will not destroy the buffer.
//
//          It is recommended to use FPDFBitmap_GetStride() to get the stride
//          value.
var
  FPDFBitmap_CreateEx: function(width, height: Integer; format: Integer; first_scan: Pointer;
    stride: Integer): FPDF_BITMAP; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDFBitmap_GetFormat
//          Get the format of the bitmap.
// Parameters:
//          bitmap      -   Handle to the bitmap. Returned by FPDFBitmap_Create
//                          or FPDFImageObj_GetBitmap.
// Return value:
//          The format of the bitmap.
// Comments:
//          Only formats supported by FPDFBitmap_CreateEx are supported by this
//          function; see the list of such formats above.
var
  FPDFBitmap_GetFormat: function(bitmap: FPDF_BITMAP): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDFBitmap_FillRect
//          Fill a rectangle in a bitmap.
// Parameters:
//          bitmap      -   The handle to the bitmap. Returned by
//                          FPDFBitmap_Create.
//          left        -   The left position. Starting from 0 at the
//                          left-most pixel.
//          top         -   The top position. Starting from 0 at the
//                          top-most line.
//          width       -   Width in pixels to be filled.
//          height      -   Height in pixels to be filled.
//          color       -   A 32-bit value specifing the color, in 8888 ARGB
//                          format.
// Return value:
//          None.
// Comments:
//          This function sets the color and (optionally) alpha value in the
//          specified region of the bitmap.
//
//          NOTE: If the alpha channel is used, this function does NOT
//          composite the background with the source color, instead the
//          background will be replaced by the source color and the alpha.
//
//          If the alpha channel is not used, the alpha parameter is ignored.
var
  FPDFBitmap_FillRect: procedure(bitmap: FPDF_BITMAP; left, top, width, height: Integer; color: FPDF_DWORD); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDFBitmap_GetBuffer
//          Get data buffer of a bitmap.
// Parameters:
//          bitmap      -   Handle to the bitmap. Returned by FPDFBitmap_Create
//                          or FPDFImageObj_GetBitmap.
// Return value:
//          The pointer to the first byte of the bitmap buffer.
// Comments:
//          The stride may be more than width * number of bytes per pixel
//
//          Applications can use this function to get the bitmap buffer pointer,
//          then manipulate any color and/or alpha values for any pixels in the
//          bitmap.
//
//          Use FPDFBitmap_GetFormat() to find out the format of the data.
var
  FPDFBitmap_GetBuffer: function(bitmap: FPDF_BITMAP): Pointer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDFBitmap_GetWidth
//          Get width of a bitmap.
// Parameters:
//          bitmap      -   Handle to the bitmap. Returned by FPDFBitmap_Create
//                          or FPDFImageObj_GetBitmap.
// Return value:
//          The width of the bitmap in pixels.
var
  FPDFBitmap_GetWidth: function(bitmap: FPDF_BITMAP): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDFBitmap_GetHeight
//          Get height of a bitmap.
// Parameters:
//          bitmap      -   Handle to the bitmap. Returned by FPDFBitmap_Create
//                          or FPDFImageObj_GetBitmap.
// Return value:
//          The height of the bitmap in pixels.
var
  FPDFBitmap_GetHeight: function(bitmap: FPDF_BITMAP): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDFBitmap_GetStride
//          Get number of bytes for each line in the bitmap buffer.
// Parameters:
//          bitmap      -   Handle to the bitmap. Returned by FPDFBitmap_Create
//                          or FPDFImageObj_GetBitmap.
// Return value:
//          The number of bytes for each line in the bitmap buffer.
// Comments:
//          The stride may be more than width * number of bytes per pixel.
var
  FPDFBitmap_GetStride: function(bitmap: FPDF_BITMAP): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDFBitmap_Destroy
//          Destroy a bitmap and release all related buffers.
// Parameters:
//          bitmap      -   Handle to the bitmap. Returned by FPDFBitmap_Create
//                          or FPDFImageObj_GetBitmap.
// Return value:
//          None.
// Comments:
//          This function will not destroy any external buffers provided when
//          the bitmap was created.
var
  FPDFBitmap_Destroy: procedure(bitmap: FPDF_BITMAP); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_VIEWERREF_GetPrintScaling
//          Whether the PDF document prefers to be scaled or not.
// Parameters:
//          document    -   Handle to the loaded document.
// Return value:
//          None.
var
  FPDF_VIEWERREF_GetPrintScaling: function(document: FPDF_DOCUMENT): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_VIEWERREF_GetNumCopies
//          Returns the number of copies to be printed.
// Parameters:
//          document    -   Handle to the loaded document.
// Return value:
//          The number of copies to be printed.
var
  FPDF_VIEWERREF_GetNumCopies: function(document: FPDF_DOCUMENT): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_VIEWERREF_GetPrintPageRange
//          Page numbers to initialize print dialog box when file is printed.
// Parameters:
//          document    -   Handle to the loaded document.
// Return value:
//          The print page range to be used for printing.
var
  FPDF_VIEWERREF_GetPrintPageRange: function(document: FPDF_DOCUMENT): FPDF_PAGERANGE; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDF_VIEWERREF_GetPrintPageRangeCount
//          Returns the number of elements in a FPDF_PAGERANGE.
// Parameters:
//          pagerange   -   Handle to the page range.
// Return value:
//          The number of elements in the page range. Returns 0 on error.
var
  FPDF_VIEWERREF_GetPrintPageRangeCount: function(pagerange: FPDF_PAGERANGE): SIZE_T; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDF_VIEWERREF_GetPrintPageRangeElement
//          Returns an element from a FPDF_PAGERANGE.
// Parameters:
//          pagerange   -   Handle to the page range.
//          index       -   Index of the element.
// Return value:
//          The value of the element in the page range at a given index.
//          Returns -1 on error.
var
  FPDF_VIEWERREF_GetPrintPageRangeElement: function(pagerange: FPDF_PAGERANGE; index: SIZE_T): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_VIEWERREF_GetDuplex
//          Returns the paper handling option to be used when printing from
//          the print dialog.
// Parameters:
//          document    -   Handle to the loaded document.
// Return value:
//          The paper handling option to be used when printing.
var
  FPDF_VIEWERREF_GetDuplex: function(document: FPDF_DOCUMENT): FPDF_DUPLEXTYPE; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_VIEWERREF_GetName
//          Gets the contents for a viewer ref, with a given key. The value must
//          be of type "name".
// Parameters:
//          document    -   Handle to the loaded document.
//          key         -   Name of the key in the viewer pref dictionary,
//                          encoded in UTF-8.
//          buffer      -   Caller-allocate buffer to receive the key, or NULL
//                      -   to query the required length.
//          length      -   Length of the buffer.
// Return value:
//          The number of bytes in the contents, including the NULL terminator.
//          Thus if the return value is 0, then that indicates an error, such
//          as when |document| is invalid or |buffer| is NULL. If |length| is
//          as when |document| is invalid. If |length| is less than the required
//          length, or |buffer| is NULL, |buffer| will not be modified.
var
  FPDF_VIEWERREF_GetName: function(document: FPDF_DOCUMENT; key: FPDF_BYTESTRING; buffer: PAnsiChar;
    length: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_CountNamedDests
//          Get the count of named destinations in the PDF document.
// Parameters:
//          document    -   Handle to a document
// Return value:
//          The count of named destinations.
var
  FPDF_CountNamedDests: function(document: FPDF_DOCUMENT): FPDF_DWORD; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_GetNamedDestByName
//          Get a the destination handle for the given name.
// Parameters:
//          document    -   Handle to the loaded document.
//          name        -   The name of a destination.
// Return value:
//          The handle to the destination.
var
  FPDF_GetNamedDestByName: function(document: FPDF_DOCUMENT; name: FPDF_BYTESTRING): FPDF_DEST; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_GetNamedDest
//          Get the named destination by index.
// Parameters:
//          document        -   Handle to a document
//          index           -   The index of a named destination.
//          buffer          -   The buffer to store the destination name,
//                              used as wchar_t*.
//          buflen [in/out] -   Size of the buffer in bytes on input,
//                              length of the result in bytes on output
//                              or -1 if the buffer is too small.
// Return value:
//          The destination handle for a given index, or NULL if there is no
//          named destination corresponding to |index|.
// Comments:
//          Call this function twice to get the name of the named destination:
//            1) First time pass in |buffer| as NULL and get buflen.
//            2) Second time pass in allocated |buffer| and buflen to retrieve
//               |buffer|, which should be used as wchar_t*.
//
//         If buflen is not sufficiently large, it will be set to -1 upon
//         return.
var
  FPDF_GetNamedDest: function(document: FPDF_DOCUMENT; index: Integer; buffer: Pointer; var buflen: LongWord): FPDF_DEST; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDF_GetXFAPacketCount
//          Get the number of valid packets in the XFA entry.
// Parameters:
//          document - Handle to the document.
// Return value:
//          The number of valid packets, or -1 on error.
var
  FPDF_GetXFAPacketCount: function(document: FPDF_DOCUMENT): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDF_GetXFAPacketName
//          Get the name of a packet in the XFA array.
// Parameters:
//          document - Handle to the document.
//          index    - Index number of the packet. 0 for the first packet.
//          buffer   - Buffer for holding the name of the XFA packet.
//          buflen   - Length of |buffer| in bytes.
// Return value:
//          The length of the packet name in bytes, or 0 on error.
//
// |document| must be valid and |index| must be in the range [0, N), where N is
// the value returned by FPDF_GetXFAPacketCount().
// |buffer| is only modified if it is non-NULL and |buflen| is greater than or
// equal to the length of the packet name. The packet name includes a
// terminating NUL character. |buffer| is unmodified on error.
var
  FPDF_GetXFAPacketName: function(document: FPDF_DOCUMENT; index: Integer; buffer: Pointer; buflen: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDF_GetXFAPacketContent
//          Get the content of a packet in the XFA array.
// Parameters:
//          document   - Handle to the document.
//          index      - Index number of the packet. 0 for the first packet.
//          buffer     - Buffer for holding the content of the XFA packet.
//          buflen     - Length of |buffer| in bytes.
//          out_buflen - Pointer to the variable that will receive the minimum
//                       buffer size needed to contain the content of the XFA
//                       packet.
// Return value:
//          Whether the operation succeeded or not.
//
// |document| must be valid and |index| must be in the range [0, N), where N is
// the value returned by FPDF_GetXFAPacketCount(). |out_buflen| must not be
// NULL. When the aforementioned arguments are valid, the operation succeeds,
// and |out_buflen| receives the content size. |buffer| is only modified if
// |buffer| is non-null and long enough to contain the content. Callers must
// check both the return value and the input |buflen| is no less than the
// returned |out_buflen| before using the data in |buffer|.
var
  FPDF_GetXFAPacketContent: function(document: FPDF_DOCUMENT; index: Integer; buffer: Pointer;
    buflen: LongWord; var out_buflen: LongWord): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

{$IFDEF PDF_ENABLE_V8}
// Function: FPDF_GetRecommendedV8Flags
//          Returns a space-separated string of command line flags that are
//          recommended to be passed into V8 via V8::SetFlagsFromString()
//          prior to initializing the PDFium library.
// Parameters:
//          None.
// Return value:
//          NUL-terminated string of the form "--flag1 --flag2".
//          The caller must not attempt to modify or free the result.
var
  FPDF_GetRecommendedV8Flags: function: PAnsiChar; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDF_GetArrayBufferAllocatorSharedInstance()
//          Helper function for initializing V8 isolates that will
//          use PDFium's internal memory management.
// Parameters:
//          None.
// Return Value:
//          Pointer to a suitable v8::ArrayBuffer::Allocator, returned
//          as void for C compatibility.
// Notes:
//          Use is optional, but allows external creation of isolates
//          matching the ones PDFium will make when none is provided
//          via |FPDF_LIBRARY_CONFIG::m_pIsolate|.
//
//          Can only be called when the library is in an uninitialized or
//          destroyed state.
var
  FPDF_GetArrayBufferAllocatorSharedInstance: function: Pointer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};
{$ENDIF PDF_ENABLE_V8}

{$IFDEF PDF_ENABLE_XFA}
// Function: FPDF_BStr_Init
//          Helper function to initialize a FPDF_BSTR.
var
  FPDF_BStr_Init: function(bstr: PFPDF_BSTR): FPDF_RESULT; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_BStr_Set
//          Helper function to copy string data into the FPDF_BSTR.
var
  FPDF_BStr_Set: function(vstr: PFPDF_BSTR; const cstr: PAnsiChar; length: Integer): FPDF_RESULT; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_BStr_Clear
//          Helper function to clear a FPDF_BSTR.
var
  FPDF_BStr_Clear: function(bstr: PFPDF_BSTR): FPDF_RESULT; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};
{$ENDIF PDF_ENABLE_XFA}


// *** _FPDFEDIT_H_ ***

function FPDF_ARGB(a, r, g, b: Byte): DWORD; inline;
function FPDF_GetBValue(argb: DWORD): Byte; inline;
function FPDF_GetGValue(argb: DWORD): Byte; inline;
function FPDF_GetRValue(argb: DWORD): Byte; inline;
function FPDF_GetAValue(argb: DWORD): Byte; inline;


const
  // Refer to PDF Reference version 1.7 table 4.12 for all color space families.
  FPDF_COLORSPACE_UNKNOWN = 0;
  FPDF_COLORSPACE_DEVICEGRAY = 1;
  FPDF_COLORSPACE_DEVICERGB = 2;
  FPDF_COLORSPACE_DEVICECMYK = 3;
  FPDF_COLORSPACE_CALGRAY = 4;
  FPDF_COLORSPACE_CALRGB = 5;
  FPDF_COLORSPACE_LAB = 6;
  FPDF_COLORSPACE_ICCBASED = 7;
  FPDF_COLORSPACE_SEPARATION = 8;
  FPDF_COLORSPACE_DEVICEN = 9;
  FPDF_COLORSPACE_INDEXED = 10;
  FPDF_COLORSPACE_PATTERN = 11;

  // The page object constants.
  FPDF_PAGEOBJ_UNKNOWN = 0;
  FPDF_PAGEOBJ_TEXT = 1;
  FPDF_PAGEOBJ_PATH = 2;
  FPDF_PAGEOBJ_IMAGE = 3;
  FPDF_PAGEOBJ_SHADING = 4;
  FPDF_PAGEOBJ_FORM = 5;

  // The path segment constants.
  FPDF_SEGMENT_UNKNOWN = -1;
  FPDF_SEGMENT_LINETO = 0;
  FPDF_SEGMENT_BEZIERTO = 1;
  FPDF_SEGMENT_MOVETO = 2;

  FPDF_FILLMODE_NONE = 0;
  FPDF_FILLMODE_ALTERNATE = 1;
  FPDF_FILLMODE_WINDING = 2;

  FPDF_FONT_TYPE1 = 1;
  FPDF_FONT_TRUETYPE = 2;

  FPDF_LINECAP_BUTT = 0;
  FPDF_LINECAP_ROUND = 1;
  FPDF_LINECAP_PROJECTING_SQUARE = 2;

  FPDF_LINEJOIN_MITER = 0;
  FPDF_LINEJOIN_ROUND = 1;
  FPDF_LINEJOIN_BEVEL = 2;

  // See FPDF_SetPrintMode() for descriptions.
  FPDF_PRINTMODE_EMF = 0;
  FPDF_PRINTMODE_TEXTONLY = 1;
  FPDF_PRINTMODE_POSTSCRIPT2 = 2;
  FPDF_PRINTMODE_POSTSCRIPT3 = 3;
  FPDF_PRINTMODE_POSTSCRIPT2_PASSTHROUGH = 4;
  FPDF_PRINTMODE_POSTSCRIPT3_PASSTHROUGH = 5;
  FPDF_PRINTMODE_EMF_IMAGE_MASKS = 6;
  FPDF_PRINTMODE_POSTSCRIPT3_TYPE42 = 7;
  FPDF_PRINTMODE_POSTSCRIPT3_TYPE42_PASSTHROUGH= 8;

type
  PFPDF_IMAGEOBJ_METADATA = ^FPDF_IMAGEOBJ_METADATA;
  FPDF_IMAGEOBJ_METADATA = record
    // The image width in pixels.
    width: Cardinal;
    // The image height in pixels.
    height: Cardinal;
    // The image's horizontal pixel-per-inch.
    horizontal_dpi: Single;
    // The image's vertical pixel-per-inch.
    vertical_dpi: Single;
    // The number of bits used to represent each pixel.
    bits_per_pixel: Cardinal;
    // The image's colorspace. See above for the list of FPDF_COLORSPACE_*.
    colorspace: Integer;
    // The image's marked content ID. Useful for pairing with associated alt-text.
    // A value of -1 indicates no ID.
    marked_content_id: Integer;
  end;
  PFPdfImageObjMetaData = ^TFPdfImageObjMetaData;
  TFPdfImageObjMetaData = FPDF_IMAGEOBJ_METADATA;

// Create a new PDF document.
//
// Returns a handle to a new document, or NULL on failure.
var
  FPDF_CreateNewDocument: function: FPDF_DOCUMENT; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Create a new PDF page.
//
//   document   - handle to document.
//   page_index - suggested 0-based index of the page to create. If it is larger
//                than document's current last index(L), the created page index
//                is the next available index -- L+1.
//   width      - the page width in points.
//   height     - the page height in points.
//
// Returns the handle to the new page or NULL on failure.
//
// The page should be closed with FPDF_ClosePage() when finished as
// with any other page in the document.
var
  FPDFPage_New: function(document: FPDF_DOCUMENT; page_index: Integer; width, height: Double): FPDF_PAGE; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Delete the page at |page_index|.
//
//   document   - handle to document.
//   page_index - the index of the page to delete.
var
  FPDFPage_Delete: procedure(document: FPDF_DOCUMENT; page_index: Integer); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Move the given pages to a new index position.
//
//  page_indices     - the ordered list of pages to move. No duplicates allowed.
//  page_indices_len - the number of elements in |page_indices|
//  dest_page_index  - the new index position to which the pages in
//                     |page_indices| are moved.
//
// Returns TRUE on success. If it returns FALSE, the document may be left in an
// indeterminate state.
//
// Example: The PDF document starts out with pages [A, B, C, D], with indices
// [0, 1, 2, 3].
//
// >  Move(doc, [3, 2], 2, 1); // returns true
// >  // The document has pages [A, D, C, B].
// >
// >  Move(doc, [0, 4, 3], 3, 1); // returns false
// >  // Returned false because index 4 is out of range.
// >
// >  Move(doc, [0, 3, 1], 3, 2); // returns false
// >  // Returned false because index 2 is out of range for 3 page indices.
// >
// >  Move(doc, [2, 2], 2, 0); // returns false
// >  // Returned false because [2, 2] contains duplicates.
//
var
  FPDF_MovePages: function(document: FPDF_DOCUMENT; page_indices: PInteger; page_indices_len: LongWord;
    dest_page_index: Integer): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get the rotation of |page|.
//
//   page - handle to a page
//
// Returns one of the following indicating the page rotation:
//   0 - No rotation.
//   1 - Rotated 90 degrees clockwise.
//   2 - Rotated 180 degrees clockwise.
//   3 - Rotated 270 degrees clockwise.
var
  FPDFPage_GetRotation: function(page: FPDF_PAGE): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Set rotation for |page|.
//
//   page   - handle to a page.
//   rotate - the rotation value, one of:
//              0 - No rotation.
//              1 - Rotated 90 degrees clockwise.
//              2 - Rotated 180 degrees clockwise.
//              3 - Rotated 270 degrees clockwise.
var
  FPDFPage_SetRotation: procedure(page: FPDF_PAGE; rotate: Integer); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Insert |page_object| into |page|.
//
//   page        - handle to a page
//   page_object - handle to a page object. The |page_object| will be
//                 automatically freed.
var
  FPDFPage_InsertObject: procedure(page: FPDF_PAGE; page_object: FPDF_PAGEOBJECT); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Remove |page_object| from |page|.
//
//   page        - handle to a page
//   page_object - handle to a page object to be removed.
//
// Returns TRUE on success.
//
// Ownership is transferred to the caller. Call FPDFPageObj_Destroy() to free
// it.
// Note that when removing a |page_object| of type FPDF_PAGEOBJ_TEXT, all
// FPDF_TEXTPAGE handles for |page| are no longer valid.
var
  FPDFPage_RemoveObject: function(page: FPDF_PAGE; page_object: FPDF_PAGEOBJECT): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get number of page objects inside |page|.
//
//   page - handle to a page.
//
// Returns the number of objects in |page|.
var
  FPDFPage_CountObjects: function(page: FPDF_PAGE): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get object in |page| at |index|.
//
//   page  - handle to a page.
//   index - the index of a page object.
//
// Returns the handle to the page object, or NULL on failed.
var
  FPDFPage_GetObject: function(page: FPDF_PAGE; index: Integer): FPDF_PAGEOBJECT; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Checks if |page| contains transparency.
//
//   page - handle to a page.
//
// Returns TRUE if |page| contains transparency.
var
  FPDFPage_HasTransparency: function(page: FPDF_PAGE): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Generate the content of |page|.
//
//   page - handle to a page.
//
// Returns TRUE on success.
//
// Before you save the page to a file, or reload the page, you must call
// |FPDFPage_GenerateContent| or any changes to |page| will be lost.
var
  FPDFPage_GenerateContent: function(page: FPDF_PAGE): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Destroy |page_object| by releasing its resources. |page_object| must have
// been created by FPDFPageObj_CreateNew{Path|Rect}() or
// FPDFPageObj_New{Text|Image}Obj(). This function must be called on
// newly-created objects if they are not added to a page through
// FPDFPage_InsertObject() or to an annotation through FPDFAnnot_AppendObject().
//
//   page_object - handle to a page object.
var
  FPDFPageObj_Destroy: procedure(page_obj: FPDF_PAGEOBJECT); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Checks if |page_object| contains transparency.
//
//   page_object - handle to a page object.
//
// Returns TRUE if |page_object| contains transparency.
var
  FPDFPageObj_HasTransparency: function(page_object: FPDF_PAGEOBJECT): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get type of |page_object|.
//
//   page_object - handle to a page object.
//
// Returns one of the FPDF_PAGEOBJ_* values on success, FPDF_PAGEOBJ_UNKNOWN on
// error.
var
  FPDFPageObj_GetType: function(page_object: FPDF_PAGEOBJECT): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Transform |page_object| by the given matrix.
//
//   page_object - handle to a page object.
//   a           - matrix value.
//   b           - matrix value.
//   c           - matrix value.
//   d           - matrix value.
//   e           - matrix value.
//   f           - matrix value.
//
// The matrix is composed as:
//   |a c e|
//   |b d f|
// and can be used to scale, rotate, shear and translate the |page_object|.
var
  FPDFPageObj_Transform: procedure(page_object: FPDF_PAGEOBJECT; a, b, c, d, e, f: Double); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Transform |page_object| by the given matrix.
//
//   page_object - handle to a page object.
//   matrix      - the transform matrix.
//
// Returns TRUE on success.
//
// This can be used to scale, rotate, shear and translate the |page_object|.
// It is an improved version of FPDFPageObj_Transform() that does not do
// unnecessary double to float conversions, and only uses 1 parameter for the
// matrix. It also returns whether the operation succeeded or not.
var
  FPDFPageObj_TransformF: function(page_object: FPDF_PAGEOBJECT; matrix: PFS_MATRIX): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the transform matrix of a page object.
//
//   page_object - handle to a page object.
//   matrix      - pointer to struct to receive the matrix value.
//
// The matrix is composed as:
//   |a c e|
//   |b d f|
// and used to scale, rotate, shear and translate the page object.
//
// For page objects outside form objects, the matrix values are relative to the
// page that contains it.
// For page objects inside form objects, the matrix values are relative to the
// form that contains it.
//
// Returns TRUE on success.
var
  FPDFPageObj_GetMatrix: function(page_object: FPDF_PAGEOBJECT; matrix: PFS_MATRIX): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Set the transform matrix of a page object.
//
//   page_object - handle to a page object.
//   matrix      - pointer to struct with the matrix value.
//
// The matrix is composed as:
//   |a c e|
//   |b d f|
// and can be used to scale, rotate, shear and translate the page object.
//
// Returns TRUE on success.
var
  FPDFPageObj_SetMatrix: function(page_object: FPDF_PAGEOBJECT; const matrix: PFS_MATRIX): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Transform all annotations in |page|.
//
//   page - handle to a page.
//   a    - matrix value.
//   b    - matrix value.
//   c    - matrix value.
//   d    - matrix value.
//   e    - matrix value.
//   f    - matrix value.
//
// The matrix is composed as:
//   |a c e|
//   |b d f|
// and can be used to scale, rotate, shear and translate the |page| annotations.
var
  FPDFPage_TransformAnnots: procedure(page: FPDF_PAGE; a, b, c, d, e, f: Double); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Create a new image object.
//
//   document - handle to a document.
//
// Returns a handle to a new image object.
var
  FPDFPageObj_NewImageObj: function(document: FPDF_DOCUMENT): FPDF_PAGEOBJECT; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the marked content ID for the object.
//
//   page_object - handle to a page object.
//
// Returns the page object's marked content ID, or -1 on error.
var
  FPDFPageObj_GetMarkedContentID: function(page_object: FPDF_PAGEOBJECT): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get number of content marks in |page_object|.
//
//   page_object - handle to a page object.
//
// Returns the number of content marks in |page_object|, or -1 in case of
// failure.
var
  FPDFPageObj_CountMarks: function(page_object: FPDF_PAGEOBJECT): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get content mark in |page_object| at |index|.
//
//   page_object - handle to a page object.
//   index       - the index of a page object.
//
// Returns the handle to the content mark, or NULL on failure. The handle is
// still owned by the library, and it should not be freed directly. It becomes
// invalid if the page object is destroyed, either directly or indirectly by
// unloading the page.
var
  FPDFPageObj_GetMark: function(page_object: FPDF_PAGEOBJECT; index: LongWord): FPDF_PAGEOBJECTMARK; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Add a new content mark to a |page_object|.
//
//   page_object - handle to a page object.
//   name        - the name (tag) of the mark.
//
// Returns the handle to the content mark, or NULL on failure. The handle is
// still owned by the library, and it should not be freed directly. It becomes
// invalid if the page object is destroyed, either directly or indirectly by
// unloading the page.
var
  FPDFPageObj_AddMark: function(page_object: FPDF_PAGEOBJECT; name: FPDF_BYTESTRING): FPDF_PAGEOBJECTMARK; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Removes a content |mark| from a |page_object|.
// The mark handle will be invalid after the removal.
//
//   page_object - handle to a page object.
//   mark        - handle to a content mark in that object to remove.
//
// Returns TRUE if the operation succeeded, FALSE if it failed.
var
  FPDFPageObj_RemoveMark: function(page_object: FPDF_PAGEOBJECT; mark: FPDF_PAGEOBJECTMARK): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the name of a content mark.
//
//   mark       - handle to a content mark.
//   buffer     - buffer for holding the returned name in UTF-16LE. This is only
//                modified if |buflen| is longer than the length of the name.
//                Optional, pass null to just retrieve the size of the buffer
//                needed.
//   buflen     - length of the buffer.
//   out_buflen - pointer to variable that will receive the minimum buffer size
//                to contain the name. Not filled if FALSE is returned.
//
// Returns TRUE if the operation succeeded, FALSE if it failed.
var
  FPDFPageObjMark_GetName: function(mark: FPDF_PAGEOBJECTMARK; buffer: Pointer; buflen: LongWord;
    out_buflen: PLongWord): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the number of key/value pair parameters in |mark|.
//
//   mark   - handle to a content mark.
//
// Returns the number of key/value pair parameters |mark|, or -1 in case of
// failure.
var
  FPDFPageObjMark_CountParams: function(mark: FPDF_PAGEOBJECTMARK): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the key of a property in a content mark.
//
//   mark       - handle to a content mark.
//   index      - index of the property.
//   buffer     - buffer for holding the returned key in UTF-16LE. This is only
//                modified if |buflen| is longer than the length of the key.
//                Optional, pass null to just retrieve the size of the buffer
//                needed.
//   buflen     - length of the buffer.
//   out_buflen - pointer to variable that will receive the minimum buffer size
//                to contain the key. Not filled if FALSE is returned.
//
// Returns TRUE if the operation was successful, FALSE otherwise.
var
  FPDFPageObjMark_GetParamKey: function(mark: FPDF_PAGEOBJECTMARK; index: LongWord; buffer: Pointer; buflen: LongWord;
    out_buflen: PLongWord): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the type of the value of a property in a content mark by key.
//
//   mark   - handle to a content mark.
//   key    - string key of the property.
//
// Returns the type of the value, or FPDF_OBJECT_UNKNOWN in case of failure.
var
  FPDFPageObjMark_GetParamValueType: function(mark: FPDF_PAGEOBJECTMARK; key: FPDF_BYTESTRING): FPDF_OBJECT_TYPE; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};


// Experimental API.
// Get the value of a number property in a content mark by key as int.
// FPDFPageObjMark_GetParamValueType() should have returned FPDF_OBJECT_NUMBER
// for this property.
//
//   mark      - handle to a content mark.
//   key       - string key of the property.
//   out_value - pointer to variable that will receive the value. Not filled if
//               false is returned.
//
// Returns TRUE if the key maps to a number value, FALSE otherwise.
var
  FPDFPageObjMark_GetParamIntValue: function(mark: FPDF_PAGEOBJECTMARK; key: FPDF_BYTESTRING;
    out_value: PInteger): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the value of a string property in a content mark by key.
//
//   mark       - handle to a content mark.
//   key        - string key of the property.
//   buffer     - buffer for holding the returned value in UTF-16LE. This is
//                only modified if |buflen| is longer than the length of the
//                value.
//                Optional, pass null to just retrieve the size of the buffer
//                needed.
//   buflen     - length of the buffer.
//   out_buflen - pointer to variable that will receive the minimum buffer size
//                to contain the value. Not filled if FALSE is returned.
//
// Returns TRUE if the key maps to a string/blob value, FALSE otherwise.
var
  FPDFPageObjMark_GetParamStringValue: function(mark: FPDF_PAGEOBJECTMARK; key: FPDF_BYTESTRING; buffer: Pointer;
    buflen: LongWord; out_buflen: PLongWord): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the value of a blob property in a content mark by key.
//
//   mark       - handle to a content mark.
//   key        - string key of the property.
//   buffer     - buffer for holding the returned value. This is only modified
//                if |buflen| is at least as long as the length of the value.
//                Optional, pass null to just retrieve the size of the buffer
//                needed.
//   buflen     - length of the buffer.
//   out_buflen - pointer to variable that will receive the minimum buffer size
//                to contain the value. Not filled if FALSE is returned.
//
// Returns TRUE if the key maps to a string/blob value, FALSE otherwise.
var
  FPDFPageObjMark_GetParamBlobValue: function(mark: FPDF_PAGEOBJECTMARK; key: FPDF_BYTESTRING; buffer: Pointer;
    buflen: LongWord; out_buflen: PLongWord): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Set the value of an int property in a content mark by key. If a parameter
// with key |key| exists, its value is set to |value|. Otherwise, it is added as
// a new parameter.
//
//   document    - handle to the document.
//   page_object - handle to the page object with the mark.
//   mark        - handle to a content mark.
//   key         - string key of the property.
//   value       - int value to set.
//
// Returns TRUE if the operation succeeded, FALSE otherwise.
var
  FPDFPageObjMark_SetIntParam: function(document: FPDF_DOCUMENT; page_object: FPDF_PAGEOBJECT;
    mark: FPDF_PAGEOBJECTMARK; key: FPDF_BYTESTRING; value: Integer): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Set the value of a string property in a content mark by key. If a parameter
// with key |key| exists, its value is set to |value|. Otherwise, it is added as
// a new parameter.
//
//   document    - handle to the document.
//   page_object - handle to the page object with the mark.
//   mark        - handle to a content mark.
//   key         - string key of the property.
//   value       - string value to set.
//
// Returns TRUE if the operation succeeded, FALSE otherwise.
var
  FPDFPageObjMark_SetStringParam: function(document: FPDF_DOCUMENT; page_object: FPDF_PAGEOBJECT;
    mark: FPDF_PAGEOBJECTMARK; key: FPDF_BYTESTRING; value: FPDF_BYTESTRING): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Set the value of a blob property in a content mark by key. If a parameter
// with key |key| exists, its value is set to |value|. Otherwise, it is added as
// a new parameter.
//
//   document    - handle to the document.
//   page_object - handle to the page object with the mark.
//   mark        - handle to a content mark.
//   key         - string key of the property.
//   value       - pointer to blob value to set.
//   value_len   - size in bytes of |value|.
//
// Returns TRUE if the operation succeeded, FALSE otherwise.
var
  FPDFPageObjMark_SetBlobParam: function(document: FPDF_DOCUMENT; page_object: FPDF_PAGEOBJECT;
    mark: FPDF_PAGEOBJECTMARK; key: FPDF_BYTESTRING; value: Pointer; value_len: LongWord): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Removes a property from a content mark by key.
//
//   page_object - handle to the page object with the mark.
//   mark        - handle to a content mark.
//   key         - string key of the property.
//
// Returns TRUE if the operation succeeded, FALSE otherwise.
var
  FPDFPageObjMark_RemoveParam: function(page_object: FPDF_PAGEOBJECT; mark: FPDF_PAGEOBJECTMARK;
    key: FPDF_BYTESTRING): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Load an image from a JPEG image file and then set it into |image_object|.
//
//   pages        - pointer to the start of all loaded pages, may be NULL.
//   count        - number of |pages|, may be 0.
//   image_object - handle to an image object.
//   file_access  - file access handler which specifies the JPEG image file.
//
// Returns TRUE on success.
//
// The image object might already have an associated image, which is shared and
// cached by the loaded pages. In that case, we need to clear the cached image
// for all the loaded pages. Pass |pages| and page count (|count|) to this API
// to clear the image cache. If the image is not previously shared, or NULL is a
// valid |pages| value.
var
  FPDFImageObj_LoadJpegFile: function(pages: PFPDF_PAGE; nCount: Integer; image_object: FPDF_PAGEOBJECT;
    fileAccess: PFPDF_FILEACCESS): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Load an image from a JPEG image file and then set it into |image_object|.
//
//   pages        - pointer to the start of all loaded pages, may be NULL.
//   count        - number of |pages|, may be 0.
//   image_object - handle to an image object.
//   file_access  - file access handler which specifies the JPEG image file.
//
// Returns TRUE on success.
//
// The image object might already have an associated image, which is shared and
// cached by the loaded pages. In that case, we need to clear the cached image
// for all the loaded pages. Pass |pages| and page count (|count|) to this API
// to clear the image cache. If the image is not previously shared, or NULL is a
// valid |pages| value. This function loads the JPEG image inline, so the image
// content is copied to the file. This allows |file_access| and its associated
// data to be deleted after this function returns.
var
  FPDFImageObj_LoadJpegFileInline: function(pages: PFPDF_PAGE; count: Integer; image_object: FPDF_PAGEOBJECT;
    file_access: PFPDF_FILEACCESS): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// TODO(thestig): Start deprecating this once FPDFPageObj_SetMatrix() is stable.
// Set the transform matrix of |image_object|.
//
//   image_object - handle to an image object.
//   a            - matrix value.
//   b            - matrix value.
//   c            - matrix value.
//   d            - matrix value.
//   e            - matrix value.
//   f            - matrix value.
//
// The matrix is composed as:
//   |a c e|
//   |b d f|
// and can be used to scale, rotate, shear and translate the |image_object|.
//
// Returns TRUE on success.
var
  FPDFImageObj_SetMatrix: function(image_object: FPDF_PAGEOBJECT; a, b, c, d, e, f: Double): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Set |bitmap| to |image_object|.
//
//   pages        - pointer to the start of all loaded pages, may be NULL.
//   count        - number of |pages|, may be 0.
//   image_object - handle to an image object.
//   bitmap       - handle of the bitmap.
//
// Returns TRUE on success.
var
  FPDFImageObj_SetBitmap: function(pages: PFPDF_PAGE; nCount: Integer; image_object: FPDF_PAGEOBJECT;
    bitmap: FPDF_BITMAP): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get a bitmap rasterization of |image_object|. FPDFImageObj_GetBitmap() only
// operates on |image_object| and does not take the associated image mask into
// account. It also ignores the matrix for |image_object|.
// The returned bitmap will be owned by the caller, and FPDFBitmap_Destroy()
// must be called on the returned bitmap when it is no longer needed.
//
//   image_object - handle to an image object.
//
// Returns the bitmap.
var
  FPDFImageObj_GetBitmap: function(image_object: FPDF_PAGEOBJECT): FPDF_BITMAP; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get a bitmap rasterization of |image_object| that takes the image mask and
// image matrix into account. To render correctly, the caller must provide the
// |document| associated with |image_object|. If there is a |page| associated
// with |image_object|, the caller should provide that as well.
// The returned bitmap will be owned by the caller, and FPDFBitmap_Destroy()
// must be called on the returned bitmap when it is no longer needed.
//
//   document     - handle to a document associated with |image_object|.
//   page         - handle to an optional page associated with |image_object|.
//   image_object - handle to an image object.
//
// Returns the bitmap or NULL on failure.
var
  FPDFImageObj_GetRenderedBitmap: function(document: FPDF_DOCUMENT; page: FPDF_PAGE;
    image_object: FPDF_PAGEOBJECT): FPDF_BITMAP; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get the decoded image data of |image_object|. The decoded data is the
// uncompressed image data, i.e. the raw image data after having all filters
// applied. |buffer| is only modified if |buflen| is longer than the length of
// the decoded image data.
//
//   image_object - handle to an image object.
//   buffer       - buffer for holding the decoded image data.
//   buflen       - length of the buffer in bytes.
//
// Returns the length of the decoded image data.
var
  FPDFImageObj_GetImageDataDecoded: function(image_object: FPDF_PAGEOBJECT; buffer: Pointer;
    buflen: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get the raw image data of |image_object|. The raw data is the image data as
// stored in the PDF without applying any filters. |buffer| is only modified if
// |buflen| is longer than the length of the raw image data.
//
//   image_object - handle to an image object.
//   buffer       - buffer for holding the raw image data.
//   buflen       - length of the buffer in bytes.
//
// Returns the length of the raw image data.
var
  FPDFImageObj_GetImageDataRaw: function(image_object: FPDF_PAGEOBJECT; buffer: Pointer;
    buflen: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get the number of filters (i.e. decoders) of the image in |image_object|.
//
//   image_object - handle to an image object.
//
// Returns the number of |image_object|'s filters.
var
  FPDFImageObj_GetImageFilterCount: function(image_object: FPDF_PAGEOBJECT): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get the filter at |index| of |image_object|'s list of filters. Note that the
// filters need to be applied in order, i.e. the first filter should be applied
// first, then the second, etc. |buffer| is only modified if |buflen| is longer
// than the length of the filter string.
//
//   image_object - handle to an image object.
//   index        - the index of the filter requested.
//   buffer       - buffer for holding filter string, encoded in UTF-8.
//   buflen       - length of the buffer.
//
// Returns the length of the filter string.
var
  FPDFImageObj_GetImageFilter: function(image_object: FPDF_PAGEOBJECT; index: Integer; buffer: Pointer;
    buflen: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get the image metadata of |image_object|, including dimension, DPI, bits per
// pixel, and colorspace. If the |image_object| is not an image object or if it
// does not have an image, then the return value will be false. Otherwise,
// failure to retrieve any specific parameter would result in its value being 0.
//
//   image_object - handle to an image object.
//   page         - handle to the page that |image_object| is on. Required for
//                  retrieving the image's bits per pixel and colorspace.
//   metadata     - receives the image metadata; must not be NULL.
//
// Returns true if successful.
var
  FPDFImageObj_GetImageMetadata: function(image_object: FPDF_PAGEOBJECT; page: FPDF_PAGE;
    metadata: PFPDF_IMAGEOBJ_METADATA): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the image size in pixels. Faster method to get only image size.
//
//   image_object - handle to an image object.
//   width        - receives the image width in pixels; must not be NULL.
//   height       - receives the image height in pixels; must not be NULL.
//
// Returns true if successful.
var
  FPDFImageObj_GetImagePixelSize: function(image_object: FPDF_PAGEOBJECT; var width, height: UInt32): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Create a new path object at an initial position.
//
//   x - initial horizontal position.
//   y - initial vertical position.
//
// Returns a handle to a new path object.
var
  FPDFPageObj_CreateNewPath: function(x, y: Single): FPDF_PAGEOBJECT; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Create a closed path consisting of a rectangle.
//
//   x - horizontal position for the left boundary of the rectangle.
//   y - vertical position for the bottom boundary of the rectangle.
//   w - width of the rectangle.
//   h - height of the rectangle.
//
// Returns a handle to the new path object.
var
  FPDFPageObj_CreateNewRect: function(x, y, w, h: Single): FPDF_PAGEOBJECT; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get the bounding box of |page_object|.
//
// page_object  - handle to a page object.
// left         - pointer where the left coordinate will be stored
// bottom       - pointer where the bottom coordinate will be stored
// right        - pointer where the right coordinate will be stored
// top          - pointer where the top coordinate will be stored
//
// On success, returns TRUE and fills in the 4 coordinates.
var
  FPDFPageObj_GetBounds: function(page_object: FPDF_PAGEOBJECT; var left, bottom, right, top: Single): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the quad points that bounds |page_object|.
//
// page_object  - handle to a page object.
// quad_points  - pointer where the quadrilateral points will be stored.
//
// On success, returns TRUE and fills in |quad_points|.
//
// Similar to FPDFPageObj_GetBounds(), this returns the bounds of a page
// object. When the object is rotated by a non-multiple of 90 degrees, this API
// returns a tighter bound that cannot be represented with just the 4 sides of
// a rectangle.
//
// Currently only works the following |page_object| types: FPDF_PAGEOBJ_TEXT and
// FPDF_PAGEOBJ_IMAGE.
var
  FPDFPageObj_GetRotatedBounds: function(page_object: FPDF_PAGEOBJECT; quad_points: PFS_QUADPOINTSF): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Set the blend mode of |page_object|.
//
// page_object  - handle to a page object.
// blend_mode   - string containing the blend mode.
//
// Blend mode can be one of following: Color, ColorBurn, ColorDodge, Darken,
// Difference, Exclusion, HardLight, Hue, Lighten, Luminosity, Multiply, Normal,
// Overlay, Saturation, Screen, SoftLight
var
  FPDFPageObj_SetBlendMode: procedure(page_object: FPDF_PAGEOBJECT; blend_mode: FPDF_BYTESTRING); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Set the stroke RGBA of a page object. Range of values: 0 - 255.
//
// page_object  - the handle to the page object.
// R            - the red component for the object's stroke color.
// G            - the green component for the object's stroke color.
// B            - the blue component for the object's stroke color.
// A            - the stroke alpha for the object.
//
// Returns TRUE on success.
var
  FPDFPageObj_SetStrokeColor: function(page_object: FPDF_PAGEOBJECT; R, G, B, A: Cardinal): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get the stroke RGBA of a page object. Range of values: 0 - 255.
//
// page_object  - the handle to the page object.
// R            - the red component of the path stroke color.
// G            - the green component of the object's stroke color.
// B            - the blue component of the object's stroke color.
// A            - the stroke alpha of the object.
//
// Returns TRUE on success.
var
  FPDFPageObj_GetStrokeColor: function(page_object: FPDF_PAGEOBJECT; var R, G, B, A: Cardinal): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Set the stroke width of a page object.
//
// path   - the handle to the page object.
// width  - the width of the stroke.
//
// Returns TRUE on success
var
  FPDFPageObj_SetStrokeWidth: function(page_object: FPDF_PAGEOBJECT; width: Single): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get the stroke width of a page object.
//
// path   - the handle to the page object.
// width  - the width of the stroke.
//
// Returns TRUE on success
var
  FPDFPageObj_GetStrokeWidth: function(page_object: FPDF_PAGEOBJECT; var width: Single): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get the line join of |page_object|.
//
// page_object  - handle to a page object.
//
// Returns the line join, or -1 on failure.
// Line join can be one of following: FPDF_LINEJOIN_MITER, FPDF_LINEJOIN_ROUND,
// FPDF_LINEJOIN_BEVEL
var
  FPDFPageObj_GetLineJoin: function(page_object: FPDF_PAGEOBJECT): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Set the line join of |page_object|.
//
// page_object  - handle to a page object.
// line_join    - line join
//
// Line join can be one of following: FPDF_LINEJOIN_MITER, FPDF_LINEJOIN_ROUND,
// FPDF_LINEJOIN_BEVEL
var
  FPDFPageObj_SetLineJoin: function(page_object: FPDF_PAGEOBJECT; line_join: Integer): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get the line cap of |page_object|.
//
// page_object - handle to a page object.
//
// Returns the line cap, or -1 on failure.
// Line cap can be one of following: FPDF_LINECAP_BUTT, FPDF_LINECAP_ROUND,
// FPDF_LINECAP_PROJECTING_SQUARE
var
  FPDFPageObj_GetLineCap: function(page_object: FPDF_PAGEOBJECT): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Set the line cap of |page_object|.
//
// page_object - handle to a page object.
// line_cap    - line cap
//
// Line cap can be one of following: FPDF_LINECAP_BUTT, FPDF_LINECAP_ROUND,
// FPDF_LINECAP_PROJECTING_SQUARE
var
  FPDFPageObj_SetLineCap: function(page_object: FPDF_PAGEOBJECT; line_cap: Integer): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Set the fill RGBA of a page object. Range of values: 0 - 255.
//
// page_object  - the handle to the page object.
// R            - the red component for the object's fill color.
// G            - the green component for the object's fill color.
// B            - the blue component for the object's fill color.
// A            - the fill alpha for the object.
//
// Returns TRUE on success.
var
  FPDFPageObj_SetFillColor: function(page_object: FPDF_PAGEOBJECT; R, G, B, A: Cardinal): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get the fill RGBA of a page object. Range of values: 0 - 255.
//
// page_object  - the handle to the page object.
// R            - the red component of the object's fill color.
// G            - the green component of the object's fill color.
// B            - the blue component of the object's fill color.
// A            - the fill alpha of the object.
//
// Returns TRUE on success.
var
  FPDFPageObj_GetFillColor: function(page_object: FPDF_PAGEOBJECT; var R, G, B, A: Cardinal): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get the line dash |phase| of |page_object|.
//
// page_object - handle to a page object.
// phase - pointer where the dashing phase will be stored.
//
// Returns TRUE on success.
var
  FPDFPageObj_GetDashPhase: function(page_object: FPDF_PAGEOBJECT; var phase: Single): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Set the line dash phase of |page_object|.
//
// page_object - handle to a page object.
// phase - line dash phase.
//
// Returns TRUE on success.
var
  FPDFPageObj_SetDashPhase: function(page_object: FPDF_PAGEOBJECT; phase: Single): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the line dash array of |page_object|.
//
// page_object - handle to a page object.
//
// Returns the line dash array size or -1 on failure.
var
  FPDFPageObj_GetDashCount: function(page_object: FPDF_PAGEOBJECT): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the line dash array of |page_object|.
//
// page_object - handle to a page object.
// dash_array - pointer where the dashing array will be stored.
// dash_count - number of elements in |dash_array|.
//
// Returns TRUE on success.
var
  FPDFPageObj_GetDashArray: function(page_object: FPDF_PAGEOBJECT; dash_array: PSingle; dash_count: SIZE_T): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Set the line dash array of |page_object|.
//
// page_object - handle to a page object.
// dash_array - the dash array.
// dash_count - number of elements in |dash_array|.
// phase - the line dash phase.
//
// Returns TRUE on success.
var
  FPDFPageObj_SetDashArray: function(page_object: FPDF_PAGEOBJECT; const dash_array: PSingle; dash_count: SIZE_T;
    phase: Single): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get number of segments inside |path|.
//
//   path - handle to a path.
//
// A segment is a command, created by e.g. FPDFPath_MoveTo(),
// FPDFPath_LineTo() or FPDFPath_BezierTo().
//
// Returns the number of objects in |path| or -1 on failure.
var
  FPDFPath_CountSegments: function(path: FPDF_PAGEOBJECT): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get segment in |path| at |index|.
//
//   path  - handle to a path.
//   index - the index of a segment.
//
// Returns the handle to the segment, or NULL on faiure.
var
  FPDFPath_GetPathSegment: function(path: FPDF_PAGEOBJECT; index: Integer): FPDF_PATHSEGMENT; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get coordinates of |segment|.
//
//   segment  - handle to a segment.
//   x      - the horizontal position of the segment.
//   y      - the vertical position of the segment.
//
// Returns TRUE on success, otherwise |x| and |y| is not set.
var
  FPDFPathSegment_GetPoint: function(segment: FPDF_PATHSEGMENT; var x, y: Single): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get type of |segment|.
//
//   segment - handle to a segment.
//
// Returns one of the FPDF_SEGMENT_* values on success,
// FPDF_SEGMENT_UNKNOWN on error.
var
  FPDFPathSegment_GetType: function(segment: FPDF_PATHSEGMENT): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Gets if the |segment| closes the current subpath of a given path.
//
//   segment - handle to a segment.
//
// Returns close flag for non-NULL segment, FALSE otherwise.
var
  FPDFPathSegment_GetClose: function(segment: FPDF_PATHSEGMENT): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Move a path's current point.
//
// path   - the handle to the path object.
// x      - the horizontal position of the new current point.
// y      - the vertical position of the new current point.
//
// Note that no line will be created between the previous current point and the
// new one.
//
// Returns TRUE on success
var
  FPDFPath_MoveTo: function(path: FPDF_PAGEOBJECT; x, y: Single): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Add a line between the current point and a new point in the path.
//
// path   - the handle to the path object.
// x      - the horizontal position of the new point.
// y      - the vertical position of the new point.
//
// The path's current point is changed to (x, y).
//
// Returns TRUE on success
var
  FPDFPath_LineTo: function(path: FPDF_PAGEOBJECT; x, y: Single): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Add a cubic Bezier curve to the given path, starting at the current point.
//
// path   - the handle to the path object.
// x1     - the horizontal position of the first Bezier control point.
// y1     - the vertical position of the first Bezier control point.
// x2     - the horizontal position of the second Bezier control point.
// y2     - the vertical position of the second Bezier control point.
// x3     - the horizontal position of the ending point of the Bezier curve.
// y3     - the vertical position of the ending point of the Bezier curve.
//
// Returns TRUE on success
var
  FPDFPath_BezierTo: function(path: FPDF_PAGEOBJECT; x1, y1, x2, y2, x3, y3: Single): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Close the current subpath of a given path.
//
// path   - the handle to the path object.
//
// This will add a line between the current point and the initial point of the
// subpath, thus terminating the current subpath.
//
// Returns TRUE on success
var
  FPDFPath_Close: function(path: FPDF_PAGEOBJECT): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Set the drawing mode of a path.
//
// path     - the handle to the path object.
// fillmode - the filling mode to be set: one of the FPDF_FILLMODE_* flags.
// stroke   - a boolean specifying if the path should be stroked or not.
//
// Returns TRUE on success
var
  FPDFPath_SetDrawMode: function(path: FPDF_PAGEOBJECT; fillmode: Integer; stoke: FPDF_BOOL): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get the drawing mode of a path.
//
// path     - the handle to the path object.
// fillmode - the filling mode of the path: one of the FPDF_FILLMODE_* flags.
// stroke   - a boolean specifying if the path is stroked or not.
//
// Returns TRUE on success
var
  FPDFPath_GetDrawMode: function(path: FPDF_PAGEOBJECT; var fillmode: Integer; var stoke: FPDF_BOOL): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Create a new text object using one of the standard PDF fonts.
//
// document   - handle to the document.
// font       - string containing the font name, without spaces.
// font_size  - the font size for the new text object.
//
// Returns a handle to a new text object, or NULL on failure
var
  FPDFPageObj_NewTextObj: function(document: FPDF_DOCUMENT; font: FPDF_BYTESTRING; font_size: Single): FPDF_PAGEOBJECT; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Set the text for a text object. If it had text, it will be replaced.
//
// text_object  - handle to the text object.
// text         - the UTF-16LE encoded string containing the text to be added.
//
// Returns TRUE on success
var
  FPDFText_SetText: function(text_object: FPDF_PAGEOBJECT; text: FPDF_WIDESTRING): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Set the text using charcodes for a text object. If it had text, it will be
// replaced.
//
// text_object  - handle to the text object.
// charcodes    - pointer to an array of charcodes to be added.
// count        - number of elements in |charcodes|.
//
// Returns TRUE on success
var
  FPDFText_SetCharcodes: function(text_object: FPDF_PAGEOBJECT; const charcodes: PUINT; count: SIZE_T): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Returns a font object loaded from a stream of data. The font is loaded
// into the document. Various font data structures, such as the ToUnicode data,
// are auto-generated based on the inputs.
//
// document  - handle to the document.
// data      - the stream of font data, which will be copied by the font object.
// size      - the size of the font data, in bytes.
// font_type - FPDF_FONT_TYPE1 or FPDF_FONT_TRUETYPE depending on the font type.
// cid       - a boolean specifying if the font is a CID font or not.
//
// The loaded font can be closed using FPDFFont_Close().
var
  FPDFText_LoadFont: function(document: FPDF_DOCUMENT; data: PByte; size: DWORD;
    font_type: Integer; cid: FPDF_BOOL): FPDF_FONT; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Loads one of the standard 14 fonts per PDF spec 1.7 page 416. The preferred
// way of using font style is using a dash to separate the name from the style,
// for example 'Helvetica-BoldItalic'.
//
// document   - handle to the document.
// font       - string containing the font name, without spaces.
//
// The loaded font can be closed using FPDFFont_Close().
//
// Returns NULL on failure.
var
  FPDFText_LoadStandardFont: function(document: FPDF_DOCUMENT; font: FPDF_BYTESTRING): FPDF_FONT; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Returns a font object loaded from a stream of data for a type 2 CID font. The
// font is loaded into the document. Unlike FPDFText_LoadFont(), the ToUnicode
// data and the CIDToGIDMap data are caller provided, instead of auto-generated.
//
// document                 - handle to the document.
// font_data                - the stream of font data, which will be copied by
//                            the font object.
// font_data_size           - the size of the font data, in bytes.
// to_unicode_cmap          - the ToUnicode data.
// cid_to_gid_map_data      - the stream of CIDToGIDMap data.
// cid_to_gid_map_data_size - the size of the CIDToGIDMap data, in bytes.
//
// The loaded font can be closed using FPDFFont_Close().
//
// Returns NULL on failure.
var
  FPDFText_LoadCidType2Font: function(document: FPDF_DOCUMENT; font_data: PByte; font_data_size: DWORD;
    to_unicode_cmap: FPDF_BYTESTRING; cid_to_gid_map_data: PByte; cid_to_gid_map_data_size: DWORD): FPDF_FONT; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get the font size of a text object.
//
//   text - handle to a text.
//
//   size - pointer to the font size of the text object, measured in points
//   (about 1/72 inch)
//
// Returns TRUE on success.
var
  FPDFTextObj_GetFontSize: function(text: FPDF_PAGEOBJECT; var size: Single): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Close a loaded PDF font.
//
// font   - Handle to the loaded font.
var
  FPDFFont_Close: procedure(font: FPDF_FONT); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Create a new text object using a loaded font.
//
// document   - handle to the document.
// font       - handle to the font object.
// font_size  - the font size for the new text object.
//
// Returns a handle to a new text object, or NULL on failure
var
  FPDFPageObj_CreateTextObj: function(document: FPDF_DOCUMENT; font: FPDF_FONT; font_size: Single): FPDF_PAGEOBJECT; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get the text rendering mode of a text object.
//
// text     - the handle to the text object.
//
// Returns one of the known FPDF_TEXT_RENDERMODE enum values on success,
// FPDF_TEXTRENDERMODE_UNKNOWN on error.
var
  FPDFTextObj_GetTextRenderMode: function(text: FPDF_PAGEOBJECT): FPDF_TEXT_RENDERMODE; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Set the text rendering mode of a text object.
//
// text         - the handle to the text object.
// render_mode  - the FPDF_TEXT_RENDERMODE enum value to be set (cannot set to
//                FPDF_TEXTRENDERMODE_UNKNOWN).
//
// Returns TRUE on success.
var
  FPDFTextObj_SetTextRenderMode: function(text: FPDF_PAGEOBJECT; render_mode: FPDF_TEXT_RENDERMODE): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get the text of a text object.
//
// text_object      - the handle to the text object.
// text_page        - the handle to the text page.
// buffer           - the address of a buffer that receives the text.
// length           - the size, in bytes, of |buffer|.
//
// Returns the number of bytes in the text (including the trailing NUL
// character) on success, 0 on error.
//
// Regardless of the platform, the |buffer| is always in UTF-16LE encoding.
// If |length| is less than the returned length, or |buffer| is NULL, |buffer|
// will not be modified.
var
  FPDFTextObj_GetText: function(text_object: FPDF_PAGEOBJECT; text_page: FPDF_TEXTPAGE; buffer: PFPDF_WCHAR;
    length: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get a bitmap rasterization of |text_object|. To render correctly, the caller
// must provide the |document| associated with |text_object|. If there is a
// |page| associated with |text_object|, the caller should provide that as well.
// The returned bitmap will be owned by the caller, and FPDFBitmap_Destroy()
// must be called on the returned bitmap when it is no longer needed.
//
//   document    - handle to a document associated with |text_object|.
//   page        - handle to an optional page associated with |text_object|.
//   text_object - handle to a text object.
//   scale       - the scaling factor, which must be greater than 0.
//
// Returns the bitmap or NULL on failure.
var
  FPDFTextObj_GetRenderedBitmap: function(document: FPDF_DOCUMENT; page: FPDF_PAGE; text_object: FPDF_PAGEOBJECT;
    scale: Single): FPDF_BITMAP; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the font of a text object.
//
// text - the handle to the text object.
//
// Returns a handle to the font object held by |text| which retains ownership.
var
  FPDFTextObj_GetFont: function(text: FPDF_PAGEOBJECT): FPDF_FONT; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the family name of a font.
//
// font   - the handle to the font object.
// buffer - the address of a buffer that receives the font name.
// length - the size, in bytes, of |buffer|.
//
// Returns the number of bytes in the family name (including the trailing NUL
// character) on success, 0 on error.
//
// Regardless of the platform, the |buffer| is always in UTF-8 encoding.
// If |length| is less than the returned length, or |buffer| is NULL, |buffer|
// will not be modified.
var
  FPDFFont_GetFamilyName: function(font: FPDF_FONT; buffer: PAnsiChar; length: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the decoded data from the |font| object.
//
// font       - The handle to the font object. (Required)
// buffer     - The address of a buffer that receives the font data.
// buflen     - Length of the buffer.
// out_buflen - Pointer to variable that will receive the minimum buffer size
//              to contain the font data. Not filled if the return value is
//              FALSE. (Required)
//
// Returns TRUE on success. In which case, |out_buflen| will be filled, and
// |buffer| will be filled if it is large enough. Returns FALSE if any of the
// required parameters are null.
//
// The decoded data is the uncompressed font data. i.e. the raw font data after
// having all stream filters applied, when the data is embedded.
//
// If the font is not embedded, then this API will instead return the data for
// the substitution font it is using.
var
  FPDFFont_GetFontData: function(font: FPDF_FONT; buffer: PByte; buflen: SIZE_T; var out_buflen: SIZE_T): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get whether |font| is embedded or not.
//
// font - the handle to the font object.
//
// Returns 1 if the font is embedded, 0 if it not, and -1 on failure.
var
  FPDFFont_GetIsEmbedded: function(font: FPDF_FONT): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the descriptor flags of a font.
//
// font - the handle to the font object.
//
// Returns the bit flags specifying various characteristics of the font as
// defined in ISO 32000-1:2008, table 123, -1 on failure.
var
  FPDFFont_GetFlags: function(font: FPDF_FONT): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the font weight of a font.
//
// font - the handle to the font object.
//
// Returns the font weight, -1 on failure.
// Typical values are 400 (normal) and 700 (bold).
var
  FPDFFont_GetWeight: function(font: FPDF_FONT): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the italic angle of a font.
//
// font  - the handle to the font object.
// angle - pointer where the italic angle will be stored
//
// The italic angle of a |font| is defined as degrees counterclockwise
// from vertical. For a font that slopes to the right, this will be negative.
//
// Returns TRUE on success; |angle| unmodified on failure.
var
  FPDFFont_GetItalicAngle: function(font: FPDF_FONT; var angle: Integer): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get ascent distance of a font.
//
// font       - the handle to the font object.
// font_size  - the size of the |font|.
// ascent     - pointer where the font ascent will be stored
//
// Ascent is the maximum distance in points above the baseline reached by the
// glyphs of the |font|. One point is 1/72 inch (around 0.3528 mm).
//
// Returns TRUE on success; |ascent| unmodified on failure.
var
  FPDFFont_GetAscent: function(font: FPDF_FONT; font_size: Single; var ascent: Single): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get descent distance of a font.
//
// font       - the handle to the font object.
// font_size  - the size of the |font|.
// descent    - pointer where the font descent will be stored
//
// Descent is the maximum distance in points below the baseline reached by the
// glyphs of the |font|. One point is 1/72 inch (around 0.3528 mm).
//
// Returns TRUE on success; |descent| unmodified on failure.
var
  FPDFFont_GetDescent: function(font: FPDF_FONT; font_size: Single; var descent: Single): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the width of a glyph in a font.
//
// font       - the handle to the font object.
// glyph      - the glyph.
// font_size  - the size of the font.
// width      - pointer where the glyph width will be stored
//
// Glyph width is the distance from the end of the prior glyph to the next
// glyph. This will be the vertical distance for vertical writing.
//
// Returns TRUE on success; |width| unmodified on failure.
var
  FPDFFont_GetGlyphWidth: function(font: FPDF_FONT; glyph: UINT; font_size: Single; var width: Single): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the glyphpath describing how to draw a font glyph.
//
// font       - the handle to the font object.
// glyph      - the glyph being drawn.
// font_size  - the size of the font.
//
// Returns the handle to the segment, or NULL on faiure.
var
  FPDFFont_GetGlyphPath: function(font: FPDF_FONT; glyph: UINT; font_size: Single): FPDF_GLYPHPATH; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get number of segments inside glyphpath.
//
// glyphpath - handle to a glyph path.
//
// Returns the number of objects in |glyphpath| or -1 on failure.
var
  FPDFGlyphPath_CountGlyphSegments: function(glyphpath: FPDF_GLYPHPATH): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get segment in glyphpath at index.
//
// glyphpath  - handle to a glyph path.
// index      - the index of a segment.
//
// Returns the handle to the segment, or NULL on faiure.
var
  FPDFGlyphPath_GetGlyphPathSegment: function(glyphpath: FPDF_GLYPHPATH; index: Integer): FPDF_PATHSEGMENT; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get number of page objects inside |form_object|.
//
//   form_object - handle to a form object.
//
// Returns the number of objects in |form_object| on success, -1 on error.
var
  FPDFFormObj_CountObjects: function(form_object: FPDF_PAGEOBJECT): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get page object in |form_object| at |index|.
//
//   form_object - handle to a form object.
//   index       - the 0-based index of a page object.
//
// Returns the handle to the page object, or NULL on error.
var
  FPDFFormObj_GetObject: function(form_object: FPDF_PAGEOBJECT; index: LongWord): FPDF_PAGEOBJECT; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// *** _FPDF_PPO_H_ ***

// Experimental API.
// Import pages to a FPDF_DOCUMENT.
//
//   dest_doc     - The destination document for the pages.
//   src_doc      - The document to be imported.
//   page_indices - An array of page indices to be imported. The first page is
//                  zero. If |page_indices| is NULL, all pages from |src_doc|
//                  are imported.
//   length       - The length of the |page_indices| array.
//   index        - The page index at which to insert the first imported page
//                  into |dest_doc|. The first page is zero.
//
// Returns TRUE on success. Returns FALSE if any pages in |page_indices| is
// invalid.
var
  FPDF_ImportPagesByIndex: function(dest_doc, src_doc: FPDF_DOCUMENT; page_indices: PInteger;
    length: LongWord; index: Integer): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Import pages to a FPDF_DOCUMENT.
//
//   dest_doc  - The destination document for the pages.
//   src_doc   - The document to be imported.
//   pagerange - A page range string, Such as "1,3,5-7". The first page is one.
//               If |pagerange| is NULL, all pages from |src_doc| are imported.
//   index     - The page index at which to insert the first imported page into
//               |dest_doc|. The first page is zero.
//
// Returns TRUE on success. Returns FALSE if any pages in |pagerange| is
// invalid or if |pagerange| cannot be read.
var
  FPDF_ImportPages: function(dest_doc, src_doc: FPDF_DOCUMENT; pagerange: FPDF_BYTESTRING; index: Integer): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Create a new document from |src_doc|.  The pages of |src_doc| will be
// combined to provide |num_pages_on_x_axis x num_pages_on_y_axis| pages per
// |output_doc| page.
//
//   src_doc             - The document to be imported.
//   output_width        - The output page width in PDF "user space" units.
//   output_height       - The output page height in PDF "user space" units.
//   num_pages_on_x_axis - The number of pages on X Axis.
//   num_pages_on_y_axis - The number of pages on Y Axis.
//
// Return value:
//   A handle to the created document, or NULL on failure.
//
// Comments:
//   number of pages per page = num_pages_on_x_axis * num_pages_on_y_axis
//
var
  FPDF_ImportNPagesToOne: function(src_doc: FPDF_DOCUMENT; output_width, output_height: Single;
    num_pages_on_x_axis, num_pages_on_y_axis: SIZE_T): FPDF_DOCUMENT; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Create a template to generate form xobjects from |src_doc|'s page at
// |src_page_index|, for use in |dest_doc|.
//
// Returns a handle on success, or NULL on failure. Caller owns the newly
// created object.
var
  FPDF_NewXObjectFromPage: function(dest_doc, src_doc: FPDF_DOCUMENT; src_page_index: Integer): FPDF_XOBJECT; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Close an FPDF_XOBJECT handle created by FPDF_NewXObjectFromPage().
// FPDF_PAGEOBJECTs created from the FPDF_XOBJECT handle are not affected.
var
  FPDF_CloseXObject: procedure(xobject: FPDF_XOBJECT); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Create a new form object from an FPDF_XOBJECT object.
//
// Returns a new form object on success, or NULL on failure. Caller owns the
// newly created object.
var
  FPDF_NewFormObjectFromXObject: function(xobject: FPDF_XOBJECT): FPDF_PAGEOBJECT; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Copy the viewer preferences from |src_doc| into |dest_doc|.
//
//   dest_doc - Document to write the viewer preferences into.
//   src_doc  - Document to read the viewer preferences from.
//
// Returns TRUE on success.
var
  FPDF_CopyViewerPreferences: function(dest_doc, src_doc: FPDF_DOCUMENT): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};


// *** _FPDF_SAVE_H_ ***

type
  // Structure for custom file write
  PFPDF_FILEWRITE = ^FPDF_FILEWRITE;
  FPDF_FILEWRITE = record
    //
    // Version number of the interface. Currently must be 1.
    //
    version: Integer;

    //
    // Method: WriteBlock
    //          Output a block of data in your custom way.
    // Interface Version:
    //          1
    // Implementation Required:
    //          Yes
    // Comments:
    //          Called by function FPDF_SaveDocument
    // Parameters:
    //          pThis       -   Pointer to the structure itself
    //          pData       -   Pointer to a buffer to output
    //          size        -   The size of the buffer.
    // Return value:
    //          Should be non-zero if successful, zero for error.
    //
    WriteBlock: function(pThis: PFPDF_FILEWRITE; pData: Pointer; size: LongWord): Integer; cdecl;
  end;
  PFPdfFileWrite = ^TFPdfFileWrite;
  TFPdfFileWrite = FPDF_FILEWRITE;

const
  // Flags for FPDF_SaveAsCopy()
  FPDF_INCREMENTAL     = 1;
  FPDF_NO_INCREMENTAL  = 2;
  FPDF_REMOVE_SECURITY = 3;

// Function: FPDF_SaveAsCopy
//          Saves the copy of specified document in custom way.
// Parameters:
//          document        -   Handle to document, as returned by
//                              FPDF_LoadDocument() or FPDF_CreateNewDocument().
//          pFileWrite      -   A pointer to a custom file write structure.
//          flags           -   The creating flags.
// Return value:
//          TRUE for succeed, FALSE for failed.
//
var
  FPDF_SaveAsCopy: function(document: FPDF_DOCUMENT; pFileWrite: PFPDF_FILEWRITE; flags: FPDF_DWORD): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_SaveWithVersion
//          Same as FPDF_SaveAsCopy(), except the file version of the
//          saved document can be specified by the caller.
// Parameters:
//          document        -   Handle to document.
//          pFileWrite      -   A pointer to a custom file write structure.
//          flags           -   The creating flags.
//          fileVersion     -   The PDF file version. File version: 14 for 1.4, 15 for 1.5, ...
// Return value:
//          TRUE if succeed, FALSE if failed.
//
var
  FPDF_SaveWithVersion: function(document: FPDF_DOCUMENT; pFileWrite: PFPDF_FILEWRITE;
    flags: FPDF_DWORD; fileVersion: Integer): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};


// *** _FPDF_FLATTEN_H_ ***

const
  FLATTEN_FAIL       = 0;  // Flatten operation failed.
  FLATTEN_SUCCESS    = 1;  // Flatten operation succeed.
  FLATTEN_NOTINGTODO = 2;  // Nothing to be flattened.

  FLAT_NORMALDISPLAY = 0;  // Flatten for normal display.
  FLAT_PRINT         = 1;  // Flatten for print.

// Flatten annotations and form fields into the page contents.
//
//   page  - handle to the page.
//   nFlag - One of the |FLAT_*| values denoting the page usage.
//
// Returns one of the |FLATTEN_*| values.
//
// Currently, all failures return |FLATTEN_FAIL| with no indication of the
// cause.
var
  FPDFPage_Flatten: function(page: FPDF_PAGE; nFlag: Integer): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};


// *** _FPDFTEXT_H_ ***

// Function: FPDFText_LoadPage
//          Prepare information about all characters in a page.
// Parameters:
//          page    -   Handle to the page. Returned by FPDF_LoadPage function (in FPDFVIEW module).
// Return value:
//          A handle to the text page information structure.
//          NULL if something goes wrong.
// Comments:
//          Application must call FPDFText_ClosePage to release the text page
//          information.
//
var
  FPDFText_LoadPage: function(page: FPDF_PAGE): FPDF_TEXTPAGE; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDFText_ClosePage
//          Release all resources allocated for a text page information structure.
// Parameters:
//          text_page   -   Handle to a text page information structure. Returned by FPDFText_LoadPage function.
// Return Value:
//          None.
//
var
  FPDFText_ClosePage: procedure(text_page: FPDF_TEXTPAGE); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDFText_CountChars
//          Get number of characters in a page.
// Parameters:
//          text_page   -   Handle to a text page information structure. Returned by FPDFText_LoadPage function.
// Return value:
//          Number of characters in the page. Return -1 for error.
//          Generated characters, like additional space characters, new line
//          characters, are also counted.
// Comments:
//          Characters in a page form a "stream", inside the stream, each character has an index.
//          We will use the index parameters in many of FPDFTEXT functions. The first character in the page
//          has an index value of zero.
//
var
  FPDFText_CountChars: function(text_page: FPDF_TEXTPAGE): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDFText_GetUnicode
//          Get Unicode of a character in a page.
// Parameters:
//          text_page   -   Handle to a text page information structure. Returned by FPDFText_LoadPage function.
//          index       -   Zero-based index of the character.
// Return value:
//          The Unicode of the particular character.
//          If a character is not encoded in Unicode and Foxit engine can't convert to Unicode,
//          the return value will be zero.
//
var
  FPDFText_GetUnicode: function(text_page: FPDF_TEXTPAGE; index: Integer): WideChar; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDFText_GetTextObject
//          Get the FPDF_PAGEOBJECT associated with a given character.
// Parameters:
//          text_page   -   Handle to a text page information structure.
//                          Returned by FPDFText_LoadPage function.
//          index       -   Zero-based index of the character.
// Return value:
//          The associated text object for the character at |index|, or NULL on
//          error. The returned text object, if non-null, is of type
//          |FPDF_PAGEOBJ_TEXT|. The caller does not own the returned object.
//
var
  FPDFText_GetTextObject: function(text_page: FPDF_TEXTPAGE; index: Integer): FPDF_PAGEOBJECT; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDFText_IsGenerated
//          Get if a character in a page is generated by PDFium.
// Parameters:
//          text_page   -   Handle to a text page information structure.
//                          Returned by FPDFText_LoadPage function.
//          index       -   Zero-based index of the character.
// Return value:
//          1 if the character is generated by PDFium.
//          0 if the character is not generated by PDFium.
//          -1 if there was an error.
//
var
  FPDFText_IsGenerated: function(text_page: FPDF_TEXTPAGE; index: Integer): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDFText_IsHyphen
//          Get if a character in a page is a hyphen.
// Parameters:
//          text_page   -   Handle to a text page information structure.
//                          Returned by FPDFText_LoadPage function.
//          index       -   Zero-based index of the character.
// Return value:
//          1 if the character is a hyphen.
//          0 if the character is not a hyphen.
//          -1 if there was an error.
//
var
  FPDFText_IsHyphen: function(text_page: FPDF_TEXTPAGE; index: Integer): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDFText_HasUnicodeMapError
//          Get if a character in a page has an invalid unicode mapping.
// Parameters:
//          text_page   -   Handle to a text page information structure.
//                          Returned by FPDFText_LoadPage function.
//          index       -   Zero-based index of the character.
// Return value:
//          1 if the character has an invalid unicode mapping.
//          0 if the character has no known unicode mapping issues.
//          -1 if there was an error.
//
var
  FPDFText_HasUnicodeMapError: function(text_page: FPDF_TEXTPAGE; index: Integer): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDFText_GetFontSize
//          Get the font size of a particular character.
// Parameters:
//          text_page   -   Handle to a text page information structure.
//                          Returned by FPDFText_LoadPage function.
//          index       -   Zero-based index of the character.
// Return value:
//          The font size of the particular character, measured in points (about
//          1/72 inch). This is the typographic size of the font (so called
//          "em size").
//
var
  FPDFText_GetFontSize: function(text_page: FPDF_TEXTPAGE; index: Integer): Double; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDFText_GetFontInfo
//          Get the font name and flags of a particular character.
// Parameters:
//          text_page - Handle to a text page information structure.
//                      Returned by FPDFText_LoadPage function.
//          index     - Zero-based index of the character.
//          buffer    - A buffer receiving the font name.
//          buflen    - The length of |buffer| in bytes.
//          flags     - Optional pointer to an int receiving the font flags.
//                      These flags should be interpreted per PDF spec 1.7
//                      Section 5.7.1 Font Descriptor Flags.
// Return value:
//          On success, return the length of the font name, including the
//          trailing NUL character, in bytes. If this length is less than or
//          equal to |length|, |buffer| is set to the font name, |flags| is
//          set to the font flags. |buffer| is in UTF-8 encoding. Return 0 on
//          failure.
//
var
  FPDFText_GetFontInfo: function(text_page: FPDF_TEXTPAGE; index: Integer; buffer: Pointer; buflen: LongWord;
    flags: PInteger): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDFText_GetFontWeight
//          Get the font weight of a particular character.
// Parameters:
//          text_page   -   Handle to a text page information structure.
//                          Returned by FPDFText_LoadPage function.
//          index       -   Zero-based index of the character.
// Return value:
//          On success, return the font weight of the particular character. If
//          |text_page| is invalid, if |index| is out of bounds, or if the
//          character's text object is undefined, return -1.
//
var
  FPDFText_GetFontWeight: function(text_page: FPDF_TEXTPAGE; index: Integer): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDFText_GetFillColor
//          Get the fill color of a particular character.
// Parameters:
//          text_page      -   Handle to a text page information structure.
//                             Returned by FPDFText_LoadPage function.
//          index          -   Zero-based index of the character.
//          R              -   Pointer to an unsigned int number receiving the
//                             red value of the fill color.
//          G              -   Pointer to an unsigned int number receiving the
//                             green value of the fill color.
//          B              -   Pointer to an unsigned int number receiving the
//                             blue value of the fill color.
//          A              -   Pointer to an unsigned int number receiving the
//                             alpha value of the fill color.
// Return value:
//          Whether the call succeeded. If false, |R|, |G|, |B| and |A| are
//          unchanged.
//
var
  FPDFText_GetFillColor: function(text_page: FPDF_TEXTPAGE; index: Integer; var R, G, B, A: Cardinal): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDFText_GetStrokeColor
//          Get the stroke color of a particular character.
// Parameters:
//          text_page      -   Handle to a text page information structure.
//                             Returned by FPDFText_LoadPage function.
//          index          -   Zero-based index of the character.
//          R              -   Pointer to an unsigned int number receiving the
//                             red value of the stroke color.
//          G              -   Pointer to an unsigned int number receiving the
//                             green value of the stroke color.
//          B              -   Pointer to an unsigned int number receiving the
//                             blue value of the stroke color.
//          A              -   Pointer to an unsigned int number receiving the
//                             alpha value of the stroke color.
// Return value:
//          Whether the call succeeded. If false, |R|, |G|, |B| and |A| are
//          unchanged.
//
var
  FPDFText_GetStrokeColor: function(text_page: FPDF_TEXTPAGE; index: Integer; var R, G, B, A: Cardinal): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDFText_GetCharAngle
//          Get character rotation angle.
// Parameters:
//          text_page   -   Handle to a text page information structure.
//                          Returned by FPDFText_LoadPage function.
//          index       -   Zero-based index of the character.
// Return Value:
//          On success, return the angle value in radian. Value will always be
//          greater or equal to 0. If |text_page| is invalid, or if |index| is
//          out of bounds, then return -1.
//
var
  FPDFText_GetCharAngle: function(text_page: FPDF_TEXTPAGE; index: Integer): Single; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDFText_GetCharBox
//          Get bounding box of a particular character.
// Parameters:
//          text_page   -   Handle to a text page information structure. Returned by FPDFText_LoadPage function.
//          index       -   Zero-based index of the character.
//          left        -   Pointer to a double number receiving left position of the character box.
//          right       -   Pointer to a double number receiving right position of the character box.
//          bottom      -   Pointer to a double number receiving bottom position of the character box.
//          top         -   Pointer to a double number receiving top position of the character box.
// Return Value:
//          On success, return TRUE and fill in |left|, |right|, |bottom|, and
//          |top|. If |text_page| is invalid, or if |index| is out of bounds,
//          then return FALSE, and the out parameters remain unmodified.
// Comments:
//          All positions are measured in PDF "user space".
//
var
  FPDFText_GetCharBox: procedure(text_page: FPDF_TEXTPAGE; index: Integer; var left, right, bottom, top: Double); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDFText_GetLooseCharBox
//          Get a "loose" bounding box of a particular character, i.e., covering
//          the entire glyph bounds, without taking the actual glyph shape into
//          account.
// Parameters:
//          text_page   -   Handle to a text page information structure.
//                          Returned by FPDFText_LoadPage function.
//          index       -   Zero-based index of the character.
//          rect        -   Pointer to a FS_RECTF receiving the character box.
// Return Value:
//          On success, return TRUE and fill in |rect|. If |text_page| is
//          invalid, or if |index| is out of bounds, then return FALSE, and the
//          |rect| out parameter remains unmodified.
// Comments:
//          All positions are measured in PDF "user space".
//
var
  FPDFText_GetLooseCharBox: function(text_page: FPDF_TEXTPAGE; index: Integer; rect: PFS_RECTF): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDFText_GetMatrix
//          Get the effective transformation matrix for a particular character.
// Parameters:
//          text_page   -   Handle to a text page information structure.
//                          Returned by FPDFText_LoadPage().
//          index       -   Zero-based index of the character.
//          matrix      -   Pointer to a FS_MATRIX receiving the transformation
//                          matrix.
// Return Value:
//          On success, return TRUE and fill in |matrix|. If |text_page| is
//          invalid, or if |index| is out of bounds, or if |matrix| is NULL,
//          then return FALSE, and |matrix| remains unmodified.
//
var
  FPDFText_GetMatrix: function(text_page: FPDF_TEXTPAGE; index: Integer; matrix: PFS_MATRIX): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDFText_GetCharOrigin
//          Get origin of a particular character.
// Parameters:
//          text_page   -   Handle to a text page information structure.
//                          Returned by FPDFText_LoadPage function.
//          index       -   Zero-based index of the character.
//          x           -   Pointer to a double number receiving x coordinate of
//                          the character origin.
//          y           -   Pointer to a double number receiving y coordinate of
//                          the character origin.
// Return Value:
//          Whether the call succeeded. If false, x and y are unchanged.
// Comments:
//          All positions are measured in PDF "user space".
//
var
  FPDFText_GetCharOrigin: function(text_page: FPDF_TEXTPAGE; index: Integer; var x, y: Double): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDFText_GetCharIndexAtPos
//          Get the index of a character at or nearby a certain position on the
//          page.
// Parameters:
//          text_page   -   Handle to a text page information structure.
//                          Returned by FPDFText_LoadPage function.
//          x           -   X position in PDF "user space".
//          y           -   Y position in PDF "user space".
//          xTolerance  -   An x-axis tolerance value for character hit
//                          detection, in point units.
//          yTolerance  -   A y-axis tolerance value for character hit
//                          detection, in point units.
// Return Value:
//          The zero-based index of the character at, or nearby the point (x,y).
//          If there is no character at or nearby the point, return value will
//          be -1. If an error occurs, -3 will be returned.
//
var
  FPDFText_GetCharIndexAtPos: function(text_page: FPDF_TEXTPAGE; x, y, xTorelance, yTolerance: Double): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDFText_GetText
//          Extract unicode text string from the page.
// Parameters:
//          text_page   -   Handle to a text page information structure.
//                          Returned by FPDFText_LoadPage function.
//          start_index -   Index for the start characters.
//          count       -   Number of UCS-2 values to be extracted.
//          result      -   A buffer (allocated by application) receiving the
//                          extracted UCS-2 values. The buffer must be able to
//                          hold `count` UCS-2 values plus a terminator.
// Return Value:
//          Number of characters written into the result buffer, including the
//          trailing terminator.
// Comments:
//          This function ignores characters without UCS-2 representations.
//          It considers all characters on the page, even those that are not
//          visible when the page has a cropbox. To filter out the characters
//          outside of the cropbox, use FPDF_GetPageBoundingBox() and
//          FPDFText_GetCharBox().
//
var
  FPDFText_GetText: function(text_page: FPDF_TEXTPAGE; start_index, count: Integer; result: PWideChar): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDFText_CountRects
//          Counts number of rectangular areas occupied by a segment of text,
//          and caches the result for subsequent FPDFText_GetRect() calls.
// Parameters:
//          text_page   -   Handle to a text page information structure.
//                          Returned by FPDFText_LoadPage function.
//          start_index -   Index for the start character.
//          count       -   Number of characters, or -1 for all remaining.
// Return value:
//          Number of rectangles, 0 if text_page is null, or -1 on bad
//          start_index.
// Comments:
//          This function, along with FPDFText_GetRect can be used by
//          applications to detect the position on the page for a text segment,
//          so proper areas can be highlighted. The FPDFText_* functions will
//          automatically merge small character boxes into bigger one if those
//          characters are on the same line and use same font settings.
//
var
  FPDFText_CountRects: function(text_page: FPDF_TEXTPAGE; start_index, count: Integer): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDFText_GetRect
//          Get a rectangular area from the result generated by
//          FPDFText_CountRects.
// Parameters:
//          text_page   -   Handle to a text page information structure.
//                          Returned by FPDFText_LoadPage function.
//          rect_index  -   Zero-based index for the rectangle.
//          left        -   Pointer to a double value receiving the rectangle
//                          left boundary.
//          top         -   Pointer to a double value receiving the rectangle
//                          top boundary.
//          right       -   Pointer to a double value receiving the rectangle
//                          right boundary.
//          bottom      -   Pointer to a double value receiving the rectangle
//                          bottom boundary.
// Return Value:
//          On success, return TRUE and fill in |left|, |top|, |right|, and
//          |bottom|. If |text_page| is invalid then return FALSE, and the out
//          parameters remain unmodified. If |text_page| is valid but
//          |rect_index| is out of bounds, then return FALSE and set the out
//          parameters to 0.
//
var
  FPDFText_GetRect: procedure(text_page: FPDF_TEXTPAGE; rect_index: Integer; var left, top, right, bottom: Double); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDFText_GetBoundedText
//          Extract unicode text within a rectangular boundary on the page.
// Parameters:
//          text_page   -   Handle to a text page information structure.
//                          Returned by FPDFText_LoadPage function.
//          left        -   Left boundary.
//          top         -   Top boundary.
//          right       -   Right boundary.
//          bottom      -   Bottom boundary.
//          buffer      -   Caller-allocated buffer to receive UTF-16 values.
//          buflen      -   Number of UTF-16 values (not bytes) that `buffer`
//                          is capable of holding.
// Return Value:
//          If buffer is NULL or buflen is zero, return number of UTF-16
//          values (not bytes) of text present within the rectangle, excluding
//          a terminating NUL. Generally you should pass a buffer at least one
//          larger than this if you want a terminating NUL, which will be
//          provided if space is available. Otherwise, return number of UTF-16
//          values copied into the buffer, including the terminating NUL when
//          space for it is available.
// Comment:
//          If the buffer is too small, as much text as will fit is copied into
//          it. May return a split surrogate in that case.
//
var
  FPDFText_GetBoundedText: function(text_page: FPDF_TEXTPAGE; left, top, right, bottom: Double;
    buffer: PWideChar; buflen: Integer): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

const
  // Flags used by FPDFText_FindStart function.
  FPDF_MATCHCASE      = $00000001; // If not set, it will not match case by default.
  FPDF_MATCHWHOLEWORD = $00000002; // If not set, it will not match the whole word by default.
  FPDF_CONSECUTIVE    = $00000004; // If not set, it will skip past the current match to look for the next match.

// Function: FPDFText_FindStart
//          Start a search.
// Parameters:
//          text_page   -   Handle to a text page information structure. Returned by FPDFText_LoadPage function.
//          findwhat    -   A unicode match pattern.
//          flags       -   Option flags.
//          start_index -   Start from this character. -1 for end of the page.
// Return Value:
//          A handle for the search context. FPDFText_FindClose must be called
//          to release this handle.
//
var
  FPDFText_FindStart: function(text_page: FPDF_TEXTPAGE; findwhat: FPDF_WIDESTRING; flags: LongWord;
    start_index: Integer): FPDF_SCHHANDLE; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDFText_FindNext
//          Search in the direction from page start to end.
// Parameters:
//          handle      -   A search context handle returned by FPDFText_FindStart.
// Return Value:
//          Whether a match is found.
//
var
  FPDFText_FindNext: function(handle: FPDF_SCHHANDLE): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDFText_FindPrev
//          Search in the direction from page end to start.
// Parameters:
//          handle      -   A search context handle returned by FPDFText_FindStart.
// Return Value:
//          Whether a match is found.
//
var
  FPDFText_FindPrev: function(handle: FPDF_SCHHANDLE): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDFText_GetSchResultIndex
//          Get the starting character index of the search result.
// Parameters:
//          handle      -   A search context handle returned by FPDFText_FindStart.
// Return Value:
//          Index for the starting character.
//
var
  FPDFText_GetSchResultIndex: function(handle: FPDF_SCHHANDLE): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDFText_GetSchCount
//          Get the number of matched characters in the search result.
// Parameters:
//          handle      -   A search context handle returned by FPDFText_FindStart.
// Return Value:
//          Number of matched characters.
//
var
  FPDFText_GetSchCount: function(handle: FPDF_SCHHANDLE): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDFText_FindClose
//          Release a search context.
// Parameters:
//          handle      -   A search context handle returned by FPDFText_FindStart.
// Return Value:
//          None.
//
var
  FPDFText_FindClose: procedure(handle: FPDF_SCHHANDLE); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDFLink_LoadWebLinks
//          Prepare information about weblinks in a page.
// Parameters:
//          text_page   -   Handle to a text page information structure.
//                          Returned by FPDFText_LoadPage function.
// Return Value:
//          A handle to the page's links information structure, or
//          NULL if something goes wrong.
// Comments:
//          Weblinks are those links implicitly embedded in PDF pages. PDF also
//          has a type of annotation called "link" (FPDFTEXT doesn't deal with
//          that kind of link). FPDFTEXT weblink feature is useful for
//          automatically detecting links in the page contents. For example,
//          things like "https://www.example.com" will be detected, so
//          applications can allow user to click on those characters to activate
//          the link, even the PDF doesn't come with link annotations.
//
//          FPDFLink_CloseWebLinks must be called to release resources.
//
var
  FPDFLink_LoadWebLinks: function(text_page: FPDF_TEXTPAGE): FPDF_PAGELINK; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDFLink_CountWebLinks
//          Count number of detected web links.
// Parameters:
//          link_page   -   Handle returned by FPDFLink_LoadWebLinks.
// Return Value:
//          Number of detected web links.
//
var
  FPDFLink_CountWebLinks: function(link_page: FPDF_PAGELINK): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDFLink_GetURL
//          Fetch the URL information for a detected web link.
// Parameters:
//          link_page   -   Handle returned by FPDFLink_LoadWebLinks.
//          link_index  -   Zero-based index for the link.
//          buffer      -   A unicode buffer for the result.
//          buflen      -   Number of 16-bit code units (not bytes) for the
//                          buffer, including an additional terminator.
// Return Value:
//          If |buffer| is NULL or |buflen| is zero, return the number of 16-bit
//          code units (not bytes) needed to buffer the result (an additional
//          terminator is included in this count).
//          Otherwise, copy the result into |buffer|, truncating at |buflen| if
//          the result is too large to fit, and return the number of 16-bit code
//          units actually copied into the buffer (the additional terminator is
//          also included in this count).
//          If |link_index| does not correspond to a valid link, then the result
//          is an empty string.
//
var
  FPDFLink_GetURL: function(link_page: FPDF_PAGELINK; link_index: Integer; buffer: PWideChar; buflen: Integer): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDFLink_CountRects
//          Count number of rectangular areas for the link.
// Parameters:
//          link_page   -   Handle returned by FPDFLink_LoadWebLinks.
//          link_index  -   Zero-based index for the link.
// Return Value:
//          Number of rectangular areas for the link.  If |link_index| does
//          not correspond to a valid link, then 0 is returned.
//
var
  FPDFLink_CountRects: function(link_page: FPDF_PAGELINK; link_index: Integer): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDFLink_GetRect
//          Fetch the boundaries of a rectangle for a link.
// Parameters:
//          link_page   -   Handle returned by FPDFLink_LoadWebLinks.
//          link_index  -   Zero-based index for the link.
//          rect_index  -   Zero-based index for a rectangle.
//          left        -   Pointer to a double value receiving the rectangle
//                          left boundary.
//          top         -   Pointer to a double value receiving the rectangle
//                          top boundary.
//          right       -   Pointer to a double value receiving the rectangle
//                          right boundary.
//          bottom      -   Pointer to a double value receiving the rectangle
//                          bottom boundary.
// Return Value:
//          On success, return TRUE and fill in |left|, |top|, |right|, and
//          |bottom|. If |link_page| is invalid or if |link_index| does not
//          correspond to a valid link, then return FALSE, and the out
//          parameters remain unmodified.
//
var
  FPDFLink_GetRect: procedure(link_page: FPDF_PAGELINK; link_index, rect_index: Integer;
    var left, top, right, bottom: Double); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDFLink_GetTextRange
//          Fetch the start char index and char count for a link.
// Parameters:
//          link_page         -   Handle returned by FPDFLink_LoadWebLinks.
//          link_index        -   Zero-based index for the link.
//          start_char_index  -   pointer to int receiving the start char index
//          char_count        -   pointer to int receiving the char count
// Return Value:
//          On success, return TRUE and fill in |start_char_index| and
//          |char_count|. if |link_page| is invalid or if |link_index| does
//          not correspond to a valid link, then return FALSE and the out
//          parameters remain unmodified.
//
var
  FPDFLink_GetTextRange: function(link_page: FPDF_PAGELINK; link_index: Integer;
    start_char_index, char_count: PInteger): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDFLink_CloseWebLinks
//          Release resources used by weblink feature.
// Parameters:
//          link_page   -   Handle returned by FPDFLink_LoadWebLinks.
// Return Value:
//          None.
//
var
  FPDFLink_CloseWebLinks: procedure(link_page: FPDF_PAGELINK); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};


// *** _FPDF_SEARCH_EX_H ***

// Get the character index in |text_page| internal character list.
//
//   text_page  - a text page information structure.
//   nTextIndex - index of the text returned from FPDFText_GetText().
//
// Returns the index of the character in internal character list. -1 for error.
var
  FPDFText_GetCharIndexFromTextIndex: function(text_page: FPDF_TEXTPAGE; nTextIndex: Integer): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};


// Get the text index in |text_page| internal character list.
//
//   text_page  - a text page information structure.
//   nCharIndex - index of the character in internal character list.
//
// Returns the index of the text returned from FPDFText_GetText(). -1 for error.
var
  FPDFText_GetTextIndexFromCharIndex: function(text_page: FPDF_TEXTPAGE; nCharIndex: Integer): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};


// *** _FPDF_PROGRESSIVE_H_ ***

const
  //Flags for progressive process status.
  FPDF_RENDER_READER         = 0;
  FPDF_RENDER_TOBECOUNTINUED = 1;
  FPDF_RENDER_DONE           = 2;
  FPDF_RENDER_FAILED         = 3;

// IFPDF_RENDERINFO interface.
type
  PIFSDK_PAUSE = ^IFSDK_PAUSE;
  IFSDK_PAUSE = record
    // Version number of the interface. Currently must be 1.
    version: Integer;

    // Method: NeedToPauseNow
    //           Check if we need to pause a progressive process now.
    // Interface Version:
    //           1
    // Implementation Required:
    //           yes
    // Parameters:
    //           pThis       -   Pointer to the interface structure itself
    // Return Value:
    //           Non-zero for pause now, 0 for continue.
    NeedToPauseNow: function(pThis: PIFSDK_PAUSE): FPDF_BOOL; cdecl;

    // A user defined data pointer, used by user's application. Can be NULL.
    user: Pointer;
  end;
  PIFSDKPause = ^TIFSDKPause;
  TIFSDKPause = IFSDK_PAUSE;

// Experimental API.
// Function: FPDF_RenderPageBitmapWithColorScheme_Start
//          Start to render page contents to a device independent bitmap
//          progressively with a specified color scheme for the content.
// Parameters:
//          bitmap       -   Handle to the device independent bitmap (as the
//                           output buffer). Bitmap handle can be created by
//                           FPDFBitmap_Create function.
//          page         -   Handle to the page as returned by FPDF_LoadPage
//                           function.
//          start_x      -   Left pixel position of the display area in the
//                           bitmap coordinate.
//          start_y      -   Top pixel position of the display area in the
//                           bitmap coordinate.
//          size_x       -   Horizontal size (in pixels) for displaying the
//                           page.
//          size_y       -   Vertical size (in pixels) for displaying the page.
//          rotate       -   Page orientation: 0 (normal), 1 (rotated 90
//                           degrees clockwise), 2 (rotated 180 degrees),
//                           3 (rotated 90 degrees counter-clockwise).
//          flags        -   0 for normal display, or combination of flags
//                           defined in fpdfview.h. With FPDF_ANNOT flag, it
//                           renders all annotations that does not require
//                           user-interaction, which are all annotations except
//                           widget and popup annotations.
//          color_scheme -   Color scheme to be used in rendering the |page|.
//                           If null, this function will work similar to
//                           FPDF_RenderPageBitmap_Start().
//          pause        -   The IFSDK_PAUSE interface. A callback mechanism
//                           allowing the page rendering process.
// Return value:
//          Rendering Status. See flags for progressive process status for the
//          details.
var
  FPDF_RenderPageBitmapWithColorScheme_Start: function(bitmap: FPDF_BITMAP; page: FPDF_PAGE;
    start_x, start_y, size_x, size_y: Integer; rotate: Integer; flags: Integer;
    const color_scheme: PFPDF_COLORSCHEME; pause: PIFSDK_PAUSE): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_RenderPageBitmap_Start
//          Start to render page contents to a device independent bitmap
//          progressively.
// Parameters:
//          bitmap      -   Handle to the device independent bitmap (as the
//                          output buffer). Bitmap handle can be created by
//                          FPDFBitmap_Create().
//          page        -   Handle to the page, as returned by FPDF_LoadPage().
//          start_x     -   Left pixel position of the display area in the
//                          bitmap coordinates.
//          start_y     -   Top pixel position of the display area in the bitmap
//                          coordinates.
//          size_x      -   Horizontal size (in pixels) for displaying the page.
//          size_y      -   Vertical size (in pixels) for displaying the page.
//          rotate      -   Page orientation: 0 (normal), 1 (rotated 90 degrees
//                          clockwise), 2 (rotated 180 degrees), 3 (rotated 90
//                          degrees counter-clockwise).
//          flags       -   0 for normal display, or combination of flags
//                          defined in fpdfview.h. With FPDF_ANNOT flag, it
//                          renders all annotations that does not require
//                          user-interaction, which are all annotations except
//                          widget and popup annotations.
//          pause       -   The IFSDK_PAUSE interface.A callback mechanism
//                          allowing the page rendering process
// Return value:
//          Rendering Status. See flags for progressive process status for the
//          details.
var
  FPDF_RenderPageBitmap_Start: function(bitmap: FPDF_BITMAP; page: FPDF_PAGE;
    start_x, start_y, size_x, size_y: Integer; rotate: Integer; flags: Integer;
    pause: PIFSDK_PAUSE): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_RenderPage_Continue
//          Continue rendering a PDF page.
// Parameters:
//          page        -   Handle to the page, as returned by FPDF_LoadPage().
//          pause       -   The IFSDK_PAUSE interface (a callback mechanism
//                          allowing the page rendering process to be paused
//                          before it's finished). This can be NULL if you
//                          don't want to pause.
// Return value:
//          The rendering status. See flags for progressive process status for
//          the details.
var
  FPDF_RenderPage_Continue: function(page: FPDF_PAGE; pause: PIFSDK_PAUSE): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_RenderPage_Close
//          Release the resource allocate during page rendering. Need to be
//          called after finishing rendering or
//          cancel the rendering.
// Parameters:
//          page        -   Handle to the page, as returned by FPDF_LoadPage().
// Return value:
//          None.
var
  FPDF_RenderPage_Close: procedure(page: FPDF_PAGE); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};


// *** _FPDF_SIGNATURE_H_ ***

// Experimental API.
// Function: FPDF_GetSignatureCount
//          Get total number of signatures in the document.
// Parameters:
//          document    -   Handle to document. Returned by FPDF_LoadDocument().
// Return value:
//          Total number of signatures in the document on success, -1 on error.
var
  FPDF_GetSignatureCount: function(document: FPDF_DOCUMENT): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDF_GetSignatureObject
//          Get the Nth signature of the document.
// Parameters:
//          document    -   Handle to document. Returned by FPDF_LoadDocument().
//          index       -   Index into the array of signatures of the document.
// Return value:
//          Returns the handle to the signature, or NULL on failure. The caller
//          does not take ownership of the returned FPDF_SIGNATURE. Instead, it
//          remains valid until FPDF_CloseDocument() is called for the document.
var
  FPDF_GetSignatureObject: function(document: FPDF_DOCUMENT; index: Integer): FPDF_SIGNATURE; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDFSignatureObj_GetContents
//          Get the contents of a signature object.
// Parameters:
//          signature   -   Handle to the signature object. Returned by
//                          FPDF_GetSignatureObject().
//          buffer      -   The address of a buffer that receives the contents.
//          length      -   The size, in bytes, of |buffer|.
// Return value:
//          Returns the number of bytes in the contents on success, 0 on error.
//
// For public-key signatures, |buffer| is either a DER-encoded PKCS#1 binary or
// a DER-encoded PKCS#7 binary. If |length| is less than the returned length, or
// |buffer| is NULL, |buffer| will not be modified.
var
  FPDFSignatureObj_GetContents: function(signature: FPDF_SIGNATURE; buffer: Pointer; length: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDFSignatureObj_GetByteRange
//          Get the byte range of a signature object.
// Parameters:
//          signature   -   Handle to the signature object. Returned by
//                          FPDF_GetSignatureObject().
//          buffer      -   The address of a buffer that receives the
//                          byte range.
//          length      -   The size, in ints, of |buffer|.
// Return value:
//          Returns the number of ints in the byte range on
//          success, 0 on error.
//
// |buffer| is an array of pairs of integers (starting byte offset,
// length in bytes) that describes the exact byte range for the digest
// calculation. If |length| is less than the returned length, or
// |buffer| is NULL, |buffer| will not be modified.
var
  FPDFSignatureObj_GetByteRange: function(signature: FPDF_SIGNATURE; buffer: PInteger; length: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDFSignatureObj_GetSubFilter
//          Get the encoding of the value of a signature object.
// Parameters:
//          signature   -   Handle to the signature object. Returned by
//                          FPDF_GetSignatureObject().
//          buffer      -   The address of a buffer that receives the encoding.
//          length      -   The size, in bytes, of |buffer|.
// Return value:
//          Returns the number of bytes in the encoding name (including the
//          trailing NUL character) on success, 0 on error.
//
// The |buffer| is always encoded in 7-bit ASCII. If |length| is less than the
// returned length, or |buffer| is NULL, |buffer| will not be modified.
var
  FPDFSignatureObj_GetSubFilter: function(signature: FPDF_SIGNATURE; buffer: PAnsiChar; length: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDFSignatureObj_GetReason
//          Get the reason (comment) of the signature object.
// Parameters:
//          signature   -   Handle to the signature object. Returned by
//                          FPDF_GetSignatureObject().
//          buffer      -   The address of a buffer that receives the reason.
//          length      -   The size, in bytes, of |buffer|.
// Return value:
//          Returns the number of bytes in the reason on success, 0 on error.
//
// Regardless of the platform, the |buffer| is always in UTF-16LE encoding. The
// string is terminated by a UTF16 NUL character. If |length| is less than the
// returned length, or |buffer| is NULL, |buffer| will not be modified.
var
  FPDFSignatureObj_GetReason: function(signature: FPDF_SIGNATURE; buffer: Pointer; length: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDFSignatureObj_GetTime
//          Get the time of signing of a signature object.
// Parameters:
//          signature   -   Handle to the signature object. Returned by
//                          FPDF_GetSignatureObject().
//          buffer      -   The address of a buffer that receives the time.
//          length      -   The size, in bytes, of |buffer|.
// Return value:
//          Returns the number of bytes in the encoding name (including the
//          trailing NUL character) on success, 0 on error.
//
// The |buffer| is always encoded in 7-bit ASCII. If |length| is less than the
// returned length, or |buffer| is NULL, |buffer| will not be modified.
//
// The format of time is expected to be D:YYYYMMDDHHMMSS+XX'YY', i.e. it's
// percision is seconds, with timezone information. This value should be used
// only when the time of signing is not available in the (PKCS#7 binary)
// signature.
var
  FPDFSignatureObj_GetTime: function(signature: FPDF_SIGNATURE; buffer: PAnsiChar; length: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDFSignatureObj_GetDocMDPPermission
//          Get the DocMDP permission of a signature object.
// Parameters:
//          signature   -   Handle to the signature object. Returned by
//                          FPDF_GetSignatureObject().
// Return value:
//          Returns the permission (1, 2 or 3) on success, 0 on error.
var
  FPDFSignatureObj_GetDocMDPPermission: function(signature: FPDF_SIGNATURE): UInt32; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// *** _FPDF_DOC_H_ ***

const
  PDFACTION_UNSUPPORTED  = 0;    // Unsupported action type.
  PDFACTION_GOTO         = 1;    // Go to a destination within current document.
  PDFACTION_REMOTEGOTO   = 2;    // Go to a destination within another document.
  PDFACTION_URI          = 3;    // Universal Resource Identifier, including web pages and
                                 // other Internet based resources.
  PDFACTION_LAUNCH       = 4;    // Launch an application or open a file.
  PDFACTION_EMBEDDEDGOTO = 5;    // Go to a destination in an embedded file.

// View destination fit types. See pdfmark reference v9, page 48.
  PDFDEST_VIEW_UNKNOWN_MODE = 0;
  PDFDEST_VIEW_XYZ = 1;
  PDFDEST_VIEW_FIT = 2;
  PDFDEST_VIEW_FITH = 3;
  PDFDEST_VIEW_FITV = 4;
  PDFDEST_VIEW_FITR = 5;
  PDFDEST_VIEW_FITB = 6;
  PDFDEST_VIEW_FITBH = 7;
  PDFDEST_VIEW_FITBV = 8;

// The file identifier entry type. See section 14.4 "File Identifiers" of the
// ISO 32000-1:2008 spec.
type
  FPDF_FILEIDTYPE = (
    FILEIDTYPE_PERMANENT = 0,
    FILEIDTYPE_CHANGING = 1
  );

// Get the first child of |bookmark|, or the first top-level bookmark item.
//
//   document - handle to the document.
//   bookmark - handle to the current bookmark. Pass NULL for the first top
//              level item.
//
// Returns a handle to the first child of |bookmark| or the first top-level
// bookmark item. NULL if no child or top-level bookmark found.
// Note that another name for the bookmarks is the document outline, as
// described in ISO 32000-1:2008, section 12.3.3.
var
  FPDFBookmark_GetFirstChild: function(document: FPDF_DOCUMENT; bookmark: FPDF_BOOKMARK): FPDF_BOOKMARK; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get the next sibling of |bookmark|.
//
//   document - handle to the document.
//   bookmark - handle to the current bookmark.
//
// Returns a handle to the next sibling of |bookmark|, or NULL if this is the
// last bookmark at this level.
//
// Note that the caller is responsible for handling circular bookmark
// references, as may arise from malformed documents.
var
  FPDFBookmark_GetNextSibling: function(document: FPDF_DOCUMENT; bookmark: FPDF_BOOKMARK): FPDF_BOOKMARK; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get the title of |bookmark|.
//
//   bookmark - handle to the bookmark.
//   buffer   - buffer for the title. May be NULL.
//   buflen   - the length of the buffer in bytes. May be 0.
//
// Returns the number of bytes in the title, including the terminating NUL
// character. The number of bytes is returned regardless of the |buffer| and
// |buflen| parameters.
//
// Regardless of the platform, the |buffer| is always in UTF-16LE encoding. The
// string is terminated by a UTF16 NUL character. If |buflen| is less than the
// required length, or |buffer| is NULL, |buffer| will not be modified.
var
  FPDFBookmark_GetTitle: function(bookmark: FPDF_BOOKMARK; buffer: Pointer; buflen: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the number of chlidren of |bookmark|.
//
//   bookmark - handle to the bookmark.
//
// Returns a signed integer that represents the number of sub-items the given
// bookmark has. If the value is positive, child items shall be shown by default
// (open state). If the value is negative, child items shall be hidden by
// default (closed state). Please refer to PDF 32000-1:2008, Table 153.
// Returns 0 if the bookmark has no children or is invalid.
var
  FPDFBookmark_GetCount: function(bookmark: FPDF_BOOKMARK): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Find the bookmark with |title| in |document|.
//
//   document - handle to the document.
//   title    - the UTF-16LE encoded Unicode title for which to search.
//
// Returns the handle to the bookmark, or NULL if |title| can't be found.
//
// FPDFBookmark_Find() will always return the first bookmark found even if
// multiple bookmarks have the same |title|.
var
  FPDFBookmark_Find: function(document: FPDF_DOCUMENT; title: FPDF_WIDESTRING): FPDF_BOOKMARK; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get the destination associated with |bookmark|.
//
//   document - handle to the document.
//   bookmark - handle to the bookmark.
//
// Returns the handle to the destination data, or NULL if no destination is
// associated with |bookmark|.
var
  FPDFBookmark_GetDest: function(document: FPDF_DOCUMENT; bookmark: FPDF_BOOKMARK): FPDF_DEST; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get the action associated with |bookmark|.
//
//   bookmark - handle to the bookmark.
//
// Returns the handle to the action data, or NULL if no action is associated
// with |bookmark|.
// If this function returns a valid handle, it is valid as long as |bookmark| is
// valid.
// If this function returns NULL, FPDFBookmark_GetDest() should be called to get
// the |bookmark| destination data.
var
  FPDFBookmark_GetAction: function(bookmark: FPDF_BOOKMARK): FPDF_ACTION; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get the type of |action|.
//
//   action - handle to the action.
//
// Returns one of:
//   PDFACTION_UNSUPPORTED
//   PDFACTION_GOTO
//   PDFACTION_REMOTEGOTO
//   PDFACTION_URI
//   PDFACTION_LAUNCH
var
  FPDFAction_GetType: function(action: FPDF_ACTION): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get the destination of |action|.
//
//   document - handle to the document.
//   action   - handle to the action. |action| must be a |PDFACTION_GOTO| or
//              |PDFACTION_REMOTEGOTO|.
//
// Returns a handle to the destination data, or NULL on error, typically
// because the arguments were bad or the action was of the wrong type.
//
// In the case of |PDFACTION_REMOTEGOTO|, you must first call
// FPDFAction_GetFilePath(), then load the document at that path, then pass
// the document handle from that document as |document| to FPDFAction_GetDest().
var
  FPDFAction_GetDest: function(document: FPDF_DOCUMENT; action: FPDF_ACTION): FPDF_DEST; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get the file path of |action|.
//
//   action - handle to the action. |action| must be a |PDFACTION_LAUNCH| or
//            |PDFACTION_REMOTEGOTO|.
//   buffer - a buffer for output the path string. May be NULL.
//   buflen - the length of the buffer, in bytes. May be 0.
//
// Returns the number of bytes in the file path, including the trailing NUL
// character, or 0 on error, typically because the arguments were bad or the
// action was of the wrong type.
//
// Regardless of the platform, the |buffer| is always in UTF-8 encoding.
// If |buflen| is less than the returned length, or |buffer| is NULL, |buffer|
// will not be modified.
var
  FPDFAction_GetFilePath: function(action: FPDF_ACTION; buffer: Pointer; buflen: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get the URI path of |action|.
//
//   document - handle to the document.
//   action   - handle to the action. Must be a |PDFACTION_URI|.
//   buffer   - a buffer for the path string. May be NULL.
//   buflen   - the length of the buffer, in bytes. May be 0.
//
// Returns the number of bytes in the URI path, including the trailing NUL
// character, or 0 on error, typically because the arguments were bad or the
// action was of the wrong type.
//
// The |buffer| may contain badly encoded data. The caller should validate the
// output. e.g. Check to see if it is UTF-8.
//
// If |buflen| is less than the returned length, or |buffer| is NULL, |buffer|
// will not be modified.
//
// Historically, the documentation for this API claimed |buffer| is always
// encoded in 7-bit ASCII, but did not actually enforce it.
// https://pdfium.googlesource.com/pdfium.git/+/d609e84cee2e14a18333247485af91df48a40592
// added that enforcement, but that did not work well for real world PDFs that
// used UTF-8. As of this writing, this API reverted back to its original
// behavior prior to commit d609e84cee.
var
  FPDFAction_GetURIPath: function(document: FPDF_DOCUMENT; action: FPDF_ACTION; buffer: Pointer; buflen: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get the page index of |dest|.
//
//   document - handle to the document.
//   dest     - handle to the destination.
//
// Returns the 0-based page index containing |dest|. Returns -1 on error.
var
  FPDFDest_GetDestPageIndex: function(document: FPDF_DOCUMENT; dest: FPDF_DEST): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the view (fit type) specified by |dest|.
//
//   dest         - handle to the destination.
//   pNumParams   - receives the number of view parameters, which is at most 4.
//   pParams      - buffer to write the view parameters. Must be at least 4
//                  FS_FLOATs long.
// Returns one of the PDFDEST_VIEW_* constants, PDFDEST_VIEW_UNKNOWN_MODE if
// |dest| does not specify a view.
var
  FPDFDest_GetView: function(dest: FPDF_DEST; pNumParams: PLongWord; pParams: PFS_FLOAT): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get the (x, y, zoom) location of |dest| in the destination page, if the
// destination is in [page /XYZ x y zoom] syntax.
//
//   dest       - handle to the destination.
//   hasXVal    - out parameter; true if the x value is not null
//   hasYVal    - out parameter; true if the y value is not null
//   hasZoomVal - out parameter; true if the zoom value is not null
//   x          - out parameter; the x coordinate, in page coordinates.
//   y          - out parameter; the y coordinate, in page coordinates.
//   zoom       - out parameter; the zoom value.
// Returns TRUE on successfully reading the /XYZ value.
//
// Note the [x, y, zoom] values are only set if the corresponding hasXVal,
// hasYVal or hasZoomVal flags are true.
var
  FPDFDest_GetLocationInPage: function(dest: FPDF_DEST; var hasXVal, hasYVal, hasZoomVal: FPDF_BOOL;
    var x, y, zoom: FS_FLOAT): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Find a link at point (|x|,|y|) on |page|.
//
//   page - handle to the document page.
//   x    - the x coordinate, in the page coordinate system.
//   y    - the y coordinate, in the page coordinate system.
//
// Returns a handle to the link, or NULL if no link found at the given point.
//
// You can convert coordinates from screen coordinates to page coordinates using
// FPDF_DeviceToPage().
var
  FPDFLink_GetLinkAtPoint: function(page: FPDF_PAGE; x, y: Double): FPDF_LINK; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Find the Z-order of link at point (|x|,|y|) on |page|.
//
//   page - handle to the document page.
//   x    - the x coordinate, in the page coordinate system.
//   y    - the y coordinate, in the page coordinate system.
//
// Returns the Z-order of the link, or -1 if no link found at the given point.
// Larger Z-order numbers are closer to the front.
//
// You can convert coordinates from screen coordinates to page coordinates using
// FPDF_DeviceToPage().
var
  FPDFLink_GetLinkZOrderAtPoint: function(page: FPDF_PAGE; x, y: Double): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get destination info for |link|.
//
//   document - handle to the document.
//   link     - handle to the link.
//
// Returns a handle to the destination, or NULL if there is no destination
// associated with the link. In this case, you should call FPDFLink_GetAction()
// to retrieve the action associated with |link|.
var
  FPDFLink_GetDest: function(document: FPDF_DOCUMENT; link: FPDF_LINK): FPDF_DEST; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get action info for |link|.
//
//   link - handle to the link.
//
// Returns a handle to the action associated to |link|, or NULL if no action.
// If this function returns a valid handle, it is valid as long as |link| is
// valid.
var
  FPDFLink_GetAction: function(link: FPDF_LINK): FPDF_ACTION; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Enumerates all the link annotations in |page|.
//
//   page       - handle to the page.
//   start_pos  - the start position, should initially be 0 and is updated with
//                the next start position on return.
//   link_annot - the link handle for |startPos|.
//
// Returns TRUE on success.
var
  FPDFLink_Enumerate: function(page: FPDF_PAGE; var start_pos: Integer; link_annot: PFPDF_LINK): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Gets FPDF_ANNOTATION object for |link_annot|.
//
//   page       - handle to the page in which FPDF_LINK object is present.
//   link_annot - handle to link annotation.
//
// Returns FPDF_ANNOTATION from the FPDF_LINK and NULL on failure,
// if the input link annot or page is NULL.
var
  FPDFLink_GetAnnot: function(page: FPDF_PAGE; link_annot: FPDF_LINK): FPDF_ANNOTATION; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get the rectangle for |link_annot|.
//
//   link_annot - handle to the link annotation.
//   rect       - the annotation rectangle.
//
// Returns true on success.
var
  FPDFLink_GetAnnotRect: function(link_annot: FPDF_LINK; rect: PFS_RECTF): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get the count of quadrilateral points to the |link_annot|.
//
//   link_annot - handle to the link annotation.
//
// Returns the count of quadrilateral points.
var
  FPDFLink_CountQuadPoints: function(link_annot: FPDF_LINK): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get the quadrilateral points for the specified |quad_index| in |link_annot|.
//
//   link_annot  - handle to the link annotation.
//   quad_index  - the specified quad point index.
//   quad_points - receives the quadrilateral points.
//
// Returns true on success.
var
  FPDFLink_GetQuadPoints: function(link_annot: FPDF_LINK; quad_index: Integer; quad_points: PFS_QUADPOINTSF): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Gets an additional-action from |page|.
//
//   page      - handle to the page, as returned by FPDF_LoadPage().
//   aa_type   - the type of the page object's addtional-action, defined
//               in public/fpdf_formfill.h
//
//   Returns the handle to the action data, or NULL if there is no
//   additional-action of type |aa_type|.
//   If this function returns a valid handle, it is valid as long as |page| is
//   valid.
var
  FPDF_GetPageAAction: function(page: FPDF_PAGE; aa_type: Integer): FPDF_ACTION; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the file identifer defined in the trailer of |document|.
//
//   document - handle to the document.
//   id_type  - the file identifier type to retrieve.
//   buffer   - a buffer for the file identifier. May be NULL.
//   buflen   - the length of the buffer, in bytes. May be 0.
//
// Returns the number of bytes in the file identifier, including the NUL
// terminator.
//
// The |buffer| is always a byte string. The |buffer| is followed by a NUL
// terminator.  If |buflen| is less than the returned length, or |buffer| is
// NULL, |buffer| will not be modified.
var
  FPDF_GetFileIdentifier: function(document: FPDF_DOCUMENT; id_type: FPDF_FILEIDTYPE; buffer: Pointer;
    buflen: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get meta-data |tag| content from |document|.
//
//   document - handle to the document.
//   tag      - the tag to retrieve. The tag can be one of:
//                Title, Author, Subject, Keywords, Creator, Producer,
//                CreationDate, or ModDate.
//              For detailed explanations of these tags and their respective
//              values, please refer to PDF Reference 1.6, section 10.2.1,
//              'Document Information Dictionary'.
//   buffer   - a buffer for the tag. May be NULL.
//   buflen   - the length of the buffer, in bytes. May be 0.
//
// Returns the number of bytes in the tag, including trailing zeros.
//
// The |buffer| is always encoded in UTF-16LE. The |buffer| is followed by two
// bytes of zeros indicating the end of the string.  If |buflen| is less than
// the returned length, or |buffer| is NULL, |buffer| will not be modified.
//
// For linearized files, FPDFAvail_IsFormAvail must be called before this, and
// it must have returned PDF_FORM_AVAIL or PDF_FORM_NOTEXIST. Before that, there
// is no guarantee the metadata has been loaded.
var
  FPDF_GetMetaText: function(doc: FPDF_DOCUMENT; tag: FPDF_BYTESTRING; buffer: Pointer; buflen: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get the page label for |page_index| from |document|.
//
//   document    - handle to the document.
//   page_index  - the 0-based index of the page.
//   buffer      - a buffer for the page label. May be NULL.
//   buflen      - the length of the buffer, in bytes. May be 0.
//
// Returns the number of bytes in the page label, including trailing zeros.
//
// The |buffer| is always encoded in UTF-16LE. The |buffer| is followed by two
// bytes of zeros indicating the end of the string.  If |buflen| is less than
// the returned length, or |buffer| is NULL, |buffer| will not be modified.
var
  FPDF_GetPageLabel: function(document: FPDF_DOCUMENT; page_index: integer; buffer: Pointer; buflen: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};


// *** _FPDF_SYSFONTINFO_H_ ***

const
  // Character sets for the font
  FXFONT_ANSI_CHARSET            = 0;
  FXFONT_DEFAULT_CHARSET         = 1;
  FXFONT_SYMBOL_CHARSET          = 2;
  FXFONT_SHIFTJIS_CHARSET        = 128;
  FXFONT_HANGEUL_CHARSET         = 129;
  FXFONT_GB2312_CHARSET          = 134;
  FXFONT_CHINESEBIG5_CHARSET     = 136;
  FXFONT_GREEK_CHARSET           = 161;
  FXFONT_VIETNAMESE_CHARSET      = 163;
  FXFONT_HEBREW_CHARSET          = 177;
  FXFONT_ARABIC_CHARSET          = 178;
  FXFONT_CYRILLIC_CHARSET        = 204;
  FXFONT_THAI_CHARSET            = 222;
  FXFONT_EASTERNEUROPEAN_CHARSET = 238;


  // Font pitch and family flags
  FXFONT_FF_FIXEDPITCH = 1;
  FXFONT_FF_ROMAN      = 1 shl 4;
  FXFONT_FF_SCRIPT     = 4 shl 4;

  // Typical weight values
  FXFONT_FW_NORMAL = 400;
  FXFONT_FW_BOLD   = 700;

// Interface: FPDF_SYSFONTINFO
//          Interface for getting system font information and font mapping
type
  PFPDF_SYSFONTINFO = ^FPDF_SYSFONTINFO;
  FPDF_SYSFONTINFO = record
    // Version number of the interface. Currently must be 1.
    version: Integer;

    // Method: Release
    //          Give implementation a chance to release any data after the
    //          interface is no longer used.
    // Interface Version:
    //          1
    // Implementation Required:
    //          No
    // Parameters:
    //          pThis       -   Pointer to the interface structure itself
    // Return Value:
    //          None
    // Comments:
    //          Called by PDFium during the final cleanup process.
    Release: procedure(pThis: PFPDF_SYSFONTINFO); cdecl;

    // Method: EnumFonts
    //          Enumerate all fonts installed on the system
    // Interface Version:
    //          1
    // Implementation Required:
    //          No
    // Parameters:
    //          pThis       -   Pointer to the interface structure itself
    //          pMapper     -   An opaque pointer to internal font mapper, used
    //                          when calling FPDF_AddInstalledFont().
    // Return Value:
    //          None
    // Comments:
    //          Implementations should call FPDF_AddInstalledFont() function for
    //          each font found. Only TrueType/OpenType and Type1 fonts are
    //          accepted by PDFium.
    EnumFonts: procedure(pThis: PFPDF_SYSFONTINFO; pMapper: Pointer); cdecl;

    // Method: MapFont
    //          Use the system font mapper to get a font handle from requested
    //          parameters.
    // Interface Version:
    //          1
    // Implementation Required:
    //          Required if GetFont method is not implemented.
    // Parameters:
    //          pThis       -   Pointer to the interface structure itself
    //          weight      -   Weight of the requested font. 400 is normal and
    //                          700 is bold.
    //          bItalic     -   Italic option of the requested font, TRUE or
    //                          FALSE.
    //          charset     -   Character set identifier for the requested font.
    //                          See above defined constants.
    //          pitch_family -  A combination of flags. See above defined
    //                          constants.
    //          face        -   Typeface name. Currently use system local encoding
    //                          only.
    //          bExact      -   Obsolete: this parameter is now ignored.
    // Return Value:
    //          An opaque pointer for font handle, or NULL if system mapping is
    //          not supported.
    // Comments:
    //          If the system supports native font mapper (like Windows),
    //          implementation can implement this method to get a font handle.
    //          Otherwise, PDFium will do the mapping and then call GetFont
    //          method. Only TrueType/OpenType and Type1 fonts are accepted
    //          by PDFium.
    MapFont: function(pThis: PFPDF_SYSFONTINFO; weight, bItalic, charset, pitch_family: Integer;
      face: PAnsiChar; bExact: PInteger): Pointer; cdecl;

    // Method: GetFont
    //          Get a handle to a particular font by its internal ID
    // Interface Version:
    //          1
    // Implementation Required:
    //          Required if MapFont method is not implemented.
    // Return Value:
    //          An opaque pointer for font handle.
    // Parameters:
    //          pThis       -   Pointer to the interface structure itself
    //          face        -   Typeface name in system local encoding.
    // Comments:
    //          If the system mapping not supported, PDFium will do the font
    //          mapping and use this method to get a font handle.
    GetFont: function(pThis: PFPDF_SYSFONTINFO; face: PAnsiChar): Pointer; cdecl;

    // Method: GetFontData
    //          Get font data from a font
    // Interface Version:
    //          1
    // Implementation Required:
    //          Yes
    // Parameters:
    //          pThis       -   Pointer to the interface structure itself
    //          hFont       -   Font handle returned by MapFont or GetFont method
    //          table       -   TrueType/OpenType table identifier (refer to
    //                          TrueType specification), or 0 for the whole file.
    //          buffer      -   The buffer receiving the font data. Can be NULL if
    //                          not provided.
    //          buf_size    -   Buffer size, can be zero if not provided.
    // Return Value:
    //          Number of bytes needed, if buffer not provided or not large
    //          enough, or number of bytes written into buffer otherwise.
    // Comments:
    //          Can read either the full font file, or a particular
    //          TrueType/OpenType table.
    GetFontData: function(pThis: PFPDF_SYSFONTINFO; hFont: Pointer; table: LongWord; buffer: PWideChar;
      buf_size: LongWord): LongWord; cdecl;

    // Method: GetFaceName
    //          Get face name from a font handle
    // Interface Version:
    //          1
    // Implementation Required:
    //          No
    // Parameters:
    //          pThis       -   Pointer to the interface structure itself
    //          hFont       -   Font handle returned by MapFont or GetFont method
    //          buffer      -   The buffer receiving the face name. Can be NULL if
    //                          not provided
    //          buf_size    -   Buffer size, can be zero if not provided
    // Return Value:
    //          Number of bytes needed, if buffer not provided or not large
    //          enough, or number of bytes written into buffer otherwise.
    GetFaceName: function(pThis: PFPDF_SYSFONTINFO; hFont: Pointer; buffer: PAnsiChar; buf_size: LongWord): LongWord; cdecl;

    // Method: GetFontCharset
    //          Get character set information for a font handle
    // Interface Version:
    //          1
    // Implementation Required:
    //          No
    // Parameters:
    //          pThis       -   Pointer to the interface structure itself
    //          hFont       -   Font handle returned by MapFont or GetFont method
    // Return Value:
    //          Character set identifier. See defined constants above.
    GetFontCharset: function(pThis: PFPDF_SYSFONTINFO; hFont: Pointer): Integer; cdecl;

    // Method: DeleteFont
    //          Delete a font handle
    // Interface Version:
    //          1
    // Implementation Required:
    //          Yes
    // Parameters:
    //          pThis       -   Pointer to the interface structure itself
    //          hFont       -   Font handle returned by MapFont or GetFont method
    // Return Value:
    //          None
    DeleteFont: procedure(pThis: PFPDF_SYSFONTINFO; hFont: Pointer); cdecl;
  end;
  PFPdfSysFontInfo = ^TFPdfSysFontInfo;
  TFPdfSysFontInfo = FPDF_SYSFONTINFO;

  // Struct: FPDF_CharsetFontMap
  //    Provides the name of a font to use for a given charset value.
  PFPDF_CharsetFontMap = ^FPDF_CharsetFontMap;
  FPDF_CharsetFontMap = record
    charset: Integer;     // Character Set Enum value, see FXFONT_*_CHARSET above.
    fontname: PAnsiChar;  // Name of default font to use with that charset.
  end;
  PFPdfCharsetFontMap = ^TFPdfCharsetFontMap;
  TFPdfCharsetFontMap = FPDF_CharsetFontMap;

// Function: FPDF_GetDefaultTTFMap
//    Returns a pointer to the default character set to TT Font name map. The
//    map is an array of FPDF_CharsetFontMap structs, with its end indicated
//    by a { -1, NULL } entry.
// Parameters:
//     None.
// Return Value:
//     Pointer to the Charset Font Map.
// Note:
//     Once FPDF_GetDefaultTTFMapCount() and FPDF_GetDefaultTTFMapEntry() are no
//     longer experimental, this API will be marked as deprecated.
//     See https://crbug.com/348468114
var
  FPDF_GetDefaultTTFMap: function: PFPDF_CharsetFontMap; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
//
// Function: FPDF_GetDefaultTTFMapCount
//    Returns the number of entries in the default character set to TT Font name
//    map.
// Parameters:
//    None.
// Return Value:
//    The number of entries in the map.
var
  FPDF_GetDefaultTTFMapCount: function(): SIZE_T; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
//
// Function: FPDF_GetDefaultTTFMapEntry
//    Returns an entry in the default character set to TT Font name map.
// Parameters:
//    index    -   The index to the entry in the map to retrieve.
// Return Value:
//     A pointer to the entry, if it is in the map, or NULL if the index is out
//     of bounds.
var
  FPDF_GetDefaultTTFMapEntry: function(index: SIZE_T): PFPDF_CharsetFontMap; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_AddInstalledFont
//          Add a system font to the list in PDFium.
// Comments:
//          This function is only called during the system font list building
//          process.
// Parameters:
//          mapper          -   Opaque pointer to Foxit font mapper
//          face            -   The font face name
//          charset         -   Font character set. See above defined constants.
// Return Value:
//          None.
var
  FPDF_AddInstalledFont: procedure(mapper: Pointer; face: PAnsiChar; charset: Integer); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_SetSystemFontInfo
//          Set the system font info interface into PDFium
// Parameters:
//          pFontInfo       -   Pointer to a FPDF_SYSFONTINFO structure
// Return Value:
//          None
// Comments:
//          Platform support implementation should implement required methods of
//          FFDF_SYSFONTINFO interface, then call this function during PDFium
//          initialization process.
//
//          Call this with NULL to tell PDFium to stop using a previously set
//          |FPDF_SYSFONTINFO|.
var
  FPDF_SetSystemFontInfo: procedure(pFontInfo: PFPDF_SYSFONTINFO); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_GetDefaultSystemFontInfo
//          Get default system font info interface for current platform
// Parameters:
//          None
// Return Value:
//          Pointer to a FPDF_SYSFONTINFO structure describing the default
//          interface, or NULL if the platform doesn't have a default interface.
//          Application should call FPDF_FreeDefaultSystemFontInfo to free the
//          returned pointer.
// Comments:
//          For some platforms, PDFium implements a default version of system
//          font info interface. The default implementation can be passed to
//          FPDF_SetSystemFontInfo().
var
  FPDF_GetDefaultSystemFontInfo: function(): FPDF_SYSFONTINFO; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_FreeDefaultSystemFontInfo
//           Free a default system font info interface
// Parameters:
//           pFontInfo       -   Pointer to a FPDF_SYSFONTINFO structure
// Return Value:
//           None
// Comments:
//           This function should be called on the output from
//           FPDF_GetDefaultSystemFontInfo() once it is no longer needed.
var
  FPDF_FreeDefaultSystemFontInfo: procedure(pFontInfo: PFPDF_SYSFONTINFO); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};


// *** _FPDF_EXT_H_ ***

const
  //flags for type of unsupport object.
  FPDF_UNSP_DOC_XFAFORM               = 1;  // Unsupported XFA form.
  FPDF_UNSP_DOC_PORTABLECOLLECTION    = 2;  // Unsupported portable collection.
  FPDF_UNSP_DOC_ATTACHMENT            = 3;  // Unsupported attachment.
  FPDF_UNSP_DOC_SECURITY              = 4;  // Unsupported security.
  FPDF_UNSP_DOC_SHAREDREVIEW          = 5;  // Unsupported shared review.
  FPDF_UNSP_DOC_SHAREDFORM_ACROBAT    = 6;  // Unsupported shared form, acrobat.
  FPDF_UNSP_DOC_SHAREDFORM_FILESYSTEM = 7;  // Unsupported shared form, filesystem.
  FPDF_UNSP_DOC_SHAREDFORM_EMAIL      = 8;  // Unsupported shared form, email.
  FPDF_UNSP_ANNOT_3DANNOT             = 11; // Unsupported 3D annotation.
  FPDF_UNSP_ANNOT_MOVIE               = 12; // Unsupported movie annotation.
  FPDF_UNSP_ANNOT_SOUND               = 13; // Unsupported sound annotation.
  FPDF_UNSP_ANNOT_SCREEN_MEDIA        = 14; // Unsupported screen media annotation.
  FPDF_UNSP_ANNOT_SCREEN_RICHMEDIA    = 15; // Unsupported screen rich media annotation.
  FPDF_UNSP_ANNOT_ATTACHMENT          = 16; // Unsupported attachment annotation.
  FPDF_UNSP_ANNOT_SIG                 = 17; // Unsupported signature annotation.

type
  PUNSUPPORT_INFO = ^UNSUPPORT_INFO;
  UNSUPPORT_INFO = record
    // Version number of the interface. Must be 1.
    version: Integer;

    // Unsupported object notification function.
    // Interface Version: 1
    // Implementation Required: Yes
    //
    //   pThis - pointer to the interface structure.
    //   nType - the type of unsupported object. One of the |FPDF_UNSP_*| entries.
    FSDK_UnSupport_Handler: procedure(pThis: PUNSUPPORT_INFO; nType: Integer); cdecl;
  end;
  PUnsupportInfo = ^TUnsupportInfo;
  TUnsupportInfo = UNSUPPORT_INFO;

// Setup an unsupported object handler.
//
//   unsp_info - Pointer to an UNSUPPORT_INFO structure.
//
// Returns TRUE on success.
var
  FSDK_SetUnSpObjProcessHandler: function(unsp_info: PUNSUPPORT_INFO): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Set replacement function for calls to time().
//
// This API is intended to be used only for testing, thus may cause PDFium to
// behave poorly in production environments.
//
//   func - Function pointer to alternate implementation of time(), or
//          NULL to restore to actual time() call itself.
type
  TFPDFTimeFunction = function: TIME_T; cdecl;
var
  FSDK_SetTimeFunction: procedure(func: TFPDFTimeFunction); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Set replacement function for calls to localtime().
//
// This API is intended to be used only for testing, thus may cause PDFium to
// behave poorly in production environments.
//
//   func - Function pointer to alternate implementation of localtime(), or
//          NULL to restore to actual localtime() call itself.
type
  PFPDF_struct_tm = ^FPDF_struct_tm;
  FPDF_struct_tm = record
    tm_sec: Integer;
    tm_min: Integer;
    tm_hour: Integer;
    tm_mday: Integer;
    tm_mon: Integer;
    tm_year: Integer;
    tm_wday: Integer;
    tm_yday: Integer;
    tm_isdst: Integer;
  end;

type
  TFPDFLocaltimeFunction = function(timer: PTIME_T): PFPDF_struct_tm; cdecl;
var
  FSDK_SetLocaltimeFunction: procedure(func: TFPDFLocaltimeFunction); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

const
  PAGEMODE_UNKNOWN        = -1; // Unknown page mode.
  PAGEMODE_USENONE        = 0;  // Document outline, and thumbnails hidden.
  PAGEMODE_USEOUTLINES    = 1;  // Document outline visible.
  PAGEMODE_USETHUMBS      = 2;  // Thumbnail images visible.
  PAGEMODE_FULLSCREEN     = 3;  // Full-screen mode, no menu bar, window controls, or other decorations visible.
  PAGEMODE_USEOC          = 4;  // Optional content group panel visible.
  PAGEMODE_USEATTACHMENTS = 5;  // Attachments panel visible.

// Get the document's PageMode.
//
//   doc - Handle to document.
//
// Returns one of the |PAGEMODE_*| flags defined above.
//
// The page mode defines how the document should be initially displayed.
var
  FPDFDoc_GetPageMode: function(document: FPDF_DOCUMENT): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};


// *** _FPDF_DATAAVAIL_H_ ***

const
  PDF_LINEARIZATION_UNKNOWN = -1;
  PDF_NOT_LINEARIZED = 0;
  PDF_LINEARIZED = 1;

  PDF_DATA_ERROR = -1;
  PDF_DATA_NOTAVAIL = 0;
  PDF_DATA_AVAIL = 1;

  PDF_FORM_ERROR = -1;
  PDF_FORM_NOTAVAIL = 0;
  PDF_FORM_AVAIL = 1;
  PDF_FORM_NOTEXIST = 2;

type
  // Interface for checking whether sections of the file are available.
  PFX_FILEAVAIL = ^FX_FILEAVAIL;
  FX_FILEAVAIL = record
    // Version number of the interface. Must be 1.
    version: Integer;

    // Reports if the specified data section is currently available. A section is
    // available if all bytes in the section are available.
    //
    // Interface Version: 1
    // Implementation Required: Yes
    //
    //   pThis  - pointer to the interface structure.
    //   offset - the offset of the data section in the file.
    //   size   - the size of the data section.
    //
    // Returns true if the specified data section at |offset| of |size|
    // is available.
    IsDataAvail: function(pThis: PFX_FILEAVAIL; offset, size: SIZE_T): FPDF_BOOL; cdecl;
  end;
  PFXFileAvail = ^TFXFileAvail;
  TFXFileAvail = FX_FILEAVAIL;

// Create a document availability provider.
//
//   file_avail - pointer to file availability interface.
//   file       - pointer to a file access interface.
//
// Returns a handle to the document availability provider, or NULL on error.
//
// FPDFAvail_Destroy() must be called when done with the availability provider.
var
  FPDFAvail_Create: function(file_avail: PFX_FILEAVAIL; file_: PFPDF_FILEACCESS): FPDF_AVAIL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Destroy the |avail| document availability provider.
//
//   avail - handle to document availability provider to be destroyed.
var
  FPDFAvail_Destroy: procedure(avail: FPDF_AVAIL); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Download hints interface. Used to receive hints for further downloading.
type
  PFX_DOWNLOADHINTS = ^FX_DOWNLOADHINTS;
  FX_DOWNLOADHINTS = record
    // Version number of the interface. Must be 1.
    version: Integer;

    // Add a section to be downloaded.
    //
    // Interface Version: 1
    // Implementation Required: Yes
    //
    //   pThis  - pointer to the interface structure.
    //   offset - the offset of the hint reported to be downloaded.
    //   size   - the size of the hint reported to be downloaded.
    //
    // The |offset| and |size| of the section may not be unique. Part of the
    // section might be already available. The download manager must deal with
    // overlapping sections.
    AddSegment: procedure(pThis: PFX_DOWNLOADHINTS; offset, size: SIZE_T); cdecl;
  end;
  PFXDownloadHints = ^TFXDownloadHints;
  TFXDownloadHints = FX_DOWNLOADHINTS;

// Checks if the document is ready for loading, if not, gets download hints.
//
//   avail - handle to document availability provider.
//   hints - pointer to a download hints interface.
//
// Returns one of:
//   PDF_DATA_ERROR: A common error is returned. Data availability unknown.
//   PDF_DATA_NOTAVAIL: Data not yet available.
//   PDF_DATA_AVAIL: Data available.
//
// Applications should call this function whenever new data arrives, and process
// all the generated download hints, if any, until the function returns
// |PDF_DATA_ERROR| or |PDF_DATA_AVAIL|.
// if hints is nullptr, the function just check current document availability.
//
// Once all data is available, call FPDFAvail_GetDocument() to get a document
// handle.
var
  FPDFAvail_IsDocAvail: function(avail: FPDF_AVAIL; hints: PFX_DOWNLOADHINTS): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get document from the availability provider.
//
//   avail    - handle to document availability provider.
//   password - password for decrypting the PDF file. Optional.
//
// Returns a handle to the document.
//
// When FPDFAvail_IsDocAvail() returns TRUE, call FPDFAvail_GetDocument() to
// retrieve the document handle.
// See the comments for FPDF_LoadDocument() regarding the encoding for
// |password|.
var
  FPDFAvail_GetDocument: function(avail: FPDF_AVAIL; password: FPDF_BYTESTRING): FPDF_DOCUMENT; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get the page number for the first available page in a linearized PDF.
//
//   doc - document handle.
//
// Returns the zero-based index for the first available page.
//
// For most linearized PDFs, the first available page will be the first page,
// however, some PDFs might make another page the first available page.
// For non-linearized PDFs, this function will always return zero.
var
  FPDFAvail_GetFirstPageNum: function(doc: FPDF_DOCUMENT): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Check if |page_index| is ready for loading, if not, get the
// |FX_DOWNLOADHINTS|.
//
//   avail      - handle to document availability provider.
//   page_index - index number of the page. Zero for the first page.
//   hints      - pointer to a download hints interface. Populated if
//                |page_index| is not available.
//
// Returns one of:
//   PDF_DATA_ERROR: A common error is returned. Data availability unknown.
//   PDF_DATA_NOTAVAIL: Data not yet available.
//   PDF_DATA_AVAIL: Data available.
//
// This function can be called only after FPDFAvail_GetDocument() is called.
// Applications should call this function whenever new data arrives and process
// all the generated download |hints|, if any, until this function returns
// |PDF_DATA_ERROR| or |PDF_DATA_AVAIL|. Applications can then perform page
// loading.
// if hints is nullptr, the function just check current availability of
// specified page.
var
  FPDFAvail_IsPageAvail: function(avail: FPDF_AVAIL; page_index: Integer; hints: PFX_DOWNLOADHINTS): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Check if form data is ready for initialization, if not, get the
// |FX_DOWNLOADHINTS|.
//
//   avail - handle to document availability provider.
//   hints - pointer to a download hints interface. Populated if form is not
//           ready for initialization.
//
// Returns one of:
//   PDF_FORM_ERROR: A common eror, in general incorrect parameters.
//   PDF_FORM_NOTAVAIL: Data not available.
//   PDF_FORM_AVAIL: Data available.
//   PDF_FORM_NOTEXIST: No form data.
//
// This function can be called only after FPDFAvail_GetDocument() is called.
// The application should call this function whenever new data arrives and
// process all the generated download |hints|, if any, until the function
// |PDF_FORM_ERROR|, |PDF_FORM_AVAIL| or |PDF_FORM_NOTEXIST|.
// if hints is nullptr, the function just check current form availability.
//
// Applications can then perform page loading. It is recommend to call
// FPDFDOC_InitFormFillEnvironment() when |PDF_FORM_AVAIL| is returned.
var
  FPDFAvail_IsFormAvail: function(avail: FPDF_AVAIL; hints: PFX_DOWNLOADHINTS): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Check whether a document is a linearized PDF.
//
//   avail - handle to document availability provider.
//
// Returns one of:
//   PDF_LINEARIZED
//   PDF_NOT_LINEARIZED
//   PDF_LINEARIZATION_UNKNOWN
//
// FPDFAvail_IsLinearized() will return |PDF_LINEARIZED| or |PDF_NOT_LINEARIZED|
// when we have 1k  of data. If the files size less than 1k, it returns
// |PDF_LINEARIZATION_UNKNOWN| as there is insufficient information to determine
// if the PDF is linearlized.
var
  FPDFAvail_IsLinearized: function(avail: FPDF_AVAIL): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};


// *** _FPD_FORMFILL_H ***

const
  // These values are return values for a public API, so should not be changed
  // other than the count when adding new values.
  FORMTYPE_NONE           = 0;       // Document contains no forms
  FORMTYPE_ACRO_FORM      = 1;       // Forms are specified using AcroForm spec
  FORMTYPE_XFA_FULL       = 2;       // Forms are specified using the entire XFA spec
  FORMTYPE_XFA_FOREGROUND = 3;       // Forms are specified using the XFAF subset of XFA spec
  FORMTYPE_COUNT          = 4;       // The number of form types

  JSPLATFORM_ALERT_BUTTON_OK          = 0;  // OK button
  JSPLATFORM_ALERT_BUTTON_OKCANCEL    = 1;  // OK & Cancel buttons
  JSPLATFORM_ALERT_BUTTON_YESNO       = 2;  // Yes & No buttons
  JSPLATFORM_ALERT_BUTTON_YESNOCANCEL = 3;  // Yes, No & Cancel buttons
  JSPLATFORM_ALERT_BUTTON_DEFAULT = JSPLATFORM_ALERT_BUTTON_OK;

  JSPLATFORM_ALERT_ICON_ERROR    = 0;  // Error
  JSPLATFORM_ALERT_ICON_WARNING  = 1;  // Warning
  JSPLATFORM_ALERT_ICON_QUESTION = 2;  // Question
  JSPLATFORM_ALERT_ICON_STATUS   = 3;  // Status
  JSPLATFORM_ALERT_ICON_ASTERISK = 4;  // Asterisk
  JSPLATFORM_ALERT_ICON_DEFAULT = JSPLATFORM_ALERT_ICON_ERROR;

  JSPLATFORM_ALERT_RETURN_OK     = 1;  // OK
  JSPLATFORM_ALERT_RETURN_CANCEL = 2;  // Cancel
  JSPLATFORM_ALERT_RETURN_NO     = 3;  // No
  JSPLATFORM_ALERT_RETURN_YES    = 4;  // Yes

  JSPLATFORM_BEEP_ERROR    = 0;  // Error
  JSPLATFORM_BEEP_WARNING  = 1;  // Warning
  JSPLATFORM_BEEP_QUESTION = 2;  // Question
  JSPLATFORM_BEEP_STATUS   = 3;  // Status
  JSPLATFORM_BEEP_DEFAULT  = 4; // Default

type
  PIPDF_JsPlatform = ^IPDF_JsPlatform;
  IPDF_JsPlatform = record
    // Version number of the interface. Currently must be 2.
    version: Integer;

    // Version 1.

    // Method: app_alert
    //       Pop up a dialog to show warning or hint.
    // Interface Version:
    //       1
    // Implementation Required:
    //       yes
    // Parameters:
    //       pThis       -   Pointer to the interface structure itself.
    //       Msg         -   A string containing the message to be displayed.
    //       Title       -   The title of the dialog.
    //       Type        -   The type of button group, one of the
    //                       JSPLATFORM_ALERT_BUTTON_* values above.
    //       nIcon       -   The type of the icon, one of the
    //                       JSPLATFORM_ALERT_ICON_* above.
    // Return Value:
    //       Option selected by user in dialogue, one of the
    //       JSPLATFORM_ALERT_RETURN_* values above.
    app_alert: function(pThis: PIPDF_JsPlatform; Msg, Title: FPDF_WIDESTRING; nType: Integer;
                        Icon: Integer): Integer; cdecl;

    // Method: app_beep
    //       Causes the system to play a sound.
    // Interface Version:
    //       1
    // Implementation Required:
    //       yes
    // Parameters:
    //       pThis       -   Pointer to the interface structure itself
    //       nType       -   The sound type, see JSPLATFORM_BEEP_TYPE_*
    //                       above.
    // Return Value:
    //       None
    app_beep: procedure(pThis: PIPDF_JsPlatform; nType: Integer); cdecl;

    // Method: app_response
    //       Displays a dialog box containing a question and an entry field for
    //       the user to reply to the question.
    // Interface Version:
    //       1
    // Implementation Required:
    //       yes
    // Parameters:
    //       pThis       -   Pointer to the interface structure itself
    //       Question    -   The question to be posed to the user.
    //       Title       -   The title of the dialog box.
    //       Default     -   A default value for the answer to the question. If
    //                       not specified, no default value is presented.
    //       cLabel      -   A short string to appear in front of and on the
    //                       same line as the edit text field.
    //       bPassword   -   If true, indicates that the user's response should
    //                       be shown as asterisks (*) or bullets (?) to mask
    //                       the response, which might be sensitive information.
    //       response    -   A string buffer allocated by PDFium, to receive the
    //                       user's response.
    //       length      -   The length of the buffer in bytes. Currently, it is
    //                       always 2048.
    // Return Value:
    //       Number of bytes the complete user input would actually require, not
    //       including trailing zeros, regardless of the value of the length
    //       parameter or the presence of the response buffer.
    // Comments:
    //       No matter on what platform, the response buffer should be always
    //       written using UTF-16LE encoding. If a response buffer is
    //       present and the size of the user input exceeds the capacity of the
    //       buffer as specified by the length parameter, only the
    //       first "length" bytes of the user input are to be written to the
    //       buffer.
    app_response: function(pThis: PIPDF_JsPlatform; Question, Title, Default, cLabel: FPDF_WIDESTRING;
                           bPassword: FPDF_BOOL; response: Pointer; length: Integer): Integer; cdecl;

    // Method: Doc_getFilePath
    //       Get the file path of the current document.
    // Interface Version:
    //       1
    // Implementation Required:
    //       yes
    // Parameters:
    //       pThis       -   Pointer to the interface structure itself
    //       filePath    -   The string buffer to receive the file path. Can
    //                       be NULL.
    //       length      -   The length of the buffer, number of bytes. Can
    //                       be 0.
    // Return Value:
    //       Number of bytes the filePath consumes, including trailing zeros.
    // Comments:
    //       The filePath should always be provided in the local encoding.
    //       The return value always indicated number of bytes required for
    //       the buffer, even when there is no buffer specified, or the buffer
    //       size is less than required. In this case, the buffer will not
    //       be modified.
    Doc_getFilePath: function(pThis: PIPDF_JsPlatform; filePath: Pointer; length: Integer): Integer; cdecl;

    // Method: Doc_mail
    //       Mails the data buffer as an attachment to all recipients, with or
    //       without user interaction.
    // Interface Version:
    //       1
    // Implementation Required:
    //       yes
    // Parameters:
    //       pThis       -   Pointer to the interface structure itself
    //       mailData    -   Pointer to the data buffer to be sent. Can be NULL.
    //       length      -   The size,in bytes, of the buffer pointed by
    //                       mailData parameter. Can be 0.
    //       bUI         -   If true, the rest of the parameters are used in a
    //                       compose-new-message window that is displayed to the
    //                       user. If false, the cTo parameter is required and
    //                       all others are optional.
    //       To          -   A semicolon-delimited list of recipients for the
    //                       message.
    //       Subject     -   The subject of the message. The length limit is
    //                       64 KB.
    //       CC          -   A semicolon-delimited list of CC recipients for
    //                       the message.
    //       BCC         -   A semicolon-delimited list of BCC recipients for
    //                       the message.
    //       Msg         -   The content of the message. The length limit is
    //                       64 KB.
    // Return Value:
    //       None.
    // Comments:
    //       If the parameter mailData is NULL or length is 0, the current
    //       document will be mailed as an attachment to all recipients.
    Doc_mail: procedure(pThis: PIPDF_JsPlatform; mailData: Pointer; length: Integer; bUI: FPDF_BOOL;
                        sTo, subject, CC, BCC, Msg: FPDF_WIDESTRING); cdecl;

    // Method: Doc_print
    //       Prints all or a specific number of pages of the document.
    // Interface Version:
    //       1
    // Implementation Required:
    //       yes
    // Parameters:
    //       pThis         -   Pointer to the interface structure itself.
    //       bUI           -   If true, will cause a UI to be presented to the
    //                         user to obtain printing information and confirm
    //                         the action.
    //       nStart        -   A 0-based index that defines the start of an
    //                         inclusive range of pages.
    //       nEnd          -   A 0-based index that defines the end of an
    //                         inclusive page range.
    //       bSilent       -   If true, suppresses the cancel dialog box while
    //                         the document is printing. The default is false.
    //       bShrinkToFit  -   If true, the page is shrunk (if necessary) to
    //                         fit within the imageable area of the printed page.
    //       bPrintAsImage -   If true, print pages as an image.
    //       bReverse      -   If true, print from nEnd to nStart.
    //       bAnnotations  -   If true (the default), annotations are
    //                         printed.
    // Return Value:
    //       None.
    Doc_print: procedure(pThis: PIPDF_JsPlatform; bUI: FPDF_BOOKMARK; nStart, nEnd: Integer;
                         bSilent, bShrinkToFit, bPrintAsImage, bReverse, bAnnotations: FPDF_BOOL); cdecl;

    // Method: Doc_submitForm
    //       Send the form data to a specified URL.
    // Interface Version:
    //       1
    // Implementation Required:
    //       yes
    // Parameters:
    //       pThis       -   Pointer to the interface structure itself
    //       formData    -   Pointer to the data buffer to be sent.
    //       length      -   The size,in bytes, of the buffer pointed by
    //                       formData parameter.
    //       URL         -   The URL to send to.
    // Return Value:
    //       None.
    Doc_submitForm: procedure(pThis: PIPDF_JsPlatform; formData: Pointer; length: Integer; URL: FPDF_WIDESTRING); cdecl;

    // Method: Doc_gotoPage
    //       Jump to a specified page.
    // Interface Version:
    //       1
    // Implementation Required:
    //       yes
    // Parameters:
    //       pThis       -   Pointer to the interface structure itself
    //       nPageNum    -   The specified page number, zero for the first page.
    // Return Value:
    //       None.
    Doc_gotoPage: procedure(pThis: PIPDF_JsPlatform; nPageNum: Integer); cdecl;

    // Method: Field_browse
    //       Show a file selection dialog, and return the selected file path.
    // Interface Version:
    //       1
    // Implementation Required:
    //       yes
    // Parameters:
    //       pThis       -   Pointer to the interface structure itself.
    //       filePath    -   Pointer to the data buffer to receive the file
    //                       path. Can be NULL.
    //       length      -   The length of the buffer, in bytes. Can be 0.
    // Return Value:
    //       Number of bytes the filePath consumes, including trailing zeros.
    // Comments:
    //       The filePath should always be provided in local encoding.
    Field_browse: function(pThis: PIPDF_JsPlatform; filePath: Pointer; length: Integer): Integer; cdecl;


    // Pointer for embedder-specific data. Unused by PDFium, and despite
    // its name, can be any data the embedder desires, though traditionally
    // a FPDF_FORMFILLINFO interface.
    m_pFormfillinfo: Pointer;

    // Version 2.

    m_isolate: Pointer;               // Unused in v3, retain for compatibility.
    m_v8EmbedderSlot: DWORD;          // Unused in v3, retain for compatibility.

    // Version 3.
    // Version 3 moves m_Isolate and m_v8EmbedderSlot to FPDF_LIBRARY_CONFIG.
  end;
  PIPDFJsPlatform = ^TIPDFJsPlatform;
  TIPDFJsPlatform = IPDF_JSPLATFORM;

// Flags for Cursor type
const
  FXCT_ARROW = 0;
  FXCT_NESW  = 1;
  FXCT_NWSE  = 2;
  FXCT_VBEAM = 3;
  FXCT_HBEAM = 4;
  FXCT_HAND  = 5;

// Function signature for the callback function passed to the FFI_SetTimer
// method.
// Parameters:
//          idEvent     -   Identifier of the timer.
// Return value:
//          None.
type
  TFPDFTimerCallback = procedure(idEvent: Integer); cdecl;

type
  // Declares of a struct type to the local system time.
  {$IFDEF MSWINDOWS}
  PFPDF_SYSTEMTIME = PSystemTime;
  FPDF_SYSTEMTIME = TSystemTime;
  {$ELSE}
  PFPDF_SYSTEMTIME = ^FPDF_SYSTEMTIME;
  FPDF_SYSTEMTIME = record
    wYear: Word;          // years since 1900
    wMonth: Word;         // months since January - [0,11]
    wDayOfWeek: Word;     // days since Sunday - [0,6]
    wDay: Word;           // day of the month - [1,31]
    wHour: Word;          // hours since midnight - [0,23]
    wMinute: Word;        // minutes after the hour - [0,59]
    wSecond: Word;        // seconds after the minute - [0,59]
    wMilliseconds: Word;  // milliseconds after the second - [0,999]
  end;
  {$ENDIF MSWINDOWS}
  PFPDFSystemTime = ^TFPDFSystemTime;
  TFPDFSystemTime = FPDF_SYSTEMTIME;

{$IFDEF PDF_ENABLE_XFA}
// XFA
const
  // Pageview event flags
  FXFA_PAGEVIEWEVENT_POSTADDED   = 1; // After a new pageview is added.
  FXFA_PAGEVIEWEVENT_POSTREMOVED = 3; // After a pageview is removed.

  // Definitions for Right Context Menu Features Of XFA Fields
  FXFA_MENU_COPY      = 1;
  FXFA_MENU_CUT       = 2;
  FXFA_MENU_SELECTALL = 4;
  FXFA_MENU_UNDO      = 8;
  FXFA_MENU_REDO      = 16;
  FXFA_MENU_PASTE     = 32;

  // Definitions for File Type.
  FXFA_SAVEAS_XML = 1;
  FXFA_SAVEAS_XDP = 2;
{$ENDIF PDF_ENABLE_XFA}

type
  PFPDF_FORMFILLINFO = ^FPDF_FORMFILLINFO;
  FPDF_FORMFILLINFO = record
    // Version number of the interface.
    // Version 1 contains stable interfaces. Version 2 has additional
    // experimental interfaces.
    // When PDFium is built without the XFA module, version can be 1 or 2.
    // With version 1, only stable interfaces are called. With version 2,
    // additional experimental interfaces are also called.
    // When PDFium is built with the XFA module, version must be 2.
    // All the XFA related interfaces are experimental. If PDFium is built with
    // the XFA module and version 1 then none of the XFA related interfaces
    // would be called. When PDFium is built with XFA module then the version
    // must be 2.
    version: Integer;

    // Version 1.

    // Method: Release
    //       Give the implementation a chance to release any resources after the
    //       interface is no longer used.
    // Interface Version:
    //       1
    // Implementation Required:
    //       No
    // Comments:
    //       Called by PDFium during the final cleanup process.
    // Parameters:
    //       pThis       -   Pointer to the interface structure itself
    // Return Value:
    //       None
    Release: procedure(pThis: PFPDF_FORMFILLINFO); cdecl;

    // Method: FFI_Invalidate
    //       Invalidate the client area within the specified rectangle.
    // Interface Version:
    //       1
    // Implementation Required:
    //       yes
    // Parameters:
    //       pThis       -   Pointer to the interface structure itself.
    //       page        -   Handle to the page. Returned by FPDF_LoadPage().
    //       left        -   Left position of the client area in PDF page
    //                       coordinates.
    //       top         -   Top position of the client area in PDF page
    //                       coordinates.
    //       right       -   Right position of the client area in PDF page
    //                       coordinates.
    //       bottom      -   Bottom position of the client area in PDF page
    //                       coordinates.
    // Return Value:
    //       None.
    // Comments:
    //       All positions are measured in PDF "user space".
    //       Implementation should call FPDF_RenderPageBitmap() for repainting
    //       the specified page area.
    FFI_Invalidate: procedure(pThis: PFPDF_FORMFILLINFO; page: FPDF_PAGE; left, top, right, bottom: Double); cdecl;

    // Method: FFI_OutputSelectedRect
    //       When the user selects text in form fields with the mouse, this
    //       callback function will be invoked with the selected areas.
    // Interface Version:
    //       1
    // Implementation Required:
    //       No
    // Parameters:
    //       pThis       -   Pointer to the interface structure itself.
    //       page        -   Handle to the page. Returned by FPDF_LoadPage()/
    //       left        -   Left position of the client area in PDF page
    //                       coordinates.
    //       top         -   Top position of the client area in PDF page
    //                       coordinates.
    //       right       -   Right position of the client area in PDF page
    //                       coordinates.
    //       bottom      -   Bottom position of the client area in PDF page
    //                       coordinates.
    // Return Value:
    //       None.
    // Comments:
    //       This callback function is useful for implementing special text
    //       selection effects. An implementation should first record the
    //       returned rectangles, then draw them one by one during the next
    //       painting period. Lastly, it should remove all the recorded
    //       rectangles when finished painting.
    FFI_OutputSelectedRect: procedure(pThis: PFPDF_FORMFILLINFO; page: FPDF_PAGE; left, top, right, bottom: Double); cdecl;

    // Method: FFI_SetCursor
    //       Set the Cursor shape.
    // Interface Version:
    //       1
    // Implementation Required:
    //       yes
    // Parameters:
    //       pThis       -   Pointer to the interface structure itself.
    //       nCursorType -   Cursor type, see Flags for Cursor type for details.
    // Return value:
    //       None.
    FFI_SetCursor: procedure(pThis: PFPDF_FORMFILLINFO; nCursorType: Integer); cdecl;

    // Method: FFI_SetTimer
    //       This method installs a system timer. An interval value is specified,
    //       and every time that interval elapses, the system must call into the
    //       callback function with the timer ID as returned by this function.
    // Interface Version:
    //       1
    // Implementation Required:
    //       yes
    // Parameters:
    //       pThis       -   Pointer to the interface structure itself.
    //       uElapse     -   Specifies the time-out value, in milliseconds.
    //       lpTimerFunc -   A pointer to the callback function-TimerCallback.
    // Return value:
    //       The timer identifier of the new timer if the function is successful.
    //       An application passes this value to the FFI_KillTimer method to kill
    //       the timer. Nonzero if it is successful; otherwise, it is zero.
    FFI_SetTimer: function(pThis: PFPDF_FORMFILLINFO; uElapse: Integer; lpTimerFunc: TFPDFTimerCallback): Integer; cdecl;

    // Method: FFI_KillTimer
    //       This method uninstalls a system timer, as set by an earlier call to
    //       FFI_SetTimer.
    // Interface Version:
    //       1
    // Implementation Required:
    //       yes
    // Parameters:
    //       pThis       -   Pointer to the interface structure itself.
    //       nTimerID    -   The timer ID returned by FFI_SetTimer function.
    // Return value:
    //       None.
    FFI_KillTimer: procedure(pThis: PFPDF_FORMFILLINFO; nTimerID: Integer); cdecl;

    // Method: FFI_GetLocalTime
    //       This method receives the current local time on the system.
    // Interface Version:
    //       1
    // Implementation Required:
    //       yes
    // Parameters:
    //       pThis       -   Pointer to the interface structure itself.
    // Return value:
    //       The local time. See FPDF_SYSTEMTIME above for details.
    // Note: Unused.
    FFI_GetLocalTime: function(pThis: PFPDF_FORMFILLINFO): FPDF_SYSTEMTIME; cdecl;

    // Method: FFI_OnChange
    //       This method will be invoked to notify the implementation when the
    //       value of any FormField on the document had been changed.
    // Interface Version:
    //       1
    // Implementation Required:
    //       no
    // Parameters:
    //       pThis       -   Pointer to the interface structure itself.
    // Return value:
    //       None.
    FFI_OnChange: procedure(pThis: PFPDF_FORMFILLINFO); cdecl;

    // Method: FFI_GetPage
    //       This method receives the page handle associated with a specified
    //       page index.
    // Interface Version:
    //       1
    // Implementation Required:
    //       yes
    // Parameters:
    //       pThis       -   Pointer to the interface structure itself.
    //       document    -   Handle to document. Returned by FPDF_LoadDocument().
    //       nPageIndex  -   Index number of the page. 0 for the first page.
    // Return value:
    //       Handle to the page, as previously returned to the implementation by
    //       FPDF_LoadPage().
    // Comments:
    //       The implementation is expected to keep track of the page handles it
    //       receives from PDFium, and their mappings to page numbers. In some
    //       cases, the document-level JavaScript action may refer to a page
    //       which hadn't been loaded yet. To successfully run the Javascript
    //       action, the implementation needs to load the page.
    FFI_GetPage: function(pThis: PFPDF_FORMFILLINFO; document: FPDF_DOCUMENT; nPageIndex: Integer): FPDF_PAGE; cdecl;

    // Method: FFI_GetCurrentPage
    //       This method receives the handle to the current page.
    // Interface Version:
    //       1
    // Implementation Required:
    //       Yes when V8 support is present, otherwise unused.
    // Parameters:
    //       pThis       -   Pointer to the interface structure itself.
    //       document    -   Handle to document. Returned by FPDF_LoadDocument().
    // Return value:
    //       Handle to the page. Returned by FPDF_LoadPage().
    // Comments:
    //       PDFium doesn't keep keep track of the "current page" (e.g. the one
    //       that is most visible on screen), so it must ask the embedder for
    //       this information.
    FFI_GetCurrentPage: function(pThis: PFPDF_FORMFILLINFO; document: FPDF_DOCUMENT): FPDF_PAGE; cdecl;

    // Method: FFI_GetRotation
    //       This method receives currently rotation of the page view.
    // Interface Version:
    //       1
    // Implementation Required:
    //       yes
    // Parameters:
    //       pThis       -   Pointer to the interface structure itself.
    //       page        -   Handle to page, as returned by FPDF_LoadPage().
    // Return value:
    //       A number to indicate the page rotation in 90 degree increments
    //       in a clockwise direction:
    //         0 - 0 degrees
    //         1 - 90 degrees
    //         2 - 180 degrees
    //         3 - 270 degrees
    // Note: Unused.
    FFI_GetRotation: function(pThis: PFPDF_FORMFILLINFO; page: FPDF_PAGE): Integer; cdecl;

    // Method: FFI_ExecuteNamedAction
    //       This method will execute a named action.
    // Interface Version:
    //       1
    // Implementation Required:
    //       yes
    // Parameters:
    //       pThis           -   Pointer to the interface structure itself.
    //       namedAction     -   A byte string which indicates the named action,
    //                           terminated by 0.
    // Return value:
    //       None.
    // Comments:
    //       See ISO 32000-1:2008, section 12.6.4.11 for descriptions of the
    //       standard named actions, but note that a document may supply any
    //       name of its choosing.
    FFI_ExecuteNamedAction: procedure(pThis: PFPDF_FORMFILLINFO; namedAction: FPDF_BYTESTRING); cdecl;

    // Method: FFI_SetTextFieldFocus
    //       Called when a text field is getting or losing focus.
    // Interface Version:
    //       1
    // Implementation Required:
    //       no
    // Parameters:
    //       pThis           -   Pointer to the interface structure itself.
    //       value           -   The string value of the form field, in UTF-16LE
    //                           format.
    //       valueLen        -   The length of the string value. This is the
    //                           number of characters, not bytes.
    //       is_focus        -   True if the form field is getting focus, false
    //                           if the form field is losing focus.
    // Return value:
    //       None.
    // Comments:
    //       Only supports text fields and combobox fields.
    FFI_SetTextFieldFocus: procedure(pThis: PFPDF_FORMFILLINFO; value: FPDF_WIDESTRING; valueLen: FPDF_DWORD; is_focus: FPDF_BOOL); cdecl;

    // Method: FFI_DoURIAction
    //       Ask the implementation to navigate to a uniform resource identifier.
    // Interface Version:
    //       1
    // Implementation Required:
    //       No
    // Parameters:
    //       pThis           -   Pointer to the interface structure itself.
    //       bsURI           -   A byte string which indicates the uniform
    //                           resource identifier, terminated by 0.
    // Return value:
    //       None.
    // Comments:
    //       If the embedder is version 2 or higher and have implementation for
    //       FFI_DoURIActionWithKeyboardModifier, then
    //       FFI_DoURIActionWithKeyboardModifier takes precedence over
    //       FFI_DoURIAction.
    //       See the URI actions description of <<PDF Reference, version 1.7>>
    //       for more details.
    FFI_DoURIAction: procedure(pThis: PFPDF_FORMFILLINFO; bsURI: FPDF_WIDESTRING); cdecl;

    // Method: FFI_DoGoToAction
    //       This action changes the view to a specified destination.
    // Interface Version:
    //       1
    // Implementation Required:
    //       No
    // Parameters:
    //       pThis           -   Pointer to the interface structure itself.
    //       nPageIndex      -   The index of the PDF page.
    //       zoomMode        -   The zoom mode for viewing page. See below.
    //       fPosArray       -   The float array which carries the position info.
    //       sizeofArray     -   The size of float array.
    // PDFZoom values:
    //         - XYZ = 1
    //         - FITPAGE = 2
    //         - FITHORZ = 3
    //         - FITVERT = 4
    //         - FITRECT = 5
    //         - FITBBOX = 6
    //         - FITBHORZ = 7
    //         - FITBVERT = 8
    // Return value:
    //       None.
    // Comments:
    //       See the Destinations description of <<PDF Reference, version 1.7>>
    //       in 8.2.1 for more details.
    FFI_DoGoToAction: procedure(pThis: PFPDF_FORMFILLINFO; nPageIndex, zoomMode: Integer; fPosArray: PSingle; sizeofArray: Integer); cdecl;

    // Pointer to IPDF_JSPLATFORM interface.
    // Unused if PDFium is built without V8 support. Otherwise, if NULL, then
    // JavaScript will be prevented from executing while rendering the document.
    m_pJsPlatform: PIPDF_JSPLATFORM;

    // Version 2 - Experimental.

    // Whether the XFA module is disabled when built with the XFA module.
    // Interface Version:
    //       Ignored if |version| < 2.
    xfa_disabled: FPDF_BOOL;

    // Method: FFI_DisplayCaret
    //       This method will show the caret at specified position.
    // Interface Version:
    //       Ignored if |version| < 2.
    // Implementation Required:
    //       Required for XFA, otherwise set to NULL.
    // Parameters:
    //       pThis           -   Pointer to the interface structure itself.
    //       page            -   Handle to page. Returned by FPDF_LoadPage().
    //       left            -   Left position of the client area in PDF page
    //                           coordinates.
    //       top             -   Top position of the client area in PDF page
    //                           coordinates.
    //       right           -   Right position of the client area in PDF page
    //                           coordinates.
    //       bottom          -   Bottom position of the client area in PDF page
    //                           coordinates.
    // Return value:
    //       None.
    FFI_DisplayCaret: procedure(pThis: PFPDF_FORMFILLINFO; page: FPDF_PAGE; bVisible: FPDF_BOOL;
                                left, top, right, bottom: Double); cdecl;

    // Method: FFI_GetCurrentPageIndex
    //       This method will get the current page index.
    // Interface Version:
    //       Ignored if |version| < 2.
    // Implementation Required:
    //       Required for XFA, otherwise set to NULL.
    // Parameters:
    //       pThis           -   Pointer to the interface structure itself.
    //       document        -   Handle to document from FPDF_LoadDocument().
    // Return value:
    //       The index of current page.
    FFI_GetCurrentPageIndex: function(pThis: PFPDF_FORMFILLINFO; document: FPDF_DOCUMENT): Integer; cdecl;

    // Method: FFI_SetCurrentPage
    //       This method will set the current page.
    // Interface Version:
    //       Ignored if |version| < 2.
    // Implementation Required:
    //       Required for XFA, otherwise set to NULL.
    // Parameters:
    //       pThis           -   Pointer to the interface structure itself.
    //       document        -   Handle to document from FPDF_LoadDocument().
    //       iCurPage        -   The index of the PDF page.
    // Return value:
    //       None.
    FFI_SetCurrentPage: procedure(pThis: PFPDF_FORMFILLINFO; document: FPDF_DOCUMENT; iCurPage: Integer); cdecl;

    // Method: FFI_GotoURL
    //       This method will navigate to the specified URL.
    // Interface Version:
    //       Ignored if |version| < 2.
    // Implementation Required:
    //       Required for XFA, otherwise set to NULL.
    // Parameters:
    //       pThis            -   Pointer to the interface structure itself.
    //       document         -   Handle to document from FPDF_LoadDocument().
    //       wsURL            -   The string value of the URL, in UTF-16LE format.
    // Return value:
    //       None.
    FFI_GotoURL: procedure(pThis: PFPDF_FORMFILLINFO; document: FPDF_DOCUMENT; wsURL: FPDF_WIDESTRING); cdecl;

    // Method: FFI_GetPageViewRect
    //       This method will get the current page view rectangle.
    // Interface Version:
    //       Ignored if |version| < 2.
    // Implementation Required:
    //       Required for XFA, otherwise set to NULL.
    // Parameters:
    //       pThis           -   Pointer to the interface structure itself.
    //       page            -   Handle to page. Returned by FPDF_LoadPage().
    //       left            -   The pointer to receive left position of the page
    //                           view area in PDF page coordinates.
    //       top             -   The pointer to receive top position of the page
    //                           view area in PDF page coordinates.
    //       right           -   The pointer to receive right position of the
    //                           page view area in PDF page coordinates.
    //       bottom          -   The pointer to receive bottom position of the
    //                           page view area in PDF page coordinates.
    // Return value:
    //     None.
    FFI_GetPageViewRect: procedure(pThis: PFPDF_FORMFILLINFO; page: FPDF_PAGE; var left, top, right, bottom: Double); cdecl;

    // Method: FFI_PageEvent
    //       This method fires when pages have been added to or deleted from
    //       the XFA document.
    // Interface Version:
    //       Ignored if |version| < 2.
    // Implementation Required:
    //       Required for XFA, otherwise set to NULL.
    // Parameters:
    //       pThis           -   Pointer to the interface structure itself.
    //       page_count      -   The number of pages to be added or deleted.
    //       event_type      -   See FXFA_PAGEVIEWEVENT_* above.
    // Return value:
    //       None.
    // Comments:
    //       The pages to be added or deleted always start from the last page
    //       of document. This means that if parameter page_count is 2 and
    //       event type is FXFA_PAGEVIEWEVENT_POSTADDED, 2 new pages have been
    //       appended to the tail of document; If page_count is 2 and
    //       event type is FXFA_PAGEVIEWEVENT_POSTREMOVED, the last 2 pages
    //       have been deleted.
    FFI_PageEvent: procedure(pThis: PFPDF_FORMFILLINFO; page_count: Integer; event_type: FPDF_DWORD); cdecl;

    // Method: FFI_PopupMenu
    //       This method will track the right context menu for XFA fields.
    // Interface Version:
    //       Ignored if |version| < 2.
    // Implementation Required:
    //       Required for XFA, otherwise set to NULL.
    // Parameters:
    //       pThis           -   Pointer to the interface structure itself.
    //       page            -   Handle to page. Returned by FPDF_LoadPage().
    //       hWidget         -   Always null, exists for compatibility.
    //       menuFlag        -   The menu flags. Please refer to macro definition
    //                           of FXFA_MENU_XXX and this can be one or a
    //                           combination of these macros.
    //       x               -   X position of the client area in PDF page
    //                           coordinates.
    //       y               -   Y position of the client area in PDF page
    //                           coordinates.
    // Return value:
    //       TRUE indicates success; otherwise false.
    FFI_PopupMenu: function(pThis: PFPDF_FORMFILLINFO; page: FPDF_PAGE; hWidget: FPDF_WIDGET;
                            menuFlag: Integer; x, y: Single): FPDF_BOOL; cdecl;

    // Method: FFI_OpenFile
    //       This method will open the specified file with the specified mode.
    // Interface Version:
    //       Ignored if |version| < 2.
    // Implementation Required:
    //       Required for XFA, otherwise set to NULL.
    // Parameters:
    //       pThis           -   Pointer to the interface structure itself.
    //       fileFlag        -   The file flag. Please refer to macro definition
    //                           of FXFA_SAVEAS_XXX and use one of these macros.
    //       wsURL           -   The string value of the file URL, in UTF-16LE
    //                           format.
    //       mode            -   The mode for open file, e.g. "rb" or "wb".
    // Return value:
    //       The handle to FPDF_FILEHANDLER.
    FFI_OpenFile: function(pThis: PFPDF_FORMFILLINFO; fileFlag: Integer; wsURL: FPDF_WIDESTRING;
                           mode: PAnsiChar): PFPDF_FILEHANDLER; cdecl;

    // Method: FFI_EmailTo
    //       This method will email the specified file stream to the specified
    //       contact.
    // Interface Version:
    //       Ignored if |version| < 2.
    // Implementation Required:
    //       Required for XFA, otherwise set to NULL.
    // Parameters:
    //       pThis           -   Pointer to the interface structure itself.
    //       pFileHandler    -   Handle to the FPDF_FILEHANDLER.
    //       pTo             -   A semicolon-delimited list of recipients for the
    //                           message,in UTF-16LE format.
    //       pSubject        -   The subject of the message,in UTF-16LE format.
    //       pCC             -   A semicolon-delimited list of CC recipients for
    //                           the message,in UTF-16LE format.
    //       pBcc            -   A semicolon-delimited list of BCC recipients for
    //                           the message,in UTF-16LE format.
    //       pMsg            -   Pointer to the data buffer to be sent.Can be
    //                           NULL,in UTF-16LE format.
    // Return value:
    //       None.
    FFI_EmailTo: procedure(pThis: PFPDF_FORMFILLINFO; fileHandler: PFPDF_FILEHANDLER;
                           pTo, pSubject, pCC, pBcc, pMsg: FPDF_WIDESTRING); cdecl;

    // Method: FFI_UploadTo
    //       This method will upload the specified file stream to the
    //       specified URL.
    // Interface Version:
    //       Ignored if |version| < 2.
    // Implementation Required:
    //       Required for XFA, otherwise set to NULL.
    // Parameters:
    //       pThis           -   Pointer to the interface structure itself.
    //       pFileHandler    -   Handle to the FPDF_FILEHANDLER.
    //       fileFlag        -   The file flag. Please refer to macro definition
    //                           of FXFA_SAVEAS_XXX and use one of these macros.
    //       uploadTo        -   Pointer to the URL path, in UTF-16LE format.
    // Return value:
    //       None.
    FFI_UploadTo: procedure(pThis: PFPDF_FORMFILLINFO; fileHandler: PFPDF_FILEHANDLER; fileFlag: Integer;
                            uploadTo: FPDF_WIDESTRING); cdecl;

    // Method: FFI_GetPlatform
    //       This method will get the current platform.
    // Interface Version:
    //       Ignored if |version| < 2.
    // Implementation Required:
    //       Required for XFA, otherwise set to NULL.
    // Parameters:
    //       pThis           -   Pointer to the interface structure itself.
    //       platform        -   Pointer to the data buffer to receive the
    //                           platform,in UTF-16LE format. Can be NULL.
    //       length          -   The length of the buffer in bytes. Can be
    //                           0 to query the required size.
    // Return value:
    //       The length of the buffer, number of bytes.
    FFI_GetPlatform: function(pThis: PFPDF_FORMFILLINFO; platform_: Pointer; length: Integer): Integer; cdecl;

    // Method: FFI_GetLanguage
    //       This method will get the current language.
    // Interface Version:
    //       Ignored if |version| < 2.
    // Implementation Required:
    //       Required for XFA, otherwise set to NULL.
    // Parameters:
    //       pThis           -   Pointer to the interface structure itself.
    //       language        -   Pointer to the data buffer to receive the
    //                           current language. Can be NULL.
    //       length          -   The length of the buffer in bytes. Can be
    //                           0 to query the required size.
    // Return value:
    //       The length of the buffer, number of bytes.
    FFI_GetLanguage: function(pThis: PFPDF_FORMFILLINFO; language: Pointer; length: Integer): Integer; cdecl;

    // Method: FFI_DownloadFromURL
    //       This method will download the specified file from the URL.
    // Interface Version:
    //       Ignored if |version| < 2.
    // Implementation Required:
    //       Required for XFA, otherwise set to NULL.
    // Parameters:
    //       pThis           -   Pointer to the interface structure itself.
    //       URL             -   The string value of the file URL, in UTF-16LE
    //                           format.
    // Return value:
    //       The handle to FPDF_FILEHANDLER.
    FFI_DownloadFromURL: function(pThis: PFPDF_FORMFILLINFO; URL: FPDF_WIDESTRING): PFPDF_FILEHANDLER; cdecl;

    // Method: FFI_PostRequestURL
    //       This method will post the request to the server URL.
    // Interface Version:
    //       Ignored if |version| < 2.
    // Implementation Required:
    //       Required for XFA, otherwise set to NULL.
    // Parameters:
    //       pThis           -   Pointer to the interface structure itself.
    //       wsURL           -   The string value of the server URL, in UTF-16LE
    //                           format.
    //       wsData          -   The post data,in UTF-16LE format.
    //       wsContentType   -   The content type of the request data, in
    //                           UTF-16LE format.
    //       wsEncode        -   The encode type, in UTF-16LE format.
    //       wsHeader        -   The request header,in UTF-16LE format.
    //       response        -   Pointer to the FPDF_BSTR to receive the response
    //                           data from the server, in UTF-16LE format.
    // Return value:
    //       TRUE indicates success, otherwise FALSE.
    FFI_PostRequestURL: function(pThis: PFPDF_FORMFILLINFO; wsURL, wsData, wsContentType,
                                 wsEncode, wsHeader: FPDF_WIDESTRING; respone: PFPDF_BSTR): FPDF_BOOL; cdecl;

    // Method: FFI_PutRequestURL
    //       This method will put the request to the server URL.
    // Interface Version:
    //       Ignored if |version| < 2.
    // Implementation Required:
    //       Required for XFA, otherwise set to NULL.
    // Parameters:
    //       pThis           -   Pointer to the interface structure itself.
    //       wsURL           -   The string value of the server URL, in UTF-16LE
    //                           format.
    //       wsData          -   The put data, in UTF-16LE format.
    //       wsEncode        -   The encode type, in UTR-16LE format.
    // Return value:
    //       TRUE indicates success, otherwise FALSE.
    FFI_PutRequestURL: function(pThis: PFPDF_FORMFILLINFO; wsURL, wsData, wsEncode: FPDF_WIDESTRING): FPDF_BOOL; cdecl;

    // Method: FFI_OnFocusChange
    //     Called when the focused annotation is updated.
    // Interface Version:
    //     Ignored if |version| < 2.
    // Implementation Required:
    //     No
    // Parameters:
    //     param           -   Pointer to the interface structure itself.
    //     annot           -   The focused annotation.
    //     page_index      -   Index number of the page which contains the
    //                         focused annotation. 0 for the first page.
    // Return value:
    //     None.
    // Comments:
    //     This callback function is useful for implementing any view based
    //     action such as scrolling the annotation rect into view. The
    //     embedder should not copy and store the annot as its scope is
    //     limited to this call only.
    FFI_OnFocusChange: procedure(param: PFPDF_FORMFILLINFO; annot: FPDF_ANNOTATION; page_index: Integer); cdecl;

    // Method: FFI_DoURIActionWithKeyboardModifier
    //       Ask the implementation to navigate to a uniform resource identifier
    //       with the specified modifiers.
    // Interface Version:
    //       Ignored if |version| < 2.
    // Implementation Required:
    //       No
    // Parameters:
    //       param           -   Pointer to the interface structure itself.
    //       uri             -   A byte string which indicates the uniform
    //                           resource identifier, terminated by 0.
    //       modifiers       -   Keyboard modifier that indicates which of
    //                           the virtual keys are down, if any.
    // Return value:
    //       None.
    // Comments:
    //       If the embedder who is version 2 and does not implement this API,
    //       then a call will be redirected to FFI_DoURIAction.
    //       See the URI actions description of <<PDF Reference, version 1.7>>
    //       for more details.
    FFI_DoURIActionWithKeyboardModifier: procedure(param: PFPDF_FORMFILLINFO; uri: FPDF_BYTESTRING; modifiers: Integer); cdecl;
  end;
  PFPDFFormFillInfo = ^TFPDFFormFillInfo;
  TFPDFFormFillInfo = FPDF_FORMFILLINFO;

// Function: FPDFDOC_InitFormFillEnvironment
//       Initialize form fill environment.
// Parameters:
//       document        -   Handle to document from FPDF_LoadDocument().
//       formInfo        -   Pointer to a FPDF_FORMFILLINFO structure.
// Return Value:
//       Handle to the form fill module, or NULL on failure.
// Comments:
//       This function should be called before any form fill operation.
//       The FPDF_FORMFILLINFO passed in via |formInfo| must remain valid until
//       the returned FPDF_FORMHANDLE is closed.
var
  FPDFDOC_InitFormFillEnvironment: function(document: FPDF_DOCUMENT; formInfo: PFPDF_FORMFILLINFO): FPDF_FORMHANDLE; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDFDOC_ExitFormFillEnvironment
//       Take ownership of |hHandle| and exit form fill environment.
// Parameters:
//       hHandle     -   Handle to the form fill module, as returned by
//                       FPDFDOC_InitFormFillEnvironment().
// Return Value:
//       None.
// Comments:
//       This function is a no-op when |hHandle| is null.
var
  FPDFDOC_ExitFormFillEnvironment: procedure(hHandle: FPDF_FORMHANDLE); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FORM_OnAfterLoadPage
//       This method is required for implementing all the form related
//       functions. Should be invoked after user successfully loaded a
//       PDF page, and FPDFDOC_InitFormFillEnvironment() has been invoked.
// Parameters:
//       hHandle     -   Handle to the form fill module, as returned by
//                       FPDFDOC_InitFormFillEnvironment().
// Return Value:
//       None.
var
  FORM_OnAfterLoadPage: procedure(page: FPDF_PAGE; hHandle: FPDF_FORMHANDLE); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FORM_OnBeforeClosePage
//       This method is required for implementing all the form related
//       functions. Should be invoked before user closes the PDF page.
// Parameters:
//        page        -   Handle to the page, as returned by FPDF_LoadPage().
//        hHandle     -   Handle to the form fill module, as returned by
//                        FPDFDOC_InitFormFillEnvironment().
// Return Value:
//        None.
var
  FORM_OnBeforeClosePage: procedure(page: FPDF_PAGE; hHandle: FPDF_FORMHANDLE); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FORM_DoDocumentJSAction
//       This method is required for performing document-level JavaScript
//       actions. It should be invoked after the PDF document has been loaded.
// Parameters:
//       hHandle     -   Handle to the form fill module, as returned by
//                       FPDFDOC_InitFormFillEnvironment().
// Return Value:
//       None.
// Comments:
//       If there is document-level JavaScript action embedded in the
//       document, this method will execute the JavaScript action. Otherwise,
//       the method will do nothing.
var
  FORM_DoDocumentJSAction: procedure(hHandle: FPDF_FORMHANDLE); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FORM_DoDocumentOpenAction
//       This method is required for performing open-action when the document
//       is opened.
// Parameters:
//       hHandle     -   Handle to the form fill module, as returned by
//                       FPDFDOC_InitFormFillEnvironment().
// Return Value:
//       None.
// Comments:
//       This method will do nothing if there are no open-actions embedded
//       in the document.
var
  FORM_DoDocumentOpenAction: procedure(hHandle: FPDF_FORMHANDLE); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

const
  // Additional actions type of document:
  //   WC, before closing document, JavaScript action.
  //   WS, before saving document, JavaScript action.
  //   DS, after saving document, JavaScript action.
  //   WP, before printing document, JavaScript action.
  //   DP, after printing document, JavaScript action.
  FPDFDOC_AACTION_WC = $10;
  FPDFDOC_AACTION_WS = $11;
  FPDFDOC_AACTION_DS = $12;
  FPDFDOC_AACTION_WP = $13;
  FPDFDOC_AACTION_DP = $14;

// Function: FORM_DoDocumentAAction
//       This method is required for performing the document's
//       additional-action.
// Parameters:
//       hHandle     -   Handle to the form fill module. Returned by
//                       FPDFDOC_InitFormFillEnvironment.
//       aaType      -   The type of the additional-actions which defined
//                       above.
// Return Value:
//       None.
// Comments:
//       This method will do nothing if there is no document
//       additional-action corresponding to the specified |aaType|.
var
  FORM_DoDocumentAAction: procedure(hHandle: FPDF_FORMHANDLE; aaType: Integer); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

const
  // Additional-action types of page object:
  //   OPEN (/O) -- An action to be performed when the page is opened
  //   CLOSE (/C) -- An action to be performed when the page is closed
  FPDFPAGE_AACTION_OPEN  = 0;
  FPDFPAGE_AACTION_CLOSE = 1;

// Function: FORM_DoPageAAction
//       This method is required for performing the page object's
//       additional-action when opened or closed.
// Parameters:
//       page        -   Handle to the page, as returned by FPDF_LoadPage().
//       hHandle     -   Handle to the form fill module, as returned by
//                       FPDFDOC_InitFormFillEnvironment().
//       aaType      -   The type of the page object's additional-actions
//                       which defined above.
// Return Value:
//       None.
// Comments:
//       This method will do nothing if no additional-action corresponding
//       to the specified |aaType| exists.
var
  FORM_DoPageAAction: procedure(page: FPDF_PAGE; hHandle: FPDF_FORMHANDLE; aaType: Integer); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FORM_OnMouseMove
//       Call this member function when the mouse cursor moves.
// Parameters:
//       hHandle     -   Handle to the form fill module, as returned by
//                       FPDFDOC_InitFormFillEnvironment().
//       page        -   Handle to the page, as returned by FPDF_LoadPage().
//       modifier    -   Indicates whether various virtual keys are down.
//       page_x      -   Specifies the x-coordinate of the cursor in PDF user
//                       space.
//       page_y      -   Specifies the y-coordinate of the cursor in PDF user
//                       space.
// Return Value:
//       True indicates success; otherwise false.
var
  FORM_OnMouseMove: function(hHandle: FPDF_FORMHANDLE; page: FPDF_PAGE; modifier: Integer;
    page_x, page_y: Double): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API
// Function: FORM_OnMouseWheel
//       Call this member function when the user scrolls the mouse wheel.
// Parameters:
//       hHandle     -   Handle to the form fill module, as returned by
//                       FPDFDOC_InitFormFillEnvironment().
//       page        -   Handle to the page, as returned by FPDF_LoadPage().
//       modifier    -   Indicates whether various virtual keys are down.
//       page_coord  -   Specifies the coordinates of the cursor in PDF user
//                       space.
//       delta_x     -   Specifies the amount of wheel movement on the x-axis,
//                       in units of platform-agnostic wheel deltas. Negative
//                       values mean left.
//       delta_y     -   Specifies the amount of wheel movement on the y-axis,
//                       in units of platform-agnostic wheel deltas. Negative
//                       values mean down.
// Return Value:
//       True indicates success; otherwise false.
// Comments:
//       For |delta_x| and |delta_y|, the caller must normalize
//       platform-specific wheel deltas. e.g. On Windows, a delta value of 240
//       for a WM_MOUSEWHEEL event normalizes to 2, since Windows defines
//       WHEEL_DELTA as 120.
var
  FORM_OnMouseWheel: function(hHandle: FPDF_FORMHANDLE; page: FPDF_PAGE; modifier: Integer;
    const page_coord: PFS_POINTF; delta_x, delta_y: Integer): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FORM_OnFocus
//       This function focuses the form annotation at a given point. If the
//       annotation at the point already has focus, nothing happens. If there
//       is no annotation at the point, removes form focus.
// Parameters:
//       hHandle     -   Handle to the form fill module, as returned by
//                       FPDFDOC_InitFormFillEnvironment().
//       page        -   Handle to the page, as returned by FPDF_LoadPage().
//       modifier    -   Indicates whether various virtual keys are down.
//       page_x      -   Specifies the x-coordinate of the cursor in PDF user
//                       space.
//       page_y      -   Specifies the y-coordinate of the cursor in PDF user
//                       space.
// Return Value:
//       True if there is an annotation at the given point and it has focus.
var
  FORM_OnFocus: function(hHandle: FPDF_FORMHANDLE; page: FPDF_PAGE; modifier: Integer;
    page_x, page_y: Double): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FORM_OnLButtonDown
//       Call this member function when the user presses the left
//       mouse button.
// Parameters:
//       hHandle     -   Handle to the form fill module, as returned by
//                       FPDFDOC_InitFormFillEnvironment().
//       page        -   Handle to the page, as returned by FPDF_LoadPage().
//       modifier    -   Indicates whether various virtual keys are down.
//       page_x      -   Specifies the x-coordinate of the cursor in PDF user
//                       space.
//       page_y      -   Specifies the y-coordinate of the cursor in PDF user
//                       space.
// Return Value:
//       True indicates success; otherwise false.
var
  FORM_OnLButtonDown: function(hHandle: FPDF_FORMHANDLE; page: FPDF_PAGE; modifier: Integer;
    page_x, page_y: Double): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FORM_OnRButtonDown
//       Same as above, execpt for the right mouse button.
// Comments:
//       At the present time, has no effect except in XFA builds, but is
//       included for the sake of symmetry.
var
  FORM_OnRButtonDown: function(hHandle: FPDF_FORMHANDLE; page: FPDF_PAGE; modifier: Integer;
    page_x, page_y: Double): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FORM_OnLButtonUp
//       Call this member function when the user releases the left
//       mouse button.
// Parameters:
//       hHandle     -   Handle to the form fill module, as returned by
//                       FPDFDOC_InitFormFillEnvironment().
//       page        -   Handle to the page, as returned by FPDF_LoadPage().
//       modifier    -   Indicates whether various virtual keys are down.
//       page_x      -   Specifies the x-coordinate of the cursor in device.
//       page_y      -   Specifies the y-coordinate of the cursor in device.
// Return Value:
//       True indicates success; otherwise false.
var
  FORM_OnLButtonUp: function(hHandle: FPDF_FORMHANDLE; page: FPDF_PAGE; modifier: Integer;
    page_x, page_y: Double): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FORM_OnRButtonUp
//       Same as above, execpt for the right mouse button.
// Comments:
//       At the present time, has no effect except in XFA builds, but is
//       included for the sake of symmetry.
var
  FORM_OnRButtonUp: function(hHandle: FPDF_FORMHANDLE; page: FPDF_PAGE; modifier: Integer;
    page_x, page_y: Double): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FORM_OnLButtonDoubleClick
//       Call this member function when the user double clicks the
//       left mouse button.
// Parameters:
//       hHandle     -   Handle to the form fill module, as returned by
//                       FPDFDOC_InitFormFillEnvironment().
//       page        -   Handle to the page, as returned by FPDF_LoadPage().
//       modifier    -   Indicates whether various virtual keys are down.
//       page_x      -   Specifies the x-coordinate of the cursor in PDF user
//                       space.
//       page_y      -   Specifies the y-coordinate of the cursor in PDF user
//                       space.
// Return Value:
//       True indicates success; otherwise false.
var
  FORM_OnLButtonDoubleClick: function(hHandle: FPDF_FORMHANDLE; page: FPDF_PAGE; modifier: Integer;
    page_x, page_y: Double): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FORM_OnKeyDown
//       Call this member function when a nonsystem key is pressed.
// Parameters:
//       hHandle     -   Handle to the form fill module, aseturned by
//                       FPDFDOC_InitFormFillEnvironment().
//       page        -   Handle to the page, as returned by FPDF_LoadPage().
//       nKeyCode    -   The virtual-key code of the given key (see
//                       fpdf_fwlevent.h for virtual key codes).
//       modifier    -   Mask of key flags (see fpdf_fwlevent.h for key
//                       flag values).
// Return Value:
//       True indicates success; otherwise false.
var
  FORM_OnKeyDown: function(hHandle: FPDF_FORMHANDLE; page: FPDF_PAGE; nKeyCode, modifier: Integer): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FORM_OnKeyUp
//       Call this member function when a nonsystem key is released.
// Parameters:
//       hHandle     -   Handle to the form fill module, as returned by
//                       FPDFDOC_InitFormFillEnvironment().
//       page        -   Handle to the page, as returned by FPDF_LoadPage().
//       nKeyCode    -   The virtual-key code of the given key (see
//                       fpdf_fwlevent.h for virtual key codes).
//       modifier    -   Mask of key flags (see fpdf_fwlevent.h for key
//                       flag values).
// Return Value:
//       True indicates success; otherwise false.
// Comments:
//       Currently unimplemented and always returns false. PDFium reserves this
//       API and may implement it in the future on an as-needed basis.
var
  FORM_OnKeyUp: function(hHandle: FPDF_FORMHANDLE; page: FPDF_PAGE; nKeyCode, modifier: Integer): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FORM_OnChar
//       Call this member function when a keystroke translates to a
//       nonsystem character.
// Parameters:
//       hHandle     -   Handle to the form fill module, as returned by
//                       FPDFDOC_InitFormFillEnvironment().
//       page        -   Handle to the page, as returned by FPDF_LoadPage().
//       nChar       -   The character code value itself.
//       modifier    -   Mask of key flags (see fpdf_fwlevent.h for key
//                       flag values).
// Return Value:
//       True indicates success; otherwise false.
var
  FORM_OnChar: function(hHandle: FPDF_FORMHANDLE; page: FPDF_PAGE; nChar, modifier: Integer): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API
// Function: FORM_GetFocusedText
//       Call this function to obtain the text within the current focused
//       field, if any.
// Parameters:
//       hHandle     -   Handle to the form fill module, as returned by
//                       FPDFDOC_InitFormFillEnvironment().
//       page        -   Handle to the page, as returned by FPDF_LoadPage().
//       buffer      -   Buffer for holding the form text, encoded in
//                       UTF-16LE. If NULL, |buffer| is not modified.
//       buflen      -   Length of |buffer| in bytes. If |buflen| is less
//                       than the length of the form text string, |buffer| is
//                       not modified.
// Return Value:
//       Length in bytes for the text in the focused field.
var
  FORM_GetFocusedText: function(hHandle: FPDF_FORMHANDLE; page: FPDF_PAGE; buffer: Pointer; buflen: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FORM_GetSelectedText
//       Call this function to obtain selected text within a form text
//       field or form combobox text field.
// Parameters:
//       hHandle     -   Handle to the form fill module, as returned by
//                       FPDFDOC_InitFormFillEnvironment().
//       page        -   Handle to the page, as returned by FPDF_LoadPage().
//       buffer      -   Buffer for holding the selected text, encoded in
//                       UTF-16LE. If NULL, |buffer| is not modified.
//       buflen      -   Length of |buffer| in bytes. If |buflen| is less
//                       than the length of the selected text string,
//                       |buffer| is not modified.
// Return Value:
//       Length in bytes of selected text in form text field or form combobox
//       text field.
var
  FORM_GetSelectedText: function(hHandle: FPDF_FORMHANDLE; page: FPDF_PAGE; buffer: Pointer; buflen: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API
// Function: FORM_ReplaceAndKeepSelection
//       Call this function to replace the selected text in a form
//       text field or user-editable form combobox text field with another
//       text string (which can be empty or non-empty). If there is no
//       selected text, this function will append the replacement text after
//       the current caret position. After the insertion, the inserted text
//       will be selected.
// Parameters:
//       hHandle     -   Handle to the form fill module, as returned by
//                       FPDFDOC_InitFormFillEnvironment().
//       page        -   Handle to the page, as Returned by FPDF_LoadPage().
//       wsText      -   The text to be inserted, in UTF-16LE format.
// Return Value:
//       None.
var
  FORM_ReplaceAndKeepSelection: procedure(hHandle: FPDF_FORMHANDLE; page: FPDF_PAGE; wsText: FPDF_WIDESTRING); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FORM_ReplaceSelection
//       Call this function to replace the selected text in a form
//       text field or user-editable form combobox text field with another
//       text string (which can be empty or non-empty). If there is no
//       selected text, this function will append the replacement text after
//       the current caret position. After the insertion, the selection range
//       will be set to empty.
// Parameters:
//       hHandle     -   Handle to the form fill module, as returned by
//                       FPDFDOC_InitFormFillEnvironment().
//       page        -   Handle to the page, as Returned by FPDF_LoadPage().
//       wsText      -   The text to be inserted, in UTF-16LE format.
// Return Value:
//       None.
var
  FORM_ReplaceSelection: procedure(hHandle: FPDF_FORMHANDLE; page: FPDF_PAGE; wsText: FPDF_WIDESTRING); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API
// Function: FORM_SelectAllText
//       Call this function to select all the text within the currently focused
//       form text field or form combobox text field.
// Parameters:
//       hHandle     -   Handle to the form fill module, as returned by
//                       FPDFDOC_InitFormFillEnvironment().
//       page        -   Handle to the page, as returned by FPDF_LoadPage().
// Return Value:
//       Whether the operation succeeded or not.
var
  FORM_SelectAllText: function(hHandle: FPDF_FORMHANDLE; page: FPDF_PAGE): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FORM_CanUndo
//       Find out if it is possible for the current focused widget in a given
//       form to perform an undo operation.
// Parameters:
//       hHandle     -   Handle to the form fill module, as returned by
//                       FPDFDOC_InitFormFillEnvironment().
//       page        -   Handle to the page, as returned by FPDF_LoadPage().
// Return Value:
//       True if it is possible to undo.
var
  FORM_CanUndo: function(hHandle: FPDF_FORMHANDLE; page: FPDF_PAGE): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FORM_CanRedo
//       Find out if it is possible for the current focused widget in a given
//       form to perform a redo operation.
// Parameters:
//       hHandle     -   Handle to the form fill module, as returned by
//                       FPDFDOC_InitFormFillEnvironment().
//       page        -   Handle to the page, as returned by FPDF_LoadPage().
// Return Value:
//       True if it is possible to redo.
var
  FORM_CanRedo: function(hHandle: FPDF_FORMHANDLE; page: FPDF_PAGE): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FORM_Undo
//       Make the current focused widget perform an undo operation.
// Parameters:
//       hHandle     -   Handle to the form fill module, as returned by
//                       FPDFDOC_InitFormFillEnvironment().
//       page        -   Handle to the page, as returned by FPDF_LoadPage().
// Return Value:
//       True if the undo operation succeeded.
var
  FORM_Undo: function(hHandle: FPDF_FORMHANDLE; page: FPDF_PAGE): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FORM_Redo
//       Make the current focused widget perform a redo operation.
// Parameters:
//       hHandle     -   Handle to the form fill module, as returned by
//                       FPDFDOC_InitFormFillEnvironment().
//       page        -   Handle to the page, as returned by FPDF_LoadPage().
// Return Value:
//       True if the redo operation succeeded.
var
  FORM_Redo: function(hHandle: FPDF_FORMHANDLE; page: FPDF_PAGE): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FORM_ForceToKillFocus.
//       Call this member function to force to kill the focus of the form
//       field which has focus. If it would kill the focus of a form field,
//       save the value of form field if was changed by theuser.
// Parameters:
//       hHandle     -   Handle to the form fill module, as returned by
//                       FPDFDOC_InitFormFillEnvironment().
// Return Value:
//       True indicates success; otherwise false.
var
  FORM_ForceToKillFocus: function(hHandle: FPDF_FORMHANDLE): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FORM_GetFocusedAnnot.
//       Call this member function to get the currently focused annotation.
// Parameters:
//       handle      -   Handle to the form fill module, as returned by
//                       FPDFDOC_InitFormFillEnvironment().
//       page_index  -   Buffer to hold the index number of the page which
//                       contains the focused annotation. 0 for the first page.
//                       Can't be NULL.
//       annot       -   Buffer to hold the focused annotation. Can't be NULL.
// Return Value:
//       On success, return true and write to the out parameters. Otherwise
//       return false and leave the out parameters unmodified.
// Comments:
//       Not currently supported for XFA forms - will report no focused
//       annotation.
//       Must call FPDFPage_CloseAnnot() when the annotation returned in |annot|
//       by this function is no longer needed.
//       This will return true and set |page_index| to -1 and |annot| to NULL,
//       if there is no focused annotation.
var
  FORM_GetFocusedAnnot: function(handle: FPDF_FORMHANDLE; var page_index: Integer;
    var annot: FPDF_ANNOTATION): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FORM_SetFocusedAnnot.
//       Call this member function to set the currently focused annotation.
// Parameters:
//       handle      -   Handle to the form fill module, as returned by
//                       FPDFDOC_InitFormFillEnvironment().
//       annot       -   Handle to an annotation.
// Return Value:
//       True indicates success; otherwise false.
// Comments:
//       |annot| can't be NULL. To kill focus, use FORM_ForceToKillFocus()
//       instead.
var
  FORM_SetFocusedAnnot: function(handle: FPDF_FORMHANDLE; annot: FPDF_ANNOTATION): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Form Field Types
// The names of the defines are stable, but the specific values associated with
// them are not, so do not hardcode their values.
const
  FPDF_FORMFIELD_UNKNOWN        = 0;   // Unknown.
  FPDF_FORMFIELD_PUSHBUTTON     = 1;   // push button type.
  FPDF_FORMFIELD_CHECKBOX       = 2;   // check box type.
  FPDF_FORMFIELD_RADIOBUTTON    = 3;   // radio button type.
  FPDF_FORMFIELD_COMBOBOX       = 4;   // combo box type.
  FPDF_FORMFIELD_LISTBOX        = 5;   // list box type.
  FPDF_FORMFIELD_TEXTFIELD      = 6;   // text field type.
  FPDF_FORMFIELD_SIGNATURE      = 7;   // text field type.
{$IFDEF PDF_ENABLE_XFA}
  FPDF_FORMFIELD_XFA            = 8;   // Generic XFA type.
  FPDF_FORMFIELD_XFA_CHECKBOX   = 9;   // XFA check box type.
  FPDF_FORMFIELD_XFA_COMBOBOX   = 10;  // XFA combo box type.
  FPDF_FORMFIELD_XFA_IMAGEFIELD = 11;  // XFA image field type.
  FPDF_FORMFIELD_XFA_LISTBOX    = 12;  // XFA list box type.
  FPDF_FORMFIELD_XFA_PUSHBUTTON = 13;  // XFA push button type.
  FPDF_FORMFIELD_XFA_SIGNATURE  = 14;  // XFA signture field type.
  FPDF_FORMFIELD_XFA_TEXTFIELD  = 15;  // XFA text field type.
{$ENDIF PDF_ENABLE_XFA}

{$IFDEF PDF_ENABLE_XFA}
  FPDF_FORMFIELD_COUNT = 16;
{$ELSE}
  FPDF_FORMFIELD_COUNT = 8;
{$ENDIF PDF_ENABLE_XFA}

{$IFDEF PDF_ENABLE_XFA}
function IS_XFA_FORMFIELD(type_: Integer): Boolean; inline;
{$ENDIF PDF_ENABLE_XFA}



// Function: FPDFPage_HasFormFieldAtPoint
//     Get the form field type by point.
// Parameters:
//     hHandle     -   Handle to the form fill module. Returned by
//                     FPDFDOC_InitFormFillEnvironment().
//     page        -   Handle to the page. Returned by FPDF_LoadPage().
//     page_x      -   X position in PDF "user space".
//     page_y      -   Y position in PDF "user space".
// Return Value:
//     Return the type of the form field; -1 indicates no field.
//     See field types above.
var
  FPDFPage_HasFormFieldAtPoint: function(hHandle: FPDF_FORMHANDLE; page: FPDF_PAGE; page_x, page_y: Double): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDFPage_FormFieldZOrderAtPoint
//     Get the form field z-order by point.
// Parameters:
//     hHandle     -   Handle to the form fill module. Returned by
//                     FPDFDOC_InitFormFillEnvironment().
//     page        -   Handle to the page. Returned by FPDF_LoadPage().
//     page_x      -   X position in PDF "user space".
//     page_y      -   Y position in PDF "user space".
// Return Value:
//     Return the z-order of the form field; -1 indicates no field.
//     Higher numbers are closer to the front.
var
  FPDFPage_FormFieldZOrderAtPoint: function(hHandle: FPDF_FORMHANDLE; page: FPDF_PAGE; page_x, page_y: Double): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_SetFormFieldHighlightColor
//       Set the highlight color of the specified (or all) form fields
//       in the document.
// Parameters:
//       hHandle     -   Handle to the form fill module, as returned by
//                       FPDFDOC_InitFormFillEnvironment().
//       doc         -   Handle to the document, as returned by
//                       FPDF_LoadDocument().
//       fieldType   -   A 32-bit integer indicating the type of a form
//                       field (defined above).
//       color       -   The highlight color of the form field. Constructed by
//                       0xxxrrggbb.
// Return Value:
//       None.
// Comments:
//       When the parameter fieldType is set to FPDF_FORMFIELD_UNKNOWN, the
//       highlight color will be applied to all the form fields in the
//       document.
//       Please refresh the client window to show the highlight immediately
//       if necessary.
var
  FPDF_SetFormFieldHighlightColor: procedure(hHandle: FPDF_FORMHANDLE; fieldType: Integer; Color: LongWord); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_SetFormFieldHighlightAlpha
//       Set the transparency of the form field highlight color in the
//       document.
// Parameters:
//       hHandle     -   Handle to the form fill module, as returned by
//                       FPDFDOC_InitFormFillEnvironment().
//       doc         -   Handle to the document, as returaned by
//                       FPDF_LoadDocument().
//       alpha       -   The transparency of the form field highlight color,
//                       between 0-255.
// Return Value:
//       None.
var
  FPDF_SetFormFieldHighlightAlpha: procedure(hHandle: FPDF_FORMHANDLE; alpha: Byte); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_RemoveFormFieldHighlight
//       Remove the form field highlight color in the document.
// Parameters:
//       hHandle     -   Handle to the form fill module, as returned by
//                       FPDFDOC_InitFormFillEnvironment().
// Return Value:
//       None.
// Comments:
//       Please refresh the client window to remove the highlight immediately
//       if necessary.
var
  FPDF_RemoveFormFieldHighlight: procedure(hHandle: FPDF_FORMHANDLE); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_FFLDraw
//       Render FormFields and popup window on a page to a device independent
//       bitmap.
// Parameters:
//       hHandle      -   Handle to the form fill module, as returned by
//                        FPDFDOC_InitFormFillEnvironment().
//       bitmap       -   Handle to the device independent bitmap (as the
//                        output buffer). Bitmap handles can be created by
//                        FPDFBitmap_Create().
//       page         -   Handle to the page, as returned by FPDF_LoadPage().
//       start_x      -   Left pixel position of the display area in the
//                        device coordinates.
//       start_y      -   Top pixel position of the display area in the device
//                        coordinates.
//       size_x       -   Horizontal size (in pixels) for displaying the page.
//       size_y       -   Vertical size (in pixels) for displaying the page.
//       rotate       -   Page orientation: 0 (normal), 1 (rotated 90 degrees
//                        clockwise), 2 (rotated 180 degrees), 3 (rotated 90
//                        degrees counter-clockwise).
//       flags        -   0 for normal display, or combination of flags
//                        defined above.
// Return Value:
//       None.
// Comments:
//       This function is designed to render annotations that are
//       user-interactive, which are widget annotations (for FormFields) and
//       popup annotations.
//       With the FPDF_ANNOT flag, this function will render a popup annotation
//       when users mouse-hover on a non-widget annotation. Regardless of
//       FPDF_ANNOT flag, this function will always render widget annotations
//       for FormFields.
//       In order to implement the FormFill functions, implementation should
//       call this function after rendering functions, such as
//       FPDF_RenderPageBitmap() or FPDF_RenderPageBitmap_Start(), have
//       finished rendering the page contents.
var
  FPDF_FFLDraw: procedure(hHandle: FPDF_FORMHANDLE; bitmap: FPDF_BITMAP; page: FPDF_PAGE;
    start_x, start_y, size_x, size_y, rotate, flags: Integer); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

{$IFDEF PDF_USE_SKIA}
var
  FPDF_FFLDrawSkia: procedure(hHandle: FPDF_FORMHANDLE; canvas: FPDF_SKIA_CANVAS; page: FPDF_PAGE;
    start_x, start_y, size_x, size_y, rotate, flags: Integer); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};
{$ENDIF PDF_USE_SKIA}

// Experimental API
// Function: FPDF_GetFormType
//           Returns the type of form contained in the PDF document.
// Parameters:
//           document - Handle to document.
// Return Value:
//           Integer value representing one of the FORMTYPE_ values.
// Comments:
//           If |document| is NULL, then the return value is FORMTYPE_NONE.
var
  FPDF_GetFormType: function(document: FPDF_DOCUMENT): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API
// Function: FORM_SetIndexSelected
//           Selects/deselects the value at the given |index| of the focused
//           annotation.
// Parameters:
//           hHandle     -   Handle to the form fill module. Returned by
//                           FPDFDOC_InitFormFillEnvironment.
//           page        -   Handle to the page. Returned by FPDF_LoadPage
//           index       -   0-based index of value to be set as
//                           selected/unselected
//           selected    -   true to select, false to deselect
// Return Value:
//           TRUE if the operation succeeded.
//           FALSE if the operation failed or widget is not a supported type.
// Comments:
//           Intended for use with listbox/combobox widget types. Comboboxes
//           have at most a single value selected at a time which cannot be
//           deselected. Deselect on a combobox is a no-op that returns false.
//           Default implementation is a no-op that will return false for
//           other types.
//           Not currently supported for XFA forms - will return false.
var
  FORM_SetIndexSelected: function(hHandle: FPDF_FORMHANDLE; page: FPDF_PAGE; index: Integer;
    selected: FPDF_BOOL): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API
// Function: FORM_IsIndexSelected
//           Returns whether or not the value at |index| of the focused
//           annotation is currently selected.
// Parameters:
//           hHandle     -   Handle to the form fill module. Returned by
//                           FPDFDOC_InitFormFillEnvironment.
//           page        -   Handle to the page. Returned by FPDF_LoadPage
//           index       -   0-based Index of value to check
// Return Value:
//           TRUE if value at |index| is currently selected.
//           FALSE if value at |index| is not selected or widget is not a
//           supported type.
// Comments:
//           Intended for use with listbox/combobox widget types. Default
//           implementation is a no-op that will return false for other types.
//           Not currently supported for XFA forms - will return false.
var
  FORM_IsIndexSelected: function(hHandle: FPDF_FORMHANDLE; page: FPDF_PAGE; index: Integer): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_LoadXFA
//          If the document consists of XFA fields, call this method to
//          attempt to load XFA fields.
// Parameters:
//          document     -   Handle to document from FPDF_LoadDocument().
// Return Value:
//          TRUE upon success, otherwise FALSE. If XFA support is not built
//          into PDFium, performs no action and always returns FALSE.
var
  FPDF_LoadXFA: function(document: FPDF_DOCUMENT): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};


// *** _FPDF_ANNOT_H_ ***

const
  FPDF_ANNOT_UNKNOWN = 0;
  FPDF_ANNOT_TEXT = 1;
  FPDF_ANNOT_LINK = 2;
  FPDF_ANNOT_FREETEXT = 3;
  FPDF_ANNOT_LINE = 4;
  FPDF_ANNOT_SQUARE = 5;
  FPDF_ANNOT_CIRCLE = 6;
  FPDF_ANNOT_POLYGON = 7;
  FPDF_ANNOT_POLYLINE = 8;
  FPDF_ANNOT_HIGHLIGHT = 9;
  FPDF_ANNOT_UNDERLINE = 10;
  FPDF_ANNOT_SQUIGGLY = 11;
  FPDF_ANNOT_STRIKEOUT = 12;
  FPDF_ANNOT_STAMP = 13;
  FPDF_ANNOT_CARET = 14;
  FPDF_ANNOT_INK = 15;
  FPDF_ANNOT_POPUP = 16;
  FPDF_ANNOT_FILEATTACHMENT = 17;
  FPDF_ANNOT_SOUND = 18;
  FPDF_ANNOT_MOVIE = 19;
  FPDF_ANNOT_WIDGET = 20;
  FPDF_ANNOT_SCREEN = 21;
  FPDF_ANNOT_PRINTERMARK = 22;
  FPDF_ANNOT_TRAPNET = 23;
  FPDF_ANNOT_WATERMARK = 24;
  FPDF_ANNOT_THREED = 25;
  FPDF_ANNOT_RICHMEDIA = 26;
  FPDF_ANNOT_XFAWIDGET = 27;
  FPDF_ANNOT_REDACT = 28;

  // Refer to PDF Reference (6th edition) table 8.16 for all annotation flags.
  FPDF_ANNOT_FLAG_NONE = 0;
  FPDF_ANNOT_FLAG_INVISIBLE = (1 shl 0);
  FPDF_ANNOT_FLAG_HIDDEN = (1 shl 1);
  FPDF_ANNOT_FLAG_PRINT = (1 shl 2);
  FPDF_ANNOT_FLAG_NOZOOM = (1 shl 3);
  FPDF_ANNOT_FLAG_NOROTATE = (1 shl 4);
  FPDF_ANNOT_FLAG_NOVIEW = (1 shl 5);
  FPDF_ANNOT_FLAG_READONLY = (1 shl 6);
  FPDF_ANNOT_FLAG_LOCKED = (1 shl 7);
  FPDF_ANNOT_FLAG_TOGGLENOVIEW = (1 shl 8);

  FPDF_ANNOT_APPEARANCEMODE_NORMAL = 0;
  FPDF_ANNOT_APPEARANCEMODE_ROLLOVER = 1;
  FPDF_ANNOT_APPEARANCEMODE_DOWN = 2;
  FPDF_ANNOT_APPEARANCEMODE_COUNT = 3;

  // Refer to PDF Reference version 1.7 table 8.70 for field flags common to all
  // interactive form field types.
  FPDF_FORMFLAG_NONE = 0;
  FPDF_FORMFLAG_READONLY = (1 shl 0);
  FPDF_FORMFLAG_REQUIRED = (1 shl 1);
  FPDF_FORMFLAG_NOEXPORT = (1 shl 2);

  // Refer to PDF Reference version 1.7 table 8.77 for field flags specific to
  // interactive form text fields.
  FPDF_FORMFLAG_TEXT_MULTILINE = (1 shl 12);
  FPDF_FORMFLAG_TEXT_PASSWORD  = (1 shl 13);

  // Refer to PDF Reference version 1.7 table 8.79 for field flags specific to
  // interactive form choice fields.
  FPDF_FORMFLAG_CHOICE_COMBO = (1 shl 17);
  FPDF_FORMFLAG_CHOICE_EDIT = (1 shl 18);
  FPDF_FORMFLAG_CHOICE_MULTI_SELECT = (1 shl 21);

  // Additional actions type of form field:
  //   K, on key stroke, JavaScript action.
  //   F, on format, JavaScript action.
  //   V, on validate, JavaScript action.
  //   C, on calculate, JavaScript action.
  FPDF_ANNOT_AACTION_KEY_STROKE = 12;
  FPDF_ANNOT_AACTION_FORMAT = 13;
  FPDF_ANNOT_AACTION_VALIDATE = 14;
  FPDF_ANNOT_AACTION_CALCULATE = 15;

type
  FPDFANNOT_COLORTYPE = (
    FPDFANNOT_COLORTYPE_Color = 0,
    FPDFANNOT_COLORTYPE_InteriorColor
  );

// Experimental API.
// Check if an annotation subtype is currently supported for creation.
// Currently supported subtypes:
//    - circle
//    - fileattachment
//    - freetext
//    - highlight
//    - ink
//    - link
//    - popup
//    - square,
//    - squiggly
//    - stamp
//    - strikeout
//    - text
//    - underline
//
//   subtype   - the subtype to be checked.
//
// Returns true if this subtype supported.
var
  FPDFAnnot_IsSupportedSubtype: function(subtype: FPDF_ANNOTATION_SUBTYPE): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Create an annotation in |page| of the subtype |subtype|. If the specified
// subtype is illegal or unsupported, then a new annotation will not be created.
// Must call FPDFPage_CloseAnnot() when the annotation returned by this
// function is no longer needed.
//
//   page      - handle to a page.
//   subtype   - the subtype of the new annotation.
//
// Returns a handle to the new annotation object, or NULL on failure.
var
  FPDFPage_CreateAnnot: function(page: FPDF_PAGE; subtype: FPDF_ANNOTATION_SUBTYPE): FPDF_ANNOTATION; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the number of annotations in |page|.
//
//   page   - handle to a page.
//
// Returns the number of annotations in |page|.
var
  FPDFPage_GetAnnotCount: function(page: FPDF_PAGE): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get annotation in |page| at |index|. Must call FPDFPage_CloseAnnot() when the
// annotation returned by this function is no longer needed.
//
//   page  - handle to a page.
//   index - the index of the annotation.
//
// Returns a handle to the annotation object, or NULL on failure.
var
  FPDFPage_GetAnnot: function(page: FPDF_PAGE; index: Integer): FPDF_ANNOTATION; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the index of |annot| in |page|. This is the opposite of
// FPDFPage_GetAnnot().
//
//   page  - handle to the page that the annotation is on.
//   annot - handle to an annotation.
//
// Returns the index of |annot|, or -1 on failure.
var
  FPDFPage_GetAnnotIndex: function(page: FPDF_PAGE; annot: FPDF_ANNOTATION): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Close an annotation. Must be called when the annotation returned by
// FPDFPage_CreateAnnot() or FPDFPage_GetAnnot() is no longer needed. This
// function does not remove the annotation from the document.
//
//   annot  - handle to an annotation.
var
  FPDFPage_CloseAnnot: procedure(annot: FPDF_ANNOTATION); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Remove the annotation in |page| at |index|.
//
//   page  - handle to a page.
//   index - the index of the annotation.
//
// Returns true if successful.
var
  FPDFPage_RemoveAnnot: function(page: FPDF_PAGE; index: Integer): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the subtype of an annotation.
//
//   annot  - handle to an annotation.
//
// Returns the annotation subtype.
var
  FPDFAnnot_GetSubtype: function(annot: FPDF_ANNOTATION): FPDF_ANNOTATION_SUBTYPE; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Check if an annotation subtype is currently supported for object extraction,
// update, and removal.
// Currently supported subtypes: ink and stamp.
//
//   subtype   - the subtype to be checked.
//
// Returns true if this subtype supported.
var
  FPDFAnnot_IsObjectSupportedSubtype: function(subtype: FPDF_ANNOTATION_SUBTYPE): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Update |obj| in |annot|. |obj| must be in |annot| already and must have
// been retrieved by FPDFAnnot_GetObject(). Currently, only ink and stamp
// annotations are supported by this API. Also note that only path, image, and
// text objects have APIs for modification; see FPDFPath_*(), FPDFText_*(), and
// FPDFImageObj_*().
//
//   annot  - handle to an annotation.
//   obj    - handle to the object that |annot| needs to update.
//
// Return true if successful.
var
  FPDFAnnot_UpdateObject: function(annot: FPDF_ANNOTATION; obj: FPDF_PAGEOBJECT): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Add a new InkStroke, represented by an array of points, to the InkList of
// |annot|. The API creates an InkList if one doesn't already exist in |annot|.
// This API works only for ink annotations. Please refer to ISO 32000-1:2008
// spec, section 12.5.6.13.
//
//   annot       - handle to an annotation.
//   points      - pointer to a FS_POINTF array representing input points.
//   point_count - number of elements in |points| array. This should not exceed
//                 the maximum value that can be represented by an int32_t).
//
// Returns the 0-based index at which the new InkStroke is added in the InkList
// of the |annot|. Returns -1 on failure.
var
  FPDFAnnot_AddInkStroke: function(annot: FPDF_ANNOTATION; const points: PFS_POINTF; point_count: SIZE_T): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Removes an InkList in |annot|.
// This API works only for ink annotations.
//
//   annot  - handle to an annotation.
//
// Return true on successful removal of /InkList entry from context of the
// non-null ink |annot|. Returns false on failure.
var
  FPDFAnnot_RemoveInkList: function(annot: FPDF_ANNOTATION): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Add |obj| to |annot|. |obj| must have been created by
// FPDFPageObj_CreateNew{Path|Rect}() or FPDFPageObj_New{Text|Image}Obj(), and
// will be owned by |annot|. Note that an |obj| cannot belong to more than one
// |annot|. Currently, only ink and stamp annotations are supported by this API.
// Also note that only path, image, and text objects have APIs for creation.
//
//   annot  - handle to an annotation.
//   obj    - handle to the object that is to be added to |annot|.
//
// Return true if successful.
var
  FPDFAnnot_AppendObject: function(annot: FPDF_ANNOTATION; obj: FPDF_PAGEOBJECT): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the total number of objects in |annot|, including path objects, text
// objects, external objects, image objects, and shading objects.
//
//   annot  - handle to an annotation.
//
// Returns the number of objects in |annot|.
var
  FPDFAnnot_GetObjectCount: function(annot: FPDF_ANNOTATION): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the object in |annot| at |index|.
//
//   annot  - handle to an annotation.
//   index  - the index of the object.
//
// Return a handle to the object, or NULL on failure.
var
  FPDFAnnot_GetObject: function(annot: FPDF_ANNOTATION; index: Integer): FPDF_PAGEOBJECT; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Remove the object in |annot| at |index|.
//
//   annot  - handle to an annotation.
//   index  - the index of the object to be removed.
//
// Return true if successful.
var
  FPDFAnnot_RemoveObject: function(annot: FPDF_ANNOTATION; index: Integer): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Set the color of an annotation. Fails when called on annotations with
// appearance streams already defined; instead use
// FPDFPath_Set{Stroke|Fill}Color().
//
//   annot    - handle to an annotation.
//   type     - type of the color to be set.
//   R, G, B  - buffer to hold the RGB value of the color. Ranges from 0 to 255.
//   A        - buffer to hold the opacity. Ranges from 0 to 255.
//
// Returns true if successful.
var
  FPDFAnnot_SetColor: function(annot: FPDF_ANNOTATION; type_: FPDFANNOT_COLORTYPE; R, G, B, A: Cardinal): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the color of an annotation. If no color is specified, default to yellow
// for highlight annotation, black for all else. Fails when called on
// annotations with appearance streams already defined; instead use
// FPDFPath_Get{Stroke|Fill}Color().
//
//   annot    - handle to an annotation.
//   type     - type of the color requested.
//   R, G, B  - buffer to hold the RGB value of the color. Ranges from 0 to 255.
//   A        - buffer to hold the opacity. Ranges from 0 to 255.
//
// Returns true if successful.
var
  FPDFAnnot_GetColor: function(annot: FPDF_ANNOTATION; type_: FPDFANNOT_COLORTYPE; var R, G, B, A: Cardinal): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Check if the annotation is of a type that has attachment points
// (i.e. quadpoints). Quadpoints are the vertices of the rectangle that
// encompasses the texts affected by the annotation. They provide the
// coordinates in the page where the annotation is attached. Only text markup
// annotations (i.e. highlight, strikeout, squiggly, and underline) and link
// annotations have quadpoints.
//
//   annot  - handle to an annotation.
//
// Returns true if the annotation is of a type that has quadpoints, false
// otherwise.
var
  FPDFAnnot_HasAttachmentPoints: function(annot: FPDF_ANNOTATION): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Replace the attachment points (i.e. quadpoints) set of an annotation at
// |quad_index|. This index needs to be within the result of
// FPDFAnnot_CountAttachmentPoints().
// If the annotation's appearance stream is defined and this annotation is of a
// type with quadpoints, then update the bounding box too if the new quadpoints
// define a bigger one.
//
//   annot       - handle to an annotation.
//   quad_index  - index of the set of quadpoints.
//   quad_points - the quadpoints to be set.
//
// Returns true if successful.
var
  FPDFAnnot_SetAttachmentPoints: function(annot: FPDF_ANNOTATION; quad_index: SIZE_T; quad_points: PFS_QUADPOINTSF): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Append to the list of attachment points (i.e. quadpoints) of an annotation.
// If the annotation's appearance stream is defined and this annotation is of a
// type with quadpoints, then update the bounding box too if the new quadpoints
// define a bigger one.
//
//   annot       - handle to an annotation.
//   quad_points - the quadpoints to be set.
//
// Returns true if successful.
var
  FPDFAnnot_AppendAttachmentPoints: function(annot: FPDF_ANNOTATION; quad_points: PFS_QUADPOINTSF): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the number of sets of quadpoints of an annotation.
//
//   annot  - handle to an annotation.
//
// Returns the number of sets of quadpoints, or 0 on failure.
var
  FPDFAnnot_CountAttachmentPoints: function(annot: FPDF_ANNOTATION): SIZE_T; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the attachment points (i.e. quadpoints) of an annotation.
//
//   annot       - handle to an annotation.
//   quad_index  - index of the set of quadpoints.
//   quad_points - receives the quadpoints; must not be NULL.
//
// Returns true if successful.
var
  FPDFAnnot_GetAttachmentPoints: function(annot: FPDF_ANNOTATION; quad_index: SIZE_T; quad_points: PFS_QUADPOINTSF): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Set the annotation rectangle defining the location of the annotation. If the
// annotation's appearance stream is defined and this annotation is of a type
// without quadpoints, then update the bounding box too if the new rectangle
// defines a bigger one.
//
//   annot  - handle to an annotation.
//   rect   - the annotation rectangle to be set.
//
// Returns true if successful.
var
  FPDFAnnot_SetRect: function(annot: FPDF_ANNOTATION; rect: PFS_RECTF): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the annotation rectangle defining the location of the annotation.
//
//   annot  - handle to an annotation.
//   rect   - receives the rectangle; must not be NULL.
//
// Returns true if successful.
var
  FPDFAnnot_GetRect: function(annot: FPDF_ANNOTATION; rect: PFS_RECTF): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the vertices of a polygon or polyline annotation. |buffer| is an array of
// points of the annotation. If |length| is less than the returned length, or
// |annot| or |buffer| is NULL, |buffer| will not be modified.
//
//   annot  - handle to an annotation, as returned by e.g. FPDFPage_GetAnnot()
//   buffer - buffer for holding the points.
//   length - length of the buffer in points.
//
// Returns the number of points if the annotation is of type polygon or
// polyline, 0 otherwise.
var
  FPDFAnnot_GetVertices: function(annot: FPDF_ANNOTATION; buffer: PFS_POINTF; length: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the number of paths in the ink list of an ink annotation.
//
//   annot  - handle to an annotation, as returned by e.g. FPDFPage_GetAnnot()
//
// Returns the number of paths in the ink list if the annotation is of type ink,
// 0 otherwise.
var
  FPDFAnnot_GetInkListCount: function(annot: FPDF_ANNOTATION): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get a path in the ink list of an ink annotation. |buffer| is an array of
// points of the path. If |length| is less than the returned length, or |annot|
// or |buffer| is NULL, |buffer| will not be modified.
//
//   annot  - handle to an annotation, as returned by e.g. FPDFPage_GetAnnot()
//   path_index - index of the path
//   buffer - buffer for holding the points.
//   length - length of the buffer in points.
//
// Returns the number of points of the path if the annotation is of type ink, 0
// otherwise.
var
  FPDFAnnot_GetInkListPath: function(annot: FPDF_ANNOTATION; path_index: LongWord; buffer: PFS_POINTF;
    length: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the starting and ending coordinates of a line annotation.
//
//   annot  - handle to an annotation, as returned by e.g. FPDFPage_GetAnnot()
//   start - starting point
//   end - ending point
//
// Returns true if the annotation is of type line, |start| and |end| are not
// NULL, false otherwise.
var
  FPDFAnnot_GetLine: function(annot: FPDF_ANNOTATION; start, end_: PFS_POINTF): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Set the characteristics of the annotation's border (rounded rectangle).
//
//   annot              - handle to an annotation
//   horizontal_radius  - horizontal corner radius, in default user space units
//   vertical_radius    - vertical corner radius, in default user space units
//   border_width       - border width, in default user space units
//
// Returns true if setting the border for |annot| succeeds, false otherwise.
//
// If |annot| contains an appearance stream that overrides the border values,
// then the appearance stream will be removed on success.
var
  FPDFAnnot_SetBorder: function(annot: FPDF_ANNOTATION; horizontal_radius, vertical_radius, border_width: Single): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the characteristics of the annotation's border (rounded rectangle).
//
//   annot              - handle to an annotation
//   horizontal_radius  - horizontal corner radius, in default user space units
//   vertical_radius    - vertical corner radius, in default user space units
//   border_width       - border width, in default user space units
//
// Returns true if |horizontal_radius|, |vertical_radius| and |border_width| are
// not NULL, false otherwise.
var
  FPDFAnnot_GetBorder: function(annot: FPDF_ANNOTATION; var horizontal_radius, vertical_radius, border_width: Single): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the JavaScript of an event of the annotation's additional actions.
// |buffer| is only modified if |buflen| is large enough to hold the whole
// JavaScript string. If |buflen| is smaller, the total size of the JavaScript
// is still returned, but nothing is copied.  If there is no JavaScript for
// |event| in |annot|, an empty string is written to |buf| and 2 is returned,
// denoting the size of the null terminator in the buffer.  On other errors,
// nothing is written to |buffer| and 0 is returned.
//
//    hHandle     -   handle to the form fill module, returned by
//                    FPDFDOC_InitFormFillEnvironment().
//    annot       -   handle to an interactive form annotation.
//    event       -   event type, one of the FPDF_ANNOT_AACTION_* values.
//    buffer      -   buffer for holding the value string, encoded in UTF-16LE.
//    buflen      -   length of the buffer in bytes.
//
// Returns the length of the string value in bytes, including the 2-byte
// null terminator.
var
  FPDFAnnot_GetFormAdditionalActionJavaScript: function(hHandle: FPDF_FORMHANDLE; annot: FPDF_ANNOTATION;
    event: Integer; buffer: PFPDF_WCHAR; buflen: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Check if |annot|'s dictionary has |key| as a key.
//
//   annot  - handle to an annotation.
//   key    - the key to look for, encoded in UTF-8.
//
// Returns true if |key| exists.
var
  FPDFAnnot_HasKey: function(annot: FPDF_ANNOTATION; key: FPDF_BYTESTRING): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the type of the value corresponding to |key| in |annot|'s dictionary.
//
//   annot  - handle to an annotation.
//   key    - the key to look for, encoded in UTF-8.
//
// Returns the type of the dictionary value.
var
  FPDFAnnot_GetValueType: function(annot: FPDF_ANNOTATION; key: FPDF_BYTESTRING): FPDF_OBJECT_TYPE; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Set the string value corresponding to |key| in |annot|'s dictionary,
// overwriting the existing value if any. The value type would be
// FPDF_OBJECT_STRING after this function call succeeds.
//
//   annot  - handle to an annotation.
//   key    - the key to the dictionary entry to be set, encoded in UTF-8.
//   value  - the string value to be set, encoded in UTF-16LE.
//
// Returns true if successful.
var
  FPDFAnnot_SetStringValue: function(annot: FPDF_ANNOTATION; key: FPDF_BYTESTRING; value: FPDF_WIDESTRING): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the string value corresponding to |key| in |annot|'s dictionary. |buffer|
// is only modified if |buflen| is longer than the length of contents. Note that
// if |key| does not exist in the dictionary or if |key|'s corresponding value
// in the dictionary is not a string (i.e. the value is not of type
// FPDF_OBJECT_STRING or FPDF_OBJECT_NAME), then an empty string would be copied
// to |buffer| and the return value would be 2. On other errors, nothing would
// be added to |buffer| and the return value would be 0.
//
//   annot  - handle to an annotation.
//   key    - the key to the requested dictionary entry, encoded in UTF-8.
//   buffer - buffer for holding the value string, encoded in UTF-16LE.
//   buflen - length of the buffer in bytes.
//
// Returns the length of the string value in bytes.
var
  FPDFAnnot_GetStringValue: function(annot: FPDF_ANNOTATION; key: FPDF_BYTESTRING; buffer: PFPDF_WCHAR;
    buflen: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the float value corresponding to |key| in |annot|'s dictionary. Writes
// value to |value| and returns True if |key| exists in the dictionary and
// |key|'s corresponding value is a number (FPDF_OBJECT_NUMBER), False
// otherwise.
//
//   annot  - handle to an annotation.
//   key    - the key to the requested dictionary entry, encoded in UTF-8.
//   value  - receives the value, must not be NULL.
//
// Returns True if value found, False otherwise.
var
  FPDFAnnot_GetNumberValue: function(annot: FPDF_ANNOTATION; key: FPDF_BYTESTRING; value: PSingle): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Set the AP (appearance string) in |annot|'s dictionary for a given
// |appearanceMode|.
//
//   annot          - handle to an annotation.
//   appearanceMode - the appearance mode (normal, rollover or down) for which
//                    to get the AP.
//   value          - the string value to be set, encoded in UTF-16LE. If
//                    nullptr is passed, the AP is cleared for that mode. If the
//                    mode is Normal, APs for all modes are cleared.
//
// Returns true if successful.
var
  FPDFAnnot_SetAP: function(annot: FPDF_ANNOTATION; appearanceMode: FPDF_ANNOT_APPEARANCEMODE;
    value: FPDF_WIDESTRING): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the AP (appearance string) from |annot|'s dictionary for a given
// |appearanceMode|.
// |buffer| is only modified if |buflen| is large enough to hold the whole AP
// string. If |buflen| is smaller, the total size of the AP is still returned,
// but nothing is copied.
// If there is no appearance stream for |annot| in |appearanceMode|, an empty
// string is written to |buf| and 2 is returned.
// On other errors, nothing is written to |buffer| and 0 is returned.
//
//   annot          - handle to an annotation.
//   appearanceMode - the appearance mode (normal, rollover or down) for which
//                    to get the AP.
//   buffer         - buffer for holding the value string, encoded in UTF-16LE.
//   buflen         - length of the buffer in bytes.
//
// Returns the length of the string value in bytes.
var
  FPDFAnnot_GetAP: function(annot: FPDF_ANNOTATION; appearanceMode: FPDF_ANNOT_APPEARANCEMODE; buffer: PFPDF_WCHAR;
    buflen: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the annotation corresponding to |key| in |annot|'s dictionary. Common
// keys for linking annotations include "IRT" and "Popup". Must call
// FPDFPage_CloseAnnot() when the annotation returned by this function is no
// longer needed.
//
//   annot  - handle to an annotation.
//   key    - the key to the requested dictionary entry, encoded in UTF-8.
//
// Returns a handle to the linked annotation object, or NULL on failure.
var
  FPDFAnnot_GetLinkedAnnot: function(annot: FPDF_ANNOTATION; key: FPDF_BYTESTRING): FPDF_ANNOTATION; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the annotation flags of |annot|.
//
//   annot    - handle to an annotation.
//
// Returns the annotation flags.
var
  FPDFAnnot_GetFlags: function(annot: FPDF_ANNOTATION): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Set the |annot|'s flags to be of the value |flags|.
//
//   annot      - handle to an annotation.
//   flags      - the flag values to be set.
//
// Returns true if successful.
var
  FPDFAnnot_SetFlags: function(annot: FPDF_ANNOTATION; flags: Integer): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the annotation flags of |annot|.
//
//    hHandle     -   handle to the form fill module, returned by
//                    FPDFDOC_InitFormFillEnvironment().
//    annot       -   handle to an interactive form annotation.
//
// Returns the annotation flags specific to interactive forms.
var
  FPDFAnnot_GetFormFieldFlags: function(hHandle: FPDF_FORMHANDLE; annot: FPDF_ANNOTATION): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Retrieves an interactive form annotation whose rectangle contains a given
// point on a page. Must call FPDFPage_CloseAnnot() when the annotation returned
// is no longer needed.
//
//
//    hHandle     -   handle to the form fill module, returned by
//                    FPDFDOC_InitFormFillEnvironment().
//    page        -   handle to the page, returned by FPDF_LoadPage function.
//    point       -   position in PDF "user space".
//
// Returns the interactive form annotation whose rectangle contains the given
// coordinates on the page. If there is no such annotation, return NULL.
var
  FPDFAnnot_GetFormFieldAtPoint: function(hHandle: FPDF_FORMHANDLE; page: FPDF_PAGE;
    const point: PFS_POINTF): FPDF_ANNOTATION; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Gets the name of |annot|, which is an interactive form annotation.
// |buffer| is only modified if |buflen| is longer than the length of contents.
// In case of error, nothing will be added to |buffer| and the return value will
// be 0. Note that return value of empty string is 2 for "\0\0".
//
//    hHandle     -   handle to the form fill module, returned by
//                    FPDFDOC_InitFormFillEnvironment().
//    annot       -   handle to an interactive form annotation.
//    buffer      -   buffer for holding the name string, encoded in UTF-16LE.
//    buflen      -   length of the buffer in bytes.
//
// Returns the length of the string value in bytes.
var
  FPDFAnnot_GetFormFieldName: function(hHandle: FPDF_FORMHANDLE; annot: FPDF_ANNOTATION; buffer: PFPDF_WCHAR;
    buflen: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Gets the alternate name of |annot|, which is an interactive form annotation.
// |buffer| is only modified if |buflen| is longer than the length of contents.
// In case of error, nothing will be added to |buffer| and the return value will
// be 0. Note that return value of empty string is 2 for "\0\0".
//
//    hHandle     -   handle to the form fill module, returned by
//                    FPDFDOC_InitFormFillEnvironment().
//    annot       -   handle to an interactive form annotation.
//    buffer      -   buffer for holding the alternate name string, encoded in
//                    UTF-16LE.
//    buflen      -   length of the buffer in bytes.
//
// Returns the length of the string value in bytes.
var
  FPDFAnnot_GetFormFieldAlternateName: function(hHandle: FPDF_FORMHANDLE; annot: FPDF_ANNOTATION; buffer: PFPDF_WCHAR;
    buflen: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Gets the form field type of |annot|, which is an interactive form annotation.
//
//    hHandle     -   handle to the form fill module, returned by
//                    FPDFDOC_InitFormFillEnvironment().
//    annot       -   handle to an interactive form annotation.
//
// Returns the type of the form field (one of the FPDF_FORMFIELD_* values) on
// success. Returns -1 on error.
// See field types in fpdf_formfill.h.
var
  FPDFAnnot_GetFormFieldType: function(hHandle: FPDF_FORMHANDLE; annot: FPDF_ANNOTATION): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Gets the value of |annot|, which is an interactive form annotation.
// |buffer| is only modified if |buflen| is longer than the length of contents.
// In case of error, nothing will be added to |buffer| and the return value will
// be 0. Note that return value of empty string is 2 for "\0\0".
//
//    hHandle     -   handle to the form fill module, returned by
//                    FPDFDOC_InitFormFillEnvironment().
//    annot       -   handle to an interactive form annotation.
//    buffer      -   buffer for holding the value string, encoded in UTF-16LE.
//    buflen      -   length of the buffer in bytes.
//
// Returns the length of the string value in bytes.
var
  FPDFAnnot_GetFormFieldValue: function(hHandle: FPDF_FORMHANDLE; annot: FPDF_ANNOTATION; buffer: PFPDF_WCHAR;
    buflen: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the number of options in the |annot|'s "Opt" dictionary. Intended for
// use with listbox and combobox widget annotations.
//
//   hHandle - handle to the form fill module, returned by
//             FPDFDOC_InitFormFillEnvironment.
//   annot   - handle to an annotation.
//
// Returns the number of options in "Opt" dictionary on success. Return value
// will be -1 if annotation does not have an "Opt" dictionary or other error.
var
  FPDFAnnot_GetOptionCount: function(hHandle: FPDF_FORMHANDLE; annot: FPDF_ANNOTATION): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the string value for the label of the option at |index| in |annot|'s
// "Opt" dictionary. Intended for use with listbox and combobox widget
// annotations. |buffer| is only modified if |buflen| is longer than the length
// of contents. If index is out of range or in case of other error, nothing
// will be added to |buffer| and the return value will be 0. Note that
// return value of empty string is 2 for "\0\0".
//
//   hHandle - handle to the form fill module, returned by
//             FPDFDOC_InitFormFillEnvironment.
//   annot   - handle to an annotation.
//   index   - numeric index of the option in the "Opt" array
//   buffer  - buffer for holding the value string, encoded in UTF-16LE.
//   buflen  - length of the buffer in bytes.
//
// Returns the length of the string value in bytes.
// If |annot| does not have an "Opt" array, |index| is out of range or if any
// other error occurs, returns 0.
var
  FPDFAnnot_GetOptionLabel: function(hHandle: FPDF_FORMHANDLE; annot: FPDF_ANNOTATION; index: Integer;
    buffer: PFPDF_WCHAR; buflen: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Determine whether or not the option at |index| in |annot|'s "Opt" dictionary
// is selected. Intended for use with listbox and combobox widget annotations.
//
//   handle  - handle to the form fill module, returned by
//             FPDFDOC_InitFormFillEnvironment.
//   annot   - handle to an annotation.
//   index   - numeric index of the option in the "Opt" array.
//
// Returns true if the option at |index| in |annot|'s "Opt" dictionary is
// selected, false otherwise.
var
  FPDFAnnot_IsOptionSelected: function(handle: FPDF_FORMHANDLE; annot: FPDF_ANNOTATION; index: Integer): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the float value of the font size for an |annot| with variable text.
// If 0, the font is to be auto-sized: its size is computed as a function of
// the height of the annotation rectangle.
//
//   hHandle - handle to the form fill module, returned by
//             FPDFDOC_InitFormFillEnvironment.
//   annot   - handle to an annotation.
//   value   - Required. Float which will be set to font size on success.
//
// Returns true if the font size was set in |value|, false on error or if
// |value| not provided.
var
  FPDFAnnot_GetFontSize: function(hHandle: FPDF_FORMHANDLE; annot: FPDF_ANNOTATION; var value: Single): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get the RGB value of the font color for an |annot| with variable text.
//
//   hHandle  - handle to the form fill module, returned by
//              FPDFDOC_InitFormFillEnvironment.
//   annot    - handle to an annotation.
//   R, G, B  - buffer to hold the RGB value of the color. Ranges from 0 to 255.
//
// Returns true if the font color was set, false on error or if the font
// color was not provided.
var
  FPDFAnnot_GetFontColor: function(hHandle: FPDF_FORMHANDLE; annot: FPDF_ANNOTATION; var R, G, B: Cardinal): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Determine if |annot| is a form widget that is checked. Intended for use with
// checkbox and radio button widgets.
//
//   hHandle - handle to the form fill module, returned by
//             FPDFDOC_InitFormFillEnvironment.
//   annot   - handle to an annotation.
//
// Returns true if |annot| is a form widget and is checked, false otherwise.
var
  FPDFAnnot_IsChecked: function(hHandle: FPDF_FORMHANDLE; annot: FPDF_ANNOTATION): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Set the list of focusable annotation subtypes. Annotations of subtype
// FPDF_ANNOT_WIDGET are by default focusable. New subtypes set using this API
// will override the existing subtypes.
//
//   hHandle  - handle to the form fill module, returned by
//              FPDFDOC_InitFormFillEnvironment.
//   subtypes - list of annotation subtype which can be tabbed over.
//   count    - total number of annotation subtype in list.
// Returns true if list of annotation subtype is set successfully, false
// otherwise.
var
  FPDFAnnot_SetFocusableSubtypes: function(hHandle: FPDF_FORMHANDLE; const subtypes: PFPDF_ANNOTATION_SUBTYPE;
    count: SIZE_T): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the count of focusable annotation subtypes as set by host
// for a |hHandle|.
//
//   hHandle  - handle to the form fill module, returned by
//              FPDFDOC_InitFormFillEnvironment.
// Returns the count of focusable annotation subtypes or -1 on error.
// Note : Annotations of type FPDF_ANNOT_WIDGET are by default focusable.
var
  FPDFAnnot_GetFocusableSubtypesCount: function(hHandle: FPDF_FORMHANDLE): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the list of focusable annotation subtype as set by host.
//
//   hHandle  - handle to the form fill module, returned by
//              FPDFDOC_InitFormFillEnvironment.
//   subtypes - receives the list of annotation subtype which can be tabbed
//              over. Caller must have allocated |subtypes| more than or
//              equal to the count obtained from
//              FPDFAnnot_GetFocusableSubtypesCount() API.
//   count    - size of |subtypes|.
// Returns true on success and set list of annotation subtype to |subtypes|,
// false otherwise.
// Note : Annotations of type FPDF_ANNOT_WIDGET are by default focusable.
var
  FPDFAnnot_GetFocusableSubtypes: function(hHandle: FPDF_FORMHANDLE; subtypes: PFPDF_ANNOTATION_SUBTYPE;
    count: SIZE_T): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Gets FPDF_LINK object for |annot|. Intended to use for link annotations.
//
//   annot   - handle to an annotation.
//
// Returns FPDF_LINK from the FPDF_ANNOTATION and NULL on failure,
// if the input annot is NULL or input annot's subtype is not link.
var
  FPDFAnnot_GetLink: function(annot: FPDF_ANNOTATION): FPDF_LINK; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Gets the count of annotations in the |annot|'s control group.
// A group of interactive form annotations is collectively called a form
// control group. Here, |annot|, an interactive form annotation, should be
// either a radio button or a checkbox.
//
//   hHandle - handle to the form fill module, returned by
//             FPDFDOC_InitFormFillEnvironment.
//   annot   - handle to an annotation.
//
// Returns number of controls in its control group or -1 on error.
var
  FPDFAnnot_GetFormControlCount: function(hHandle: FPDF_FORMHANDLE; annot: FPDF_ANNOTATION): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Gets the index of |annot| in |annot|'s control group.
// A group of interactive form annotations is collectively called a form
// control group. Here, |annot|, an interactive form annotation, should be
// either a radio button or a checkbox.
//
//   hHandle - handle to the form fill module, returned by
//             FPDFDOC_InitFormFillEnvironment.
//   annot   - handle to an annotation.
//
// Returns index of a given |annot| in its control group or -1 on error.
var
  FPDFAnnot_GetFormControlIndex: function(hHandle: FPDF_FORMHANDLE; annot: FPDF_ANNOTATION): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Gets the export value of |annot| which is an interactive form annotation.
// Intended for use with radio button and checkbox widget annotations.
// |buffer| is only modified if |buflen| is longer than the length of contents.
// In case of error, nothing will be added to |buffer| and the return value
// will be 0. Note that return value of empty string is 2 for "\0\0".
//
//    hHandle     -   handle to the form fill module, returned by
//                    FPDFDOC_InitFormFillEnvironment().
//    annot       -   handle to an interactive form annotation.
//    buffer      -   buffer for holding the value string, encoded in UTF-16LE.
//    buflen      -   length of the buffer in bytes.
//
// Returns the length of the string value in bytes.
var
  FPDFAnnot_GetFormFieldExportValue: function(hHandle: FPDF_FORMHANDLE; annot: FPDF_ANNOTATION;
    buffer: PFPDF_WCHAR; buflen: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Add a URI action to |annot|, overwriting the existing action, if any.
//
//   annot  - handle to a link annotation.
//   uri    - the URI to be set, encoded in 7-bit ASCII.
//
// Returns true if successful.
var
  FPDFAnnot_SetURI: function(annot: FPDF_ANNOTATION; uri: PAnsiChar): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the attachment from |annot|.
//
//   annot - handle to a file annotation.
//
// Returns the handle to the attachment object, or NULL on failure.
var
  FPDFAnnot_GetFileAttachment: function(annot: FPDF_ANNOTATION): FPDF_ATTACHMENT; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Add an embedded file with |name| to |annot|.
//
//   annot    - handle to a file annotation.
//   name     - name of the new attachment.
//
// Returns a handle to the new attachment object, or NULL on failure.
var
  FPDFAnnot_AddFileAttachment: function(annot: FPDF_ANNOTATION; name: FPDF_WIDESTRING): FPDF_ATTACHMENT; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// *** _FPDF_CATALOG_H_ ***

// Experimental API.
//
// Determine if |document| represents a tagged PDF.
//
// For the definition of tagged PDF, See (see 10.7 "Tagged PDF" in PDF
// Reference 1.7).
//
//   document - handle to a document.
//
// Returns |true| iff |document| is a tagged PDF.
var
  FPDFCatalog_IsTagged: function(document: FPDF_DOCUMENT): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};


// *** _FPDF_ATTACHMENT_H_ ***

// Experimental API.
// Get the number of embedded files in |document|.
//
//   document - handle to a document.
//
// Returns the number of embedded files in |document|.
var
  FPDFDoc_GetAttachmentCount: function(document: FPDF_DOCUMENT): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Add an embedded file with |name| in |document|. If |name| is empty, or if
// |name| is the name of a existing embedded file in |document|, or if
// |document|'s embedded file name tree is too deep (i.e. |document| has too
// many embedded files already), then a new attachment will not be added.
//
//   document - handle to a document.
//   name     - name of the new attachment.
//
// Returns a handle to the new attachment object, or NULL on failure.
var
  FPDFDoc_AddAttachment: function(document: FPDF_DOCUMENT; name: FPDF_WIDESTRING): FPDF_ATTACHMENT; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the embedded attachment at |index| in |document|. Note that the returned
// attachment handle is only valid while |document| is open.
//
//   document - handle to a document.
//   index    - the index of the requested embedded file.
//
// Returns the handle to the attachment object, or NULL on failure.
var
  FPDFDoc_GetAttachment: function(document: FPDF_DOCUMENT; index: Integer): FPDF_ATTACHMENT; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Delete the embedded attachment at |index| in |document|. Note that this does
// not remove the attachment data from the PDF file; it simply removes the
// file's entry in the embedded files name tree so that it does not appear in
// the attachment list. This behavior may change in the future.
//
//   document - handle to a document.
//   index    - the index of the embedded file to be deleted.
//
// Returns true if successful.
var
  FPDFDoc_DeleteAttachment: function(document: FPDF_DOCUMENT; index: Integer): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the name of the |attachment| file. |buffer| is only modified if |buflen|
// is longer than the length of the file name. On errors, |buffer| is unmodified
// and the returned length is 0.
//
//   attachment - handle to an attachment.
//   buffer     - buffer for holding the file name, encoded in UTF-16LE.
//   buflen     - length of the buffer in bytes.
//
// Returns the length of the file name in bytes.
var
  FPDFAttachment_GetName: function(attachment: FPDF_ATTACHMENT; buffer: PFPDF_WCHAR; buflen: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Check if the params dictionary of |attachment| has |key| as a key.
//
//   attachment - handle to an attachment.
//   key        - the key to look for, encoded in UTF-8.
//
// Returns true if |key| exists.
var
  FPDFAttachment_HasKey: function(attachment: FPDF_ATTACHMENT; key: FPDF_BYTESTRING): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the type of the value corresponding to |key| in the params dictionary of
// the embedded |attachment|.
//
//   attachment - handle to an attachment.
//   key        - the key to look for, encoded in UTF-8.
//
// Returns the type of the dictionary value.
var
  FPDFAttachment_GetValueType: function(attachment: FPDF_ATTACHMENT; key: FPDF_BYTESTRING): FPDF_OBJECT_TYPE; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Set the string value corresponding to |key| in the params dictionary of the
// embedded file |attachment|, overwriting the existing value if any. The value
// type should be FPDF_OBJECT_STRING after this function call succeeds.
//
//   attachment - handle to an attachment.
//   key        - the key to the dictionary entry, encoded in UTF-8.
//   value      - the string value to be set, encoded in UTF-16LE.
//
// Returns true if successful.
var
  FPDFAttachment_SetStringValue: function(attachment: FPDF_ATTACHMENT; key: FPDF_BYTESTRING;
    value: FPDF_WIDESTRING): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the string value corresponding to |key| in the params dictionary of the
// embedded file |attachment|. |buffer| is only modified if |buflen| is longer
// than the length of the string value. Note that if |key| does not exist in the
// dictionary or if |key|'s corresponding value in the dictionary is not a
// string (i.e. the value is not of type FPDF_OBJECT_STRING or
// FPDF_OBJECT_NAME), then an empty string would be copied to |buffer| and the
// return value would be 2. On other errors, nothing would be added to |buffer|
// and the return value would be 0.
//
//   attachment - handle to an attachment.
//   key        - the key to the requested string value, encoded in UTF-8.
//   buffer     - buffer for holding the string value encoded in UTF-16LE.
//   buflen     - length of the buffer in bytes.
//
// Returns the length of the dictionary value string in bytes.
var
  FPDFAttachment_GetStringValue: function(attachment: FPDF_ATTACHMENT; key: FPDF_BYTESTRING; buffer: PFPDF_WCHAR;
    buflen: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Set the file data of |attachment|, overwriting the existing file data if any.
// The creation date and checksum will be updated, while all other dictionary
// entries will be deleted. Note that only contents with |len| smaller than
// INT_MAX is supported.
//
//   attachment - handle to an attachment.
//   contents   - buffer holding the file data to write to |attachment|.
//   len        - length of file data in bytes.
//
// Returns true if successful.
var
  FPDFAttachment_SetFile: function(attachment: FPDF_ATTACHMENT; document: FPDF_DOCUMENT;
    contents: Pointer; len: LongWord): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the file data of |attachment|.
// When the attachment file data is readable, true is returned, and |out_buflen|
// is updated to indicate the file data size. |buffer| is only modified if
// |buflen| is non-null and long enough to contain the entire file data. Callers
// must check both the return value and the input |buflen| is no less than the
// returned |out_buflen| before using the data.
//
// Otherwise, when the attachment file data is unreadable or when |out_buflen|
// is null, false is returned and |buffer| and |out_buflen| remain unmodified.
//
//   attachment - handle to an attachment.
//   buffer     - buffer for holding the file data from |attachment|.
//   buflen     - length of the buffer in bytes.
//   out_buflen - pointer to the variable that will receive the minimum buffer
//                size to contain the file data of |attachment|.
//
// Returns true on success, false otherwise.
var
  FPDFAttachment_GetFile: function(attachment: FPDF_ATTACHMENT; buffer: Pointer; buflen: LongWord;
    var out_buflen: LongWord): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};


// *** _FPDF_FWLEVENT_H_ ***

// Key flags.
type
  FWL_EVENTFLAG = Integer;
const
  FWL_EVENTFLAG_ShiftKey = 1 shl 0;
  FWL_EVENTFLAG_ControlKey = 1 shl 1;
  FWL_EVENTFLAG_AltKey = 1 shl 2;
  FWL_EVENTFLAG_MetaKey = 1 shl 3;
  FWL_EVENTFLAG_KeyPad = 1 shl 4;
  FWL_EVENTFLAG_AutoRepeat = 1 shl 5;
  FWL_EVENTFLAG_LeftButtonDown = 1 shl 6;
  FWL_EVENTFLAG_MiddleButtonDown = 1 shl 7;
  FWL_EVENTFLAG_RightButtonDown = 1 shl 8;

type
  FWL_VKEYCODE = Integer; // note: FWL_VKEY_* equals Windows.VK_*


// *** _FPDF_TRANSFORMPAGE_H_ ***

// Set "MediaBox" entry to the page dictionary.
//
// page   - Handle to a page.
// left   - The left of the rectangle.
// bottom - The bottom of the rectangle.
// right  - The right of the rectangle.
// top    - The top of the rectangle.
var
  FPDFPage_SetMediaBox: procedure(page: FPDF_PAGE; left, bottom, right, top: Single); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Set "CropBox" entry to the page dictionary.
//
// page   - Handle to a page.
// left   - The left of the rectangle.
// bottom - The bottom of the rectangle.
// right  - The right of the rectangle.
// top    - The top of the rectangle.
var
  FPDFPage_SetCropBox: procedure(page: FPDF_PAGE; left, bottom, right, top: Single); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Set "BleedBox" entry to the page dictionary.
//
// page   - Handle to a page.
// left   - The left of the rectangle.
// bottom - The bottom of the rectangle.
// right  - The right of the rectangle.
// top    - The top of the rectangle.
var
  FPDFPage_SetBleedBox: procedure(page: FPDF_PAGE; left, bottom, right, top: Single); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Set "TrimBox" entry to the page dictionary.
//
// page   - Handle to a page.
// left   - The left of the rectangle.
// bottom - The bottom of the rectangle.
// right  - The right of the rectangle.
// top    - The top of the rectangle.
var
  FPDFPage_SetTrimBox: procedure(page: FPDF_PAGE; left, bottom, right, top: Single); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Set "ArtBox" entry to the page dictionary.
//
// page   - Handle to a page.
// left   - The left of the rectangle.
// bottom - The bottom of the rectangle.
// right  - The right of the rectangle.
// top    - The top of the rectangle.
var
  FPDFPage_SetArtBox: procedure(page: FPDF_PAGE; left, bottom, right, top: Single); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get "MediaBox" entry from the page dictionary.
//
// page   - Handle to a page.
// left   - Pointer to a float value receiving the left of the rectangle.
// bottom - Pointer to a float value receiving the bottom of the rectangle.
// right  - Pointer to a float value receiving the right of the rectangle.
// top    - Pointer to a float value receiving the top of the rectangle.
//
// On success, return true and write to the out parameters. Otherwise return
// false and leave the out parameters unmodified.
var
  FPDFPage_GetMediaBox: procedure(page: FPDF_PAGE; var left, bottom, right, top: Single); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get "CropBox" entry from the page dictionary.
//
// page   - Handle to a page.
// left   - Pointer to a float value receiving the left of the rectangle.
// bottom - Pointer to a float value receiving the bottom of the rectangle.
// right  - Pointer to a float value receiving the right of the rectangle.
// top    - Pointer to a float value receiving the top of the rectangle.
//
// On success, return true and write to the out parameters. Otherwise return
// false and leave the out parameters unmodified.
var
  FPDFPage_GetCropBox: procedure(page: FPDF_PAGE; var left, bottom, right, top: Single); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get "BleedBox" entry from the page dictionary.
//
// page   - Handle to a page.
// left   - Pointer to a float value receiving the left of the rectangle.
// bottom - Pointer to a float value receiving the bottom of the rectangle.
// right  - Pointer to a float value receiving the right of the rectangle.
// top    - Pointer to a float value receiving the top of the rectangle.
//
// On success, return true and write to the out parameters. Otherwise return
// false and leave the out parameters unmodified.
var
  FPDFPage_GetBleedBox: procedure(page: FPDF_PAGE; var left, bottom, right, top: Single); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get "TrimBox" entry from the page dictionary.
//
// page   - Handle to a page.
// left   - Pointer to a float value receiving the left of the rectangle.
// bottom - Pointer to a float value receiving the bottom of the rectangle.
// right  - Pointer to a float value receiving the right of the rectangle.
// top    - Pointer to a float value receiving the top of the rectangle.
//
// On success, return true and write to the out parameters. Otherwise return
// false and leave the out parameters unmodified.
var
  FPDFPage_GetTrimBox: procedure(page: FPDF_PAGE; var left, bottom, right, top: Single); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Get "ArtBox" entry from the page dictionary.
//
// page   - Handle to a page.
// left   - Pointer to a float value receiving the left of the rectangle.
// bottom - Pointer to a float value receiving the bottom of the rectangle.
// right  - Pointer to a float value receiving the right of the rectangle.
// top    - Pointer to a float value receiving the top of the rectangle.
//
// On success, return true and write to the out parameters. Otherwise return
// false and leave the out parameters unmodified.
var
  FPDFPage_GetArtBox: procedure(page: FPDF_PAGE; var left, bottom, right, top: Single); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Apply transforms to |page|.
//
// If |matrix| is provided it will be applied to transform the page.
// If |clipRect| is provided it will be used to clip the resulting page.
// If neither |matrix| or |clipRect| are provided this method returns |false|.
// Returns |true| if transforms are applied.
//
// This function will transform the whole page, and would take effect to all the
// objects in the page.
//
// page        - Page handle.
// matrix      - Transform matrix.
// clipRect    - Clipping rectangle.
var
  FPDFPage_TransFormWithClip: function(page: FPDF_PAGE; matrix: PFS_MATRIX; clipRect: PFS_RECTF): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Transform (scale, rotate, shear, move) the clip path of page object.
// page_object - Handle to a page object. Returned by
// FPDFPageObj_NewImageObj().
//
// a  - The coefficient "a" of the matrix.
// b  - The coefficient "b" of the matrix.
// c  - The coefficient "c" of the matrix.
// d  - The coefficient "d" of the matrix.
// e  - The coefficient "e" of the matrix.
// f  - The coefficient "f" of the matrix.
var
  FPDFPageObj_TransformClipPath: procedure(page_object: FPDF_PAGEOBJECT; a, b, c, d, e, f: Double); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the clip path of the page object.
//
//   page object - Handle to a page object. Returned by e.g.
//                 FPDFPage_GetObject().
//
// Returns the handle to the clip path, or NULL on failure. The caller does not
// take ownership of the returned FPDF_CLIPPATH. Instead, it remains valid until
// FPDF_ClosePage() is called for the page containing |page_object|.
var
  FPDFPageObj_GetClipPath: function(page_object: FPDF_PAGEOBJECT): FPDF_CLIPPATH; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get number of paths inside |clip_path|.
//
//   clip_path - handle to a clip_path.
//
// Returns the number of objects in |clip_path| or -1 on failure.
var
  FPDFClipPath_CountPaths: function(clip_path: FPDF_CLIPPATH): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get number of segments inside one path of |clip_path|.
//
//   clip_path  - handle to a clip_path.
//   path_index - index into the array of paths of the clip path.
//
// Returns the number of segments or -1 on failure.
var
  FPDFClipPath_CountPathSegments: function(clip_path: FPDF_CLIPPATH; path_index: Integer): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get segment in one specific path of |clip_path| at index.
//
//   clip_path     - handle to a clip_path.
//   path_index    - the index of a path.
//   segment_index - the index of a segment.
//
// Returns the handle to the segment, or NULL on failure. The caller does not
// take ownership of the returned FPDF_PATHSEGMENT. Instead, it remains valid
// until FPDF_ClosePage() is called for the page containing |clip_path|.
var
  FPDFClipPath_GetPathSegment: function(clip_path: FPDF_CLIPPATH; path_index, segment_index: Integer): FPDF_PATHSEGMENT; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Create a new clip path, with a rectangle inserted.
//
// Caller takes ownership of the returned FPDF_CLIPPATH. It should be freed with
// FPDF_DestroyClipPath().
//
// left   - The left of the clip box.
// bottom - The bottom of the clip box.
// right  - The right of the clip box.
// top    - The top of the clip box.
var
  FPDF_CreateClipPath: function(page_object: FPDF_PAGEOBJECT; left, bottom, right, top: Single): FPDF_CLIPPATH; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Destroy the clip path.
//
// clipPath - A handle to the clip path. It will be invalid after this call.
var
  FPDF_DestroyClipPath: procedure(clipPath: FPDF_CLIPPATH); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Clip the page content, the page content that outside the clipping region
// become invisible.
//
// A clip path will be inserted before the page content stream or content array.
// In this way, the page content will be clipped by this clip path.
//
// page        - A page handle.
// clipPath    - A handle to the clip path. (Does not take ownership.)
var
  FPDFPage_InsertClipPath: procedure(page: FPDF_PAGE; clipPath: FPDF_CLIPPATH); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};


// *** _FPDF_STRUCTTREE_H_ ***

// Function: FPDF_StructTree_GetForPage
//          Get the structure tree for a page.
// Parameters:
//          page        -   Handle to the page, as returned by FPDF_LoadPage().
// Return value:
//          A handle to the structure tree or NULL on error. The caller owns the
//          returned handle and must use FPDF_StructTree_Close() to release it.
//          The handle should be released before |page| gets released.
var
  FPDF_StructTree_GetForPage: function(page: FPDF_PAGE): FPDF_STRUCTTREE; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_StructTree_Close
//          Release a resource allocated by FPDF_StructTree_GetForPage().
// Parameters:
//          struct_tree -   Handle to the structure tree, as returned by
//                          FPDF_StructTree_LoadPage().
// Return value:
//          None.
var
  FPDF_StructTree_Close: procedure(struct_tree: FPDF_STRUCTTREE); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_StructTree_CountChildren
//          Count the number of children for the structure tree.
// Parameters:
//          struct_tree -   Handle to the structure tree, as returned by
//                          FPDF_StructTree_LoadPage().
// Return value:
//          The number of children, or -1 on error.
var
  FPDF_StructTree_CountChildren: function(struct_tree: FPDF_STRUCTTREE): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_StructTree_GetChildAtIndex
//          Get a child in the structure tree.
// Parameters:
//          struct_tree -   Handle to the structure tree, as returned by
//                          FPDF_StructTree_LoadPage().
//          index       -   The index for the child, 0-based.
// Return value:
//          The child at the n-th index or NULL on error. The caller does not
//          own the handle. The handle remains valid as long as |struct_tree|
//          remains valid.
// Comments:
//          The |index| must be less than the FPDF_StructTree_CountChildren()
//          return value.
var
  FPDF_StructTree_GetChildAtIndex: function(struct_tree: FPDF_STRUCTTREE; index: Integer): FPDF_STRUCTELEMENT; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_StructElement_GetAltText
//          Get the alt text for a given element.
// Parameters:
//          struct_element -   Handle to the struct element.
//          buffer         -   A buffer for output the alt text. May be NULL.
//          buflen         -   The length of the buffer, in bytes. May be 0.
// Return value:
//          The number of bytes in the alt text, including the terminating NUL
//          character. The number of bytes is returned regardless of the
//          |buffer| and |buflen| parameters.
// Comments:
//          Regardless of the platform, the |buffer| is always in UTF-16LE
//          encoding. The string is terminated by a UTF16 NUL character. If
//          |buflen| is less than the required length, or |buffer| is NULL,
//          |buffer| will not be modified.
var
  FPDF_StructElement_GetAltText: function(struct_element: FPDF_STRUCTELEMENT; buffer: Pointer; buflen: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDF_StructElement_GetActualText
//          Get the actual text for a given element.
// Parameters:
//          struct_element -   Handle to the struct element.
//          buffer         -   A buffer for output the actual text. May be NULL.
//          buflen         -   The length of the buffer, in bytes. May be 0.
// Return value:
//          The number of bytes in the actual text, including the terminating
//          NUL character. The number of bytes is returned regardless of the
//          |buffer| and |buflen| parameters.
// Comments:
//          Regardless of the platform, the |buffer| is always in UTF-16LE
//          encoding. The string is terminated by a UTF16 NUL character. If
//          |buflen| is less than the required length, or |buffer| is NULL,
//          |buffer| will not be modified.
var
  FPDF_StructElement_GetActualText: function(struct_element: FPDF_STRUCTELEMENT; buffer: Pointer; buflen: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_StructElement_GetID
//          Get the ID for a given element.
// Parameters:
//          struct_element -   Handle to the struct element.
//          buffer         -   A buffer for output the ID string. May be NULL.
//          buflen         -   The length of the buffer, in bytes. May be 0.
// Return value:
//          The number of bytes in the ID string, including the terminating NUL
//          character. The number of bytes is returned regardless of the
//          |buffer| and |buflen| parameters.
// Comments:
//          Regardless of the platform, the |buffer| is always in UTF-16LE
//          encoding. The string is terminated by a UTF16 NUL character. If
//          |buflen| is less than the required length, or |buffer| is NULL,
//          |buffer| will not be modified.
var
  FPDF_StructElement_GetID: function(struct_element: FPDF_STRUCTELEMENT; buffer: Pointer; buflen: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDF_StructElement_GetLang
//          Get the case-insensitive IETF BCP 47 language code for an element.
// Parameters:
//          struct_element -   Handle to the struct element.
//          buffer         -   A buffer for output the lang string. May be NULL.
//          buflen         -   The length of the buffer, in bytes. May be 0.
// Return value:
//          The number of bytes in the ID string, including the terminating NUL
//          character. The number of bytes is returned regardless of the
//          |buffer| and |buflen| parameters.
// Comments:
//          Regardless of the platform, the |buffer| is always in UTF-16LE
//          encoding. The string is terminated by a UTF16 NUL character. If
//          |buflen| is less than the required length, or |buffer| is NULL,
//          |buffer| will not be modified.
var
  FPDF_StructElement_GetLang: function(struct_element: FPDF_STRUCTELEMENT; buffer: Pointer; buflen: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDF_StructElement_GetStringAttribute
//          Get a struct element attribute of type "name" or "string".
// Parameters:
//          struct_element -   Handle to the struct element.
//          attr_name      -   The name of the attribute to retrieve.
//          buffer         -   A buffer for output. May be NULL.
//          buflen         -   The length of the buffer, in bytes. May be 0.
// Return value:
//          The number of bytes in the attribute value, including the
//          terminating NUL character. The number of bytes is returned
//          regardless of the |buffer| and |buflen| parameters.
// Comments:
//          Regardless of the platform, the |buffer| is always in UTF-16LE
//          encoding. The string is terminated by a UTF16 NUL character. If
//          |buflen| is less than the required length, or |buffer| is NULL,
//          |buffer| will not be modified.
var
  FPDF_StructElement_GetStringAttribute: function(struct_element: FPDF_STRUCTELEMENT;
    attr_name: FPDF_BYTESTRING; buffer: Pointer; buflen: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_StructElement_GetMarkedContentID
//          Get the marked content ID for a given element.
// Parameters:
//          struct_element -   Handle to the struct element.
// Return value:
//          The marked content ID of the element. If no ID exists, returns
//          -1.
// Comments:
//          FPDF_StructElement_GetMarkedContentIdAtIndex() may be able to
//          extract more marked content IDs out of |struct_element|. This API
//          may be deprecated in the future.
var
  FPDF_StructElement_GetMarkedContentID: function(struct_element: FPDF_STRUCTELEMENT): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_StructElement_GetType
//           Get the type (/S) for a given element.
// Parameters:
//           struct_element - Handle to the struct element.
//           buffer         - A buffer for output. May be NULL.
//           buflen         - The length of the buffer, in bytes. May be 0.
// Return value:
//           The number of bytes in the type, including the terminating NUL
//           character. The number of bytes is returned regardless of the
//           |buffer| and |buflen| parameters.
// Comments:
//           Regardless of the platform, the |buffer| is always in UTF-16LE
//           encoding. The string is terminated by a UTF16 NUL character. If
//           |buflen| is less than the required length, or |buffer| is NULL,
//           |buffer| will not be modified.
var
  FPDF_StructElement_GetType: function(struct_element: FPDF_STRUCTELEMENT; buffer: Pointer; buflen: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDF_StructElement_GetObjType
//           Get the object type (/Type) for a given element.
// Parameters:
//           struct_element - Handle to the struct element.
//           buffer         - A buffer for output. May be NULL.
//           buflen         - The length of the buffer, in bytes. May be 0.
// Return value:
//           The number of bytes in the object type, including the terminating
//           NUL character. The number of bytes is returned regardless of the
//           |buffer| and |buflen| parameters.
// Comments:
//           Regardless of the platform, the |buffer| is always in UTF-16LE
//           encoding. The string is terminated by a UTF16 NUL character. If
//           |buflen| is less than the required length, or |buffer| is NULL,
//           |buffer| will not be modified.
var
  FPDF_StructElement_GetObjType: function(struct_element: FPDF_STRUCTELEMENT; buffer: Pointer; buflen: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_StructElement_GetTitle
//           Get the title (/T) for a given element.
// Parameters:
//           struct_element - Handle to the struct element.
//           buffer         - A buffer for output. May be NULL.
//           buflen         - The length of the buffer, in bytes. May be 0.
// Return value:
//           The number of bytes in the title, including the terminating NUL
//           character. The number of bytes is returned regardless of the
//           |buffer| and |buflen| parameters.
// Comments:
//           Regardless of the platform, the |buffer| is always in UTF-16LE
//           encoding. The string is terminated by a UTF16 NUL character. If
//           |buflen| is less than the required length, or |buffer| is NULL,
//           |buffer| will not be modified.
var
  FPDF_StructElement_GetTitle: function(struct_element: FPDF_STRUCTELEMENT; buffer: Pointer; buflen: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_StructElement_CountChildren
//          Count the number of children for the structure element.
// Parameters:
//          struct_element -   Handle to the struct element.
// Return value:
//          The number of children, or -1 on error.
var
  FPDF_StructElement_CountChildren: function(struct_element: FPDF_STRUCTELEMENT): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_StructElement_GetChildAtIndex
//          Get a child in the structure element.
// Parameters:
//          struct_element -   Handle to the struct element.
//          index          -   The index for the child, 0-based.
// Return value:
//          The child at the n-th index or NULL on error.
// Comments:
//          If the child exists but is not an element, then this function will
//          return NULL. This will also return NULL for out of bounds indices.
//          The |index| must be less than the FPDF_StructElement_CountChildren()
//          return value.
var
  FPDF_StructElement_GetChildAtIndex: function(struct_element: FPDF_STRUCTELEMENT; index: Integer): FPDF_STRUCTELEMENT; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDF_StructElement_GetChildMarkedContentID
//          Get the child's content id
// Parameters:
//          struct_element -   Handle to the struct element.
//          index          -   The index for the child, 0-based.
// Return value:
//          The marked content ID of the child. If no ID exists, returns -1.
// Comments:
//          If the child exists but is not a stream or object, then this
//          function will return -1. This will also return -1 for out of bounds
//          indices. Compared to FPDF_StructElement_GetMarkedContentIdAtIndex,
//          it is scoped to the current page.
//          The |index| must be less than the FPDF_StructElement_CountChildren()
//          return value.
var
  FPDF_StructElement_GetChildMarkedContentID: function(struct_element: FPDF_STRUCTELEMENT; index: Integer): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDF_StructElement_GetParent
//          Get the parent of the structure element.
// Parameters:
//          struct_element -   Handle to the struct element.
// Return value:
//          The parent structure element or NULL on error.
// Comments:
//          If structure element is StructTreeRoot, then this function will
//          return NULL.
var
  FPDF_StructElement_GetParent: function(struct_element: FPDF_STRUCTELEMENT): FPDF_STRUCTELEMENT; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Function: FPDF_StructElement_GetAttributeCount
//          Count the number of attributes for the structure element.
// Parameters:
//          struct_element -   Handle to the struct element.
// Return value:
//          The number of attributes, or -1 on error.
var
  FPDF_StructElement_GetAttributeCount: function(struct_element: FPDF_STRUCTELEMENT): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDF_StructElement_GetAttributeAtIndex
//          Get an attribute object in the structure element.
// Parameters:
//          struct_element -   Handle to the struct element.
//          index          -   The index for the attribute object, 0-based.
// Return value:
//          The attribute object at the n-th index or NULL on error.
// Comments:
//          If the attribute object exists but is not a dict, then this
//          function will return NULL. This will also return NULL for out of
//          bounds indices. The caller does not own the handle. The handle
//          remains valid as long as |struct_element| remains valid.
//          The |index| must be less than the
//          FPDF_StructElement_GetAttributeCount() return value.
var
  FPDF_StructElement_GetAttributeAtIndex: function(struct_element: FPDF_STRUCTELEMENT; index: Integer): FPDF_STRUCTELEMENT_ATTR; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDF_StructElement_Attr_GetCount
//          Count the number of attributes in a structure element attribute map.
// Parameters:
//          struct_attribute - Handle to the struct element attribute.
// Return value:
//          The number of attributes, or -1 on error.
var
  FPDF_StructElement_Attr_GetCount: function(struct_attribute: FPDF_STRUCTELEMENT_ATTR): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};


// Experimental API.
// Function: FPDF_StructElement_Attr_GetName
//          Get the name of an attribute in a structure element attribute map.
// Parameters:
//          struct_attribute   - Handle to the struct element attribute.
//          index              - The index of attribute in the map.
//          buffer             - A buffer for output. May be NULL. This is only
//                               modified if |buflen| is longer than the length
//                               of the key. Optional, pass null to just
//                               retrieve the size of the buffer needed.
//          buflen             - The length of the buffer.
//          out_buflen         - A pointer to variable that will receive the
//                               minimum buffer size to contain the key. Not
//                               filled if FALSE is returned.
// Return value:
//          TRUE if the operation was successful, FALSE otherwise.
var
  FPDF_StructElement_Attr_GetName: function(struct_attribute: FPDF_STRUCTELEMENT_ATTR; index: Integer; buffer: Pointer;
    buflen: LongWord; var out_buflen: LongWord): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDF_StructElement_Attr_GetValue
//           Get a handle to a value for an attribute in a structure element
//           attribute map.
// Parameters:
//           struct_attribute   - Handle to the struct element attribute.
//           name               - The attribute name.
// Return value:
//           Returns a handle to the value associated with the input, if any.
//           Returns NULL on failure. The caller does not own the handle.
//           The handle remains valid as long as |struct_attribute| remains
//           valid.
var
  FPDF_StructElement_Attr_GetValue: function(struct_attribute: FPDF_STRUCTELEMENT_ATTR;
    name: FPDF_BYTESTRING): FPDF_STRUCTELEMENT_ATTR_VALUE; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDF_StructElement_Attr_GetType
//           Get the type of an attribute in a structure element attribute map.
// Parameters:
//           value - Handle to the value.
// Return value:
//           Returns the type of the value, or FPDF_OBJECT_UNKNOWN in case of
//           failure. Note that this will never return FPDF_OBJECT_REFERENCE, as
//           references are always dereferenced.
var
  FPDF_StructElement_Attr_GetType: function(struct_attribute: FPDF_STRUCTELEMENT_ATTR_VALUE): FPDF_OBJECT_TYPE; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDF_StructElement_Attr_GetBooleanValue
//           Get the value of a boolean attribute in an attribute map as
//           FPDF_BOOL. FPDF_StructElement_Attr_GetType() should have returned
//           FPDF_OBJECT_BOOLEAN for this property.
// Parameters:
//           value     - Handle to the value.
//           out_value - A pointer to variable that will receive the value. Not
//                       filled if false is returned.
// Return value:
//           Returns TRUE if the attribute maps to a boolean value, FALSE
//           otherwise.
var
  FPDF_StructElement_Attr_GetBooleanValue: function(value: FPDF_STRUCTELEMENT_ATTR_VALUE;
    var out_value: FPDF_BOOL): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDF_StructElement_Attr_GetNumberValue
//           Get the value of a number attribute in an attribute map as float.
//           FPDF_StructElement_Attr_GetType() should have returned
//           FPDF_OBJECT_NUMBER for this property.
// Parameters:
//           value     - Handle to the value.
//           out_value - A pointer to variable that will receive the value. Not
//                       filled if false is returned.
// Return value:
//           Returns TRUE if the attribute maps to a number value, FALSE
//           otherwise.
var
  FPDF_StructElement_Attr_GetNumberValue: function(value: FPDF_STRUCTELEMENT_ATTR_VALUE;
    var out_value: Single): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDF_StructElement_Attr_GetStringValue
//           Get the value of a string attribute in an attribute map as string.
//           FPDF_StructElement_Attr_GetType() should have returned
//           FPDF_OBJECT_STRING or FPDF_OBJECT_NAME for this property.
// Parameters:
//           value      - Handle to the value.
//           buffer     - A buffer for holding the returned key in UTF-16LE.
//                        This is only modified if |buflen| is longer than the
//                        length of the key. Optional, pass null to just
//                        retrieve the size of the buffer needed.
//           buflen     - The length of the buffer.
//           out_buflen - A pointer to variable that will receive the minimum
//                        buffer size to contain the key. Not filled if FALSE is
//                        returned.
// Return value:
//           Returns TRUE if the attribute maps to a string value, FALSE
//           otherwise.
var
  FPDF_StructElement_Attr_GetStringValue: function(value: FPDF_STRUCTELEMENT_ATTR; buffer: Pointer; buflen: LongWord;
    var out_buflen: LongWord): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDF_StructElement_Attr_GetBlobValue
//           Get the value of a blob attribute in an attribute map as string.
// Parameters:
//           value      - Handle to the value.
//           buffer     - A buffer for holding the returned value. This is only
//                        modified if |buflen| is at least as long as the length
//                        of the value. Optional, pass null to just retrieve the
//                        size of the buffer needed.
//           buflen     - The length of the buffer.
//           out_buflen - A pointer to variable that will receive the minimum
//                        buffer size to contain the key. Not filled if FALSE is
//                        returned.
// Return value:
//           Returns TRUE if the attribute maps to a string value, FALSE
//           otherwise.
var
  FPDF_StructElement_Attr_GetBlobValue: function(value: FPDF_STRUCTELEMENT_ATTR; buffer: Pointer; buflen: LongWord;
    var out_buflen: LongWord): FPDF_BOOL; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDF_StructElement_Attr_CountChildren
//           Count the number of children values in an attribute.
// Parameters:
//           value - Handle to the value.
// Return value:
//           The number of children, or -1 on error.
var
  FPDF_StructElement_Attr_CountChildren: function(value: FPDF_STRUCTELEMENT_ATTR_VALUE): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDF_StructElement_Attr_GetChildAtIndex
//           Get a child from an attribute.
// Parameters:
//           value - Handle to the value.
//           index - The index for the child, 0-based.
// Return value:
//           The child at the n-th index or NULL on error.
// Comments:
//           The |index| must be less than the
//           FPDF_StructElement_Attr_CountChildren() return value.
var
  FPDF_StructElement_Attr_GetChildAtIndex: function(value: FPDF_STRUCTELEMENT_ATTR_VALUE;
    index: Integer): FPDF_STRUCTELEMENT_ATTR_VALUE; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDF_StructElement_GetMarkedContentIdCount
//          Get the count of marked content ids for a given element.
// Parameters:
//          struct_element -   Handle to the struct element.
// Return value:
//          The count of marked content ids or -1 if none exists.
var
  FPDF_StructElement_GetMarkedContentIdCount: function(struct_element: FPDF_STRUCTELEMENT): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Function: FPDF_StructElement_GetMarkedContentIdAtIndex
//          Get the marked content id at a given index for a given element.
// Parameters:
//          struct_element -   Handle to the struct element.
//          index          -   The index of the marked content id, 0-based.
// Return value:
//          The marked content ID of the element. If no ID exists, returns
//          -1.
// Comments:
//          The |index| must be less than the
//          FPDF_StructElement_GetMarkedContentIdCount() return value.
//          This will likely supersede FPDF_StructElement_GetMarkedContentID().
var
  FPDF_StructElement_GetMarkedContentIdAtIndex: function(struct_element: FPDF_STRUCTELEMENT; index: Integer): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};


// *** _FPDF_LIBS_H_ ***

{$IFDEF PDF_ENABLE_V8}

// Function: FPDF_InitEmbeddedLibraries
//          Initialize embedded libraries (v8, iuctl) included in pdfium
// Parameters:
//          resourcePath - a path to v8 resources (snapshot_blob.bin, icudtl.dat, ...)
// Return value:
//          None.
// Comments:
//          This function must be called before calling FPDF_InitLibrary()
//          if v8 suppport is enabled
var
  FPDF_InitEmbeddedLibraries: procedure(const resourcePath: PAnsiChar); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};
{$ENDIF PDF_ENABLE_V8}


// *** _FPDF_JAVASCRIPT_H_ ***

// Experimental API.
// Get the number of JavaScript actions in |document|.
//
//   document - handle to a document.
//
// Returns the number of JavaScript actions in |document| or -1 on error.
var
  FPDFDoc_GetJavaScriptActionCount: function(document: FPDF_DOCUMENT): Integer; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the JavaScript action at |index| in |document|.
//
//   document - handle to a document.
//   index    - the index of the requested JavaScript action.
//
// Returns the handle to the JavaScript action, or NULL on failure.
// Caller owns the returned handle and must close it with
// FPDFDoc_CloseJavaScriptAction().
var
  FPDFDoc_GetJavaScriptAction: function(document: FPDF_DOCUMENT; index: Integer): FPDF_JAVASCRIPT_ACTION; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Close a loaded FPDF_JAVASCRIPT_ACTION object.

//   javascript - Handle to a JavaScript action.
var
  FPDFDoc_CloseJavaScriptAction: procedure(javascript: FPDF_JAVASCRIPT_ACTION); {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the name from the |javascript| handle. |buffer| is only modified if
// |buflen| is longer than the length of the name. On errors, |buffer| is
// unmodified and the returned length is 0.
//
//   javascript - handle to an JavaScript action.
//   buffer     - buffer for holding the name, encoded in UTF-16LE.
//   buflen     - length of the buffer in bytes.
//
// Returns the length of the JavaScript action name in bytes.
var
  FPDFJavaScriptAction_GetName: function(javascript: FPDF_JAVASCRIPT_ACTION; buffer: PFPDF_WCHAR;
    buflen: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Get the script from the |javascript| handle. |buffer| is only modified if
// |buflen| is longer than the length of the script. On errors, |buffer| is
// unmodified and the returned length is 0.
//
//   javascript - handle to an JavaScript action.
//   buffer     - buffer for holding the name, encoded in UTF-16LE.
//   buflen     - length of the buffer in bytes.
//
// Returns the length of the JavaScript action name in bytes.
var
  FPDFJavaScriptAction_GetScript: function(javascript: FPDF_JAVASCRIPT_ACTION; buffer: PFPDF_WCHAR;
    buflen: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};


// *** _FPDF_THUMBNAIL_H_ ***

// Experimental API.
// Gets the decoded data from the thumbnail of |page| if it exists.
// This only modifies |buffer| if |buflen| less than or equal to the
// size of the decoded data. Returns the size of the decoded
// data or 0 if thumbnail DNE. Optional, pass null to just retrieve
// the size of the buffer needed.
//
//   page    - handle to a page.
//   buffer  - buffer for holding the decoded image data.
//   buflen  - length of the buffer in bytes.
var
  FPDFPage_GetDecodedThumbnailData: function(page: FPDF_PAGE; buffer: Pointer; buflen: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Gets the raw data from the thumbnail of |page| if it exists.
// This only modifies |buffer| if |buflen| is less than or equal to
// the size of the raw data. Returns the size of the raw data or 0
// if thumbnail DNE. Optional, pass null to just retrieve the size
// of the buffer needed.
//
//   page    - handle to a page.
//   buffer  - buffer for holding the raw image data.
//   buflen  - length of the buffer in bytes.
var
  FPDFPage_GetRawThumbnailData: function(page: FPDF_PAGE; buffer: Pointer; buflen: LongWord): LongWord; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};

// Experimental API.
// Returns the thumbnail of |page| as a FPDF_BITMAP. Returns a nullptr
// if unable to access the thumbnail's stream.
//
//   page - handle to a page.
var
  FPDFPage_GetThumbnailAsBitmap: function(page: FPDF_PAGE): FPDF_BITMAP; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};


// ***********************************************************************

procedure InitPDFium(const DllPath: string = '' {$IFDEF PDF_ENABLE_V8}; const ResPath: string = ''{$ENDIF});
procedure InitPDFiumEx(const DllFileName: string{$IFDEF PDF_ENABLE_V8}; const ResPath: string{$ENDIF});

implementation

uses
  {$IFDEF CPUX64}
  Math,
  {$ENDIF CPUX64}
  SysUtils;

resourcestring
  RsFailedToLoadProc = 'Symbol "%s" was not found in pdfium.dll';
  RsPdfiumNotLoaded = 'pdfium.dll is not loaded';
  RsFunctionNotSupported = 'PDFium function is not supported';

function FPDF_ARGB(a, r, g, b: Byte): DWORD; inline;
begin
  Result := DWORD(b) or (DWORD(g) shl 8) or (DWORD(r) shl 16) or (DWORD(a) shl 24);
end;

function FPDF_GetBValue(argb: DWORD): Byte; inline;
begin
  Result := Byte(argb);
end;

function FPDF_GetGValue(argb: DWORD): Byte; inline;
begin
  Result := Byte(argb shr 8);
end;

function FPDF_GetRValue(argb: DWORD): Byte; inline;
begin
  Result := Byte(argb shr 16);
end;

function FPDF_GetAValue(argb: DWORD): Byte; inline;
begin
  Result := Byte(argb shr 24);
end;

{$IFDEF PDF_ENABLE_XFA}
function IS_XFA_FORMFIELD(type_: Integer): Boolean; inline;
begin
  case type_ of
    FPDF_FORMFIELD_XFA,
    FPDF_FORMFIELD_XFA_CHECKBOX,
    FPDF_FORMFIELD_XFA_COMBOBOX,
    FPDF_FORMFIELD_XFA_IMAGEFIELD,
    FPDF_FORMFIELD_XFA_LISTBOX,
    FPDF_FORMFIELD_XFA_PUSHBUTTON,
    FPDF_FORMFIELD_XFA_SIGNATURE,
    FPDF_FORMFIELD_XFA_TEXTFIELD:
      Result := True;
  else
    Result := False;
  end;
end;
{$ENDIF PDF_ENABLE_XFA}


type
  TImportFuncRec = record
    P: PPointer;
    {$IF defined(FPC) and not defined(MSWINDOWS)}
    N: AnsiString; // The "dynlibs" unit's GetProcAddress uses an AnsiString instead of PAnsiChar
    {$ELSE}
    N: PAnsiChar;
    {$IFEND}
    Quirk: Boolean; // True: if the symbol can't be found, no exception is raised. If both Quirk
                    //       and Optional are True and the symbol can't be found, it will be mapped
                    //       to FunctionNotSupported.
                    // (used if the symbol's name has changed and both DLL versions should be supported)
    Optional: Boolean; // True: If the symbol can't be found, it is set to nil.
                       // (used for optional exported features like V8 and XFA)
  end;

const
  {$IFDEF FPC}
    {$WARN 3175 off : Some fields coming before "$1" were not initialized}
    {$WARN 3177 off : Some fields coming after "$1" were not initialized}
  {$ENDIF FPC}
  ImportFuncs: array[0..438
    {$IFDEF MSWINDOWS     } + 2 {$ENDIF}
    {$IFDEF PDF_USE_SKIA  } + 2 {$ENDIF}
    {$IFDEF PDF_ENABLE_V8 } + 3 {$ENDIF}
    {$IFDEF PDF_ENABLE_XFA} + 3 {$ENDIF}
    ] of TImportFuncRec = (

    // *** _FPDFVIEW_H_ ***
    (P: @@FPDF_InitLibraryWithConfig;                   N: 'FPDF_InitLibraryWithConfig'),
    (P: @@FPDF_InitLibrary;                             N: 'FPDF_InitLibrary'),
    (P: @@FPDF_DestroyLibrary;                          N: 'FPDF_DestroyLibrary'),
    (P: @@FPDF_SetSandBoxPolicy;                        N: 'FPDF_SetSandBoxPolicy'),
    {$IFDEF MSWINDOWS}
    (P: @@FPDF_SetPrintMode;                            N: 'FPDF_SetPrintMode'),
    {$ENDIF MSWINDOWS}
    (P: @@FPDF_LoadDocument;                            N: 'FPDF_LoadDocument'),
    (P: @@FPDF_LoadMemDocument;                         N: 'FPDF_LoadMemDocument'),
    (P: @@FPDF_LoadMemDocument64;                       N: 'FPDF_LoadMemDocument64'),
    (P: @@FPDF_LoadCustomDocument;                      N: 'FPDF_LoadCustomDocument'),
    (P: @@FPDF_GetFileVersion;                          N: 'FPDF_GetFileVersion'),
    (P: @@FPDF_GetLastError;                            N: 'FPDF_GetLastError'),
    (P: @@FPDF_DocumentHasValidCrossReferenceTable;     N: 'FPDF_DocumentHasValidCrossReferenceTable'),
    (P: @@FPDF_GetTrailerEnds;                          N: 'FPDF_GetTrailerEnds'),
    (P: @@FPDF_GetDocPermissions;                       N: 'FPDF_GetDocPermissions'),
    (P: @@FPDF_GetDocUserPermissions;                   N: 'FPDF_GetDocUserPermissions'),
    (P: @@FPDF_GetSecurityHandlerRevision;              N: 'FPDF_GetSecurityHandlerRevision'),
    (P: @@FPDF_GetPageCount;                            N: 'FPDF_GetPageCount'),
    (P: @@FPDF_LoadPage;                                N: 'FPDF_LoadPage'),
    (P: @@FPDF_GetPageWidthF;                           N: 'FPDF_GetPageWidthF'),
    (P: @@FPDF_GetPageWidth;                            N: 'FPDF_GetPageWidth'),
    (P: @@FPDF_GetPageHeightF;                          N: 'FPDF_GetPageHeightF'),
    (P: @@FPDF_GetPageHeight;                           N: 'FPDF_GetPageHeight'),
    (P: @@FPDF_GetPageBoundingBox;                      N: 'FPDF_GetPageBoundingBox'),
    (P: @@FPDF_GetPageSizeByIndexF;                     N: 'FPDF_GetPageSizeByIndexF'),
    (P: @@FPDF_GetPageSizeByIndex;                      N: 'FPDF_GetPageSizeByIndex'),
    {$IFDEF MSWINDOWS}
    (P: @@FPDF_RenderPage;                              N: 'FPDF_RenderPage'),
    {$ENDIF MSWINDOWS}
    (P: @@FPDF_RenderPageBitmap;                        N: 'FPDF_RenderPageBitmap'),
    (P: @@FPDF_RenderPageBitmapWithMatrix;              N: 'FPDF_RenderPageBitmapWithMatrix'),
    {$IFDEF PDF_USE_SKIA}
    (P: @@FPDF_RenderPageSkia;                          N: 'FPDF_RenderPageSkia'; Quirk: True; Optional: True),
    {$ENDIF PDF_USE_SKIA}
    (P: @@FPDF_ClosePage;                               N: 'FPDF_ClosePage'),
    (P: @@FPDF_CloseDocument;                           N: 'FPDF_CloseDocument'),
    (P: @@FPDF_DeviceToPage;                            N: 'FPDF_DeviceToPage'),
    (P: @@FPDF_PageToDevice;                            N: 'FPDF_PageToDevice'),
    (P: @@FPDFBitmap_Create;                            N: 'FPDFBitmap_Create'),
    (P: @@FPDFBitmap_CreateEx;                          N: 'FPDFBitmap_CreateEx'),
    (P: @@FPDFBitmap_GetFormat;                         N: 'FPDFBitmap_GetFormat'),
    (P: @@FPDFBitmap_FillRect;                          N: 'FPDFBitmap_FillRect'),
    (P: @@FPDFBitmap_GetBuffer;                         N: 'FPDFBitmap_GetBuffer'),
    (P: @@FPDFBitmap_GetWidth;                          N: 'FPDFBitmap_GetWidth'),
    (P: @@FPDFBitmap_GetHeight;                         N: 'FPDFBitmap_GetHeight'),
    (P: @@FPDFBitmap_GetStride;                         N: 'FPDFBitmap_GetStride'),
    (P: @@FPDFBitmap_Destroy;                           N: 'FPDFBitmap_Destroy'),
    (P: @@FPDF_VIEWERREF_GetPrintScaling;               N: 'FPDF_VIEWERREF_GetPrintScaling'),
    (P: @@FPDF_VIEWERREF_GetNumCopies;                  N: 'FPDF_VIEWERREF_GetNumCopies'),
    (P: @@FPDF_VIEWERREF_GetPrintPageRange;             N: 'FPDF_VIEWERREF_GetPrintPageRange'),
    (P: @@FPDF_VIEWERREF_GetPrintPageRangeCount;        N: 'FPDF_VIEWERREF_GetPrintPageRangeCount'),
    (P: @@FPDF_VIEWERREF_GetPrintPageRangeElement;      N: 'FPDF_VIEWERREF_GetPrintPageRangeElement'),
    (P: @@FPDF_VIEWERREF_GetDuplex;                     N: 'FPDF_VIEWERREF_GetDuplex'),
    (P: @@FPDF_VIEWERREF_GetName;                       N: 'FPDF_VIEWERREF_GetName'),
    (P: @@FPDF_CountNamedDests;                         N: 'FPDF_CountNamedDests'),
    (P: @@FPDF_GetNamedDestByName;                      N: 'FPDF_GetNamedDestByName'),
    (P: @@FPDF_GetNamedDest;                            N: 'FPDF_GetNamedDest'),
    (P: @@FPDF_GetXFAPacketCount;                       N: 'FPDF_GetXFAPacketCount'),
    (P: @@FPDF_GetXFAPacketName;                        N: 'FPDF_GetXFAPacketName'),
    (P: @@FPDF_GetXFAPacketContent;                     N: 'FPDF_GetXFAPacketContent'),
    {$IFDEF PDF_ENABLE_V8}
    (P: @@FPDF_GetRecommendedV8Flags;                   N: 'FPDF_GetRecommendedV8Flags'; Quirk: True; Optional: True),
    (P: @@FPDF_GetArrayBufferAllocatorSharedInstance;   N: 'FPDF_GetArrayBufferAllocatorSharedInstance'; Quirk: True; Optional: True),
    {$ENDIF PDF_ENABLE_V8}
    {$IFDEF PDF_ENABLE_XFA}
    (P: @@FPDF_BStr_Init;                               N: 'FPDF_BStr_Init'; Quirk: True; Optional: True),
    (P: @@FPDF_BStr_Set;                                N: 'FPDF_BStr_Set'; Quirk: True; Optional: True),
    (P: @@FPDF_BStr_Clear;                              N: 'FPDF_BStr_Clear'; Quirk: True; Optional: True),
    {$ENDIF PDF_ENABLE_XFA}

    // *** _FPDF_EDIT_H_ ***
    (P: @@FPDF_CreateNewDocument;                       N: 'FPDF_CreateNewDocument'),
    (P: @@FPDFPage_New;                                 N: 'FPDFPage_New'),
    (P: @@FPDFPage_Delete;                              N: 'FPDFPage_Delete'),
    (P: @@FPDF_MovePages;                               N: 'FPDF_MovePages'),
    (P: @@FPDFPage_GetRotation;                         N: 'FPDFPage_GetRotation'),
    (P: @@FPDFPage_SetRotation;                         N: 'FPDFPage_SetRotation'),
    (P: @@FPDFPage_InsertObject;                        N: 'FPDFPage_InsertObject'),
    (P: @@FPDFPage_RemoveObject;                        N: 'FPDFPage_RemoveObject'),
    (P: @@FPDFPage_CountObjects;                        N: 'FPDFPage_CountObjects'),
    (P: @@FPDFPage_GetObject;                           N: 'FPDFPage_GetObject'),
    (P: @@FPDFPage_HasTransparency;                     N: 'FPDFPage_HasTransparency'),
    (P: @@FPDFPage_GenerateContent;                     N: 'FPDFPage_GenerateContent'),
    (P: @@FPDFPageObj_Destroy;                          N: 'FPDFPageObj_Destroy'),
    (P: @@FPDFPageObj_HasTransparency;                  N: 'FPDFPageObj_HasTransparency'),
    (P: @@FPDFPageObj_GetType;                          N: 'FPDFPageObj_GetType'),
    (P: @@FPDFPageObj_Transform;                        N: 'FPDFPageObj_Transform'),
    (P: @@FPDFPageObj_TransformF;                       N: 'FPDFPageObj_TransformF'),
    (P: @@FPDFPageObj_GetMatrix;                        N: 'FPDFPageObj_GetMatrix'),
    (P: @@FPDFPageObj_SetMatrix;                        N: 'FPDFPageObj_SetMatrix'),
    (P: @@FPDFPage_TransformAnnots;                     N: 'FPDFPage_TransformAnnots'),
    (P: @@FPDFPageObj_NewImageObj;                      N: 'FPDFPageObj_NewImageObj'),
    (P: @@FPDFPageObj_GetMarkedContentID;               N: 'FPDFPageObj_GetMarkedContentID'),
    (P: @@FPDFPageObj_CountMarks;                       N: 'FPDFPageObj_CountMarks'),
    (P: @@FPDFPageObj_GetMark;                          N: 'FPDFPageObj_GetMark'),
    (P: @@FPDFPageObj_AddMark;                          N: 'FPDFPageObj_AddMark'),
    (P: @@FPDFPageObj_RemoveMark;                       N: 'FPDFPageObj_RemoveMark'),
    (P: @@FPDFPageObjMark_GetName;                      N: 'FPDFPageObjMark_GetName'),
    (P: @@FPDFPageObjMark_CountParams;                  N: 'FPDFPageObjMark_CountParams'),
    (P: @@FPDFPageObjMark_GetParamKey;                  N: 'FPDFPageObjMark_GetParamKey'),
    (P: @@FPDFPageObjMark_GetParamValueType;            N: 'FPDFPageObjMark_GetParamValueType'),
    (P: @@FPDFPageObjMark_GetParamIntValue;             N: 'FPDFPageObjMark_GetParamIntValue'),
    (P: @@FPDFPageObjMark_GetParamStringValue;          N: 'FPDFPageObjMark_GetParamStringValue'),
    (P: @@FPDFPageObjMark_GetParamBlobValue;            N: 'FPDFPageObjMark_GetParamBlobValue'),
    (P: @@FPDFPageObjMark_SetIntParam;                  N: 'FPDFPageObjMark_SetIntParam'),
    (P: @@FPDFPageObjMark_SetStringParam;               N: 'FPDFPageObjMark_SetStringParam'),
    (P: @@FPDFPageObjMark_SetBlobParam;                 N: 'FPDFPageObjMark_SetBlobParam'),
    (P: @@FPDFPageObjMark_RemoveParam;                  N: 'FPDFPageObjMark_RemoveParam'),
    (P: @@FPDFImageObj_LoadJpegFile;                    N: 'FPDFImageObj_LoadJpegFile'),
    (P: @@FPDFImageObj_LoadJpegFileInline;              N: 'FPDFImageObj_LoadJpegFileInline'),
    (P: @@FPDFImageObj_SetMatrix;                       N: 'FPDFImageObj_SetMatrix'),
    (P: @@FPDFImageObj_SetBitmap;                       N: 'FPDFImageObj_SetBitmap'),
    (P: @@FPDFImageObj_GetBitmap;                       N: 'FPDFImageObj_GetBitmap'),
    (P: @@FPDFImageObj_GetRenderedBitmap;               N: 'FPDFImageObj_GetRenderedBitmap'),
    (P: @@FPDFImageObj_GetImageDataDecoded;             N: 'FPDFImageObj_GetImageDataDecoded'),
    (P: @@FPDFImageObj_GetImageDataRaw;                 N: 'FPDFImageObj_GetImageDataRaw'),
    (P: @@FPDFImageObj_GetImageFilterCount;             N: 'FPDFImageObj_GetImageFilterCount'),
    (P: @@FPDFImageObj_GetImageFilter;                  N: 'FPDFImageObj_GetImageFilter'),
    (P: @@FPDFImageObj_GetImageMetadata;                N: 'FPDFImageObj_GetImageMetadata'),
    (P: @@FPDFImageObj_GetImagePixelSize;               N: 'FPDFImageObj_GetImagePixelSize'),
    (P: @@FPDFPageObj_CreateNewPath;                    N: 'FPDFPageObj_CreateNewPath'),
    (P: @@FPDFPageObj_CreateNewRect;                    N: 'FPDFPageObj_CreateNewRect'),
    (P: @@FPDFPageObj_GetBounds;                        N: 'FPDFPageObj_GetBounds'),
    (P: @@FPDFPageObj_GetRotatedBounds;                 N: 'FPDFPageObj_GetRotatedBounds'),
    (P: @@FPDFPageObj_SetBlendMode;                     N: 'FPDFPageObj_SetBlendMode'),
    (P: @@FPDFPageObj_SetStrokeColor;                   N: 'FPDFPageObj_SetStrokeColor'),
    (P: @@FPDFPageObj_GetStrokeColor;                   N: 'FPDFPageObj_GetStrokeColor'),
    (P: @@FPDFPageObj_SetStrokeWidth;                   N: 'FPDFPageObj_SetStrokeWidth'),
    (P: @@FPDFPageObj_GetStrokeWidth;                   N: 'FPDFPageObj_GetStrokeWidth'),
    (P: @@FPDFPageObj_GetLineJoin;                      N: 'FPDFPageObj_GetLineJoin'),
    (P: @@FPDFPageObj_SetLineJoin;                      N: 'FPDFPageObj_SetLineJoin'),
    (P: @@FPDFPageObj_GetLineCap;                       N: 'FPDFPageObj_GetLineCap'),
    (P: @@FPDFPageObj_SetLineCap;                       N: 'FPDFPageObj_SetLineCap'),
    (P: @@FPDFPageObj_SetFillColor;                     N: 'FPDFPageObj_SetFillColor'),
    (P: @@FPDFPageObj_GetFillColor;                     N: 'FPDFPageObj_GetFillColor'),
    (P: @@FPDFPageObj_GetDashPhase;                     N: 'FPDFPageObj_GetDashPhase'),
    (P: @@FPDFPageObj_SetDashPhase;                     N: 'FPDFPageObj_SetDashPhase'),
    (P: @@FPDFPageObj_GetDashCount;                     N: 'FPDFPageObj_GetDashCount'),
    (P: @@FPDFPageObj_GetDashArray;                     N: 'FPDFPageObj_GetDashArray'),
    (P: @@FPDFPageObj_SetDashArray;                     N: 'FPDFPageObj_SetDashArray'),
    (P: @@FPDFPath_CountSegments;                       N: 'FPDFPath_CountSegments'),
    (P: @@FPDFPath_GetPathSegment;                      N: 'FPDFPath_GetPathSegment'),
    (P: @@FPDFPathSegment_GetPoint;                     N: 'FPDFPathSegment_GetPoint'),
    (P: @@FPDFPathSegment_GetType;                      N: 'FPDFPathSegment_GetType'),
    (P: @@FPDFPathSegment_GetClose;                     N: 'FPDFPathSegment_GetClose'),
    (P: @@FPDFPath_MoveTo;                              N: 'FPDFPath_MoveTo'),
    (P: @@FPDFPath_LineTo;                              N: 'FPDFPath_LineTo'),
    (P: @@FPDFPath_BezierTo;                            N: 'FPDFPath_BezierTo'),
    (P: @@FPDFPath_Close;                               N: 'FPDFPath_Close'),
    (P: @@FPDFPath_SetDrawMode;                         N: 'FPDFPath_SetDrawMode'),
    (P: @@FPDFPath_GetDrawMode;                         N: 'FPDFPath_GetDrawMode'),
    (P: @@FPDFPageObj_NewTextObj;                       N: 'FPDFPageObj_NewTextObj'),
    (P: @@FPDFText_SetText;                             N: 'FPDFText_SetText'),
    (P: @@FPDFText_SetCharcodes;                        N: 'FPDFText_SetCharcodes'),
    (P: @@FPDFText_LoadFont;                            N: 'FPDFText_LoadFont'),
    (P: @@FPDFText_LoadStandardFont;                    N: 'FPDFText_LoadStandardFont'),
    (P: @@FPDFText_LoadCidType2Font;                    N: 'FPDFText_LoadCidType2Font'),
    (P: @@FPDFTextObj_GetFontSize;                      N: 'FPDFTextObj_GetFontSize'),
    (P: @@FPDFFont_Close;                               N: 'FPDFFont_Close'),
    (P: @@FPDFPageObj_CreateTextObj;                    N: 'FPDFPageObj_CreateTextObj'),
    (P: @@FPDFTextObj_GetTextRenderMode;                N: 'FPDFTextObj_GetTextRenderMode'),
    (P: @@FPDFTextObj_SetTextRenderMode;                N: 'FPDFTextObj_SetTextRenderMode'),
    (P: @@FPDFTextObj_GetText;                          N: 'FPDFTextObj_GetText'),
    (P: @@FPDFTextObj_GetRenderedBitmap;                N: 'FPDFTextObj_GetRenderedBitmap'),
    (P: @@FPDFTextObj_GetFont;                          N: 'FPDFTextObj_GetFont'),
    (P: @@FPDFFont_GetFamilyName;                       N: 'FPDFFont_GetFamilyName'),
    (P: @@FPDFFont_GetFontData;                         N: 'FPDFFont_GetFontData'),
    (P: @@FPDFFont_GetIsEmbedded;                       N: 'FPDFFont_GetIsEmbedded'),
    (P: @@FPDFFont_GetFlags;                            N: 'FPDFFont_GetFlags'),
    (P: @@FPDFFont_GetWeight;                           N: 'FPDFFont_GetWeight'),
    (P: @@FPDFFont_GetItalicAngle;                      N: 'FPDFFont_GetItalicAngle'),
    (P: @@FPDFFont_GetAscent;                           N: 'FPDFFont_GetAscent'),
    (P: @@FPDFFont_GetDescent;                          N: 'FPDFFont_GetDescent'),
    (P: @@FPDFFont_GetGlyphWidth;                       N: 'FPDFFont_GetGlyphWidth'),
    (P: @@FPDFFont_GetGlyphPath;                        N: 'FPDFFont_GetGlyphPath'),
    (P: @@FPDFGlyphPath_CountGlyphSegments;             N: 'FPDFGlyphPath_CountGlyphSegments'),
    (P: @@FPDFGlyphPath_GetGlyphPathSegment;            N: 'FPDFGlyphPath_GetGlyphPathSegment'),
    (P: @@FPDFFormObj_CountObjects;                     N: 'FPDFFormObj_CountObjects'),
    (P: @@FPDFFormObj_GetObject;                        N: 'FPDFFormObj_GetObject'),

    // *** _FPDF_PPO_H_ ***
    (P: @@FPDF_ImportPagesByIndex;                      N: 'FPDF_ImportPagesByIndex'),
    (P: @@FPDF_ImportPages;                             N: 'FPDF_ImportPages'),
    (P: @@FPDF_ImportNPagesToOne;                       N: 'FPDF_ImportNPagesToOne'),
    (P: @@FPDF_NewXObjectFromPage;                      N: 'FPDF_NewXObjectFromPage'),
    (P: @@FPDF_CloseXObject;                            N: 'FPDF_CloseXObject'),
    (P: @@FPDF_NewFormObjectFromXObject;                N: 'FPDF_NewFormObjectFromXObject'),
    (P: @@FPDF_CopyViewerPreferences;                   N: 'FPDF_CopyViewerPreferences'),

    // *** _FPDF_SAVE_H_ ***
    (P: @@FPDF_SaveAsCopy;                              N: 'FPDF_SaveAsCopy'),
    (P: @@FPDF_SaveWithVersion;                         N: 'FPDF_SaveWithVersion'),

    // *** _FPDFTEXT_H_ ***
    (P: @@FPDFText_LoadPage;                            N: 'FPDFText_LoadPage'),
    (P: @@FPDFText_ClosePage;                           N: 'FPDFText_ClosePage'),
    (P: @@FPDFText_CountChars;                          N: 'FPDFText_CountChars'),
    (P: @@FPDFText_GetUnicode;                          N: 'FPDFText_GetUnicode'),
    (P: @@FPDFText_GetTextObject;                       N: 'FPDFText_GetTextObject'),
    (P: @@FPDFText_IsGenerated;                         N: 'FPDFText_IsGenerated'),
    (P: @@FPDFText_IsHyphen;                            N: 'FPDFText_IsHyphen'),
    (P: @@FPDFText_HasUnicodeMapError;                  N: 'FPDFText_HasUnicodeMapError'),
    (P: @@FPDFText_GetFontSize;                         N: 'FPDFText_GetFontSize'),
    (P: @@FPDFText_GetFontInfo;                         N: 'FPDFText_GetFontInfo'),
    (P: @@FPDFText_GetFontWeight;                       N: 'FPDFText_GetFontWeight'),
    (P: @@FPDFText_GetFillColor;                        N: 'FPDFText_GetFillColor'),
    (P: @@FPDFText_GetStrokeColor;                      N: 'FPDFText_GetStrokeColor'),
    (P: @@FPDFText_GetCharAngle;                        N: 'FPDFText_GetCharAngle'),
    (P: @@FPDFText_GetCharBox;                          N: 'FPDFText_GetCharBox'),
    (P: @@FPDFText_GetLooseCharBox;                     N: 'FPDFText_GetLooseCharBox'),
    (P: @@FPDFText_GetMatrix;                           N: 'FPDFText_GetMatrix'),
    (P: @@FPDFText_GetCharOrigin;                       N: 'FPDFText_GetCharOrigin'),
    (P: @@FPDFText_GetCharIndexAtPos;                   N: 'FPDFText_GetCharIndexAtPos'),
    (P: @@FPDFText_GetText;                             N: 'FPDFText_GetText'),
    (P: @@FPDFText_CountRects;                          N: 'FPDFText_CountRects'),
    (P: @@FPDFText_GetRect;                             N: 'FPDFText_GetRect'),
    (P: @@FPDFText_GetBoundedText;                      N: 'FPDFText_GetBoundedText'),
    (P: @@FPDFText_FindStart;                           N: 'FPDFText_FindStart'),
    (P: @@FPDFText_FindNext;                            N: 'FPDFText_FindNext'),
    (P: @@FPDFText_FindPrev;                            N: 'FPDFText_FindPrev'),
    (P: @@FPDFText_GetSchResultIndex;                   N: 'FPDFText_GetSchResultIndex'),
    (P: @@FPDFText_GetSchCount;                         N: 'FPDFText_GetSchCount'),
    (P: @@FPDFText_FindClose;                           N: 'FPDFText_FindClose'),
    (P: @@FPDFLink_LoadWebLinks;                        N: 'FPDFLink_LoadWebLinks'),
    (P: @@FPDFLink_CountWebLinks;                       N: 'FPDFLink_CountWebLinks'),
    (P: @@FPDFLink_GetURL;                              N: 'FPDFLink_GetURL'),
    (P: @@FPDFLink_CountRects;                          N: 'FPDFLink_CountRects'),
    (P: @@FPDFLink_GetRect;                             N: 'FPDFLink_GetRect'),
    (P: @@FPDFLink_GetTextRange;                        N: 'FPDFLink_GetTextRange'),
    (P: @@FPDFLink_CloseWebLinks;                       N: 'FPDFLink_CloseWebLinks'),

    // *** _FPDF_SEARCHEX_H_ ***
    (P: @@FPDFText_GetCharIndexFromTextIndex;           N: 'FPDFText_GetCharIndexFromTextIndex'),
    (P: @@FPDFText_GetTextIndexFromCharIndex;           N: 'FPDFText_GetTextIndexFromCharIndex'),

    // *** _FPDF_PROGRESSIVE_H_ ***
    (P: @@FPDF_RenderPageBitmapWithColorScheme_Start;   N: 'FPDF_RenderPageBitmapWithColorScheme_Start'),
    (P: @@FPDF_RenderPageBitmap_Start;                  N: 'FPDF_RenderPageBitmap_Start'),
    (P: @@FPDF_RenderPage_Continue;                     N: 'FPDF_RenderPage_Continue'),
    (P: @@FPDF_RenderPage_Close;                        N: 'FPDF_RenderPage_Close'),

    // *** _FPDF_SIGNATURE_H_ ***
    (P: @@FPDF_GetSignatureCount;                       N: 'FPDF_GetSignatureCount'),
    (P: @@FPDF_GetSignatureObject;                      N: 'FPDF_GetSignatureObject'),
    (P: @@FPDFSignatureObj_GetContents;                 N: 'FPDFSignatureObj_GetContents'),
    (P: @@FPDFSignatureObj_GetByteRange;                N: 'FPDFSignatureObj_GetByteRange'),
    (P: @@FPDFSignatureObj_GetSubFilter;                N: 'FPDFSignatureObj_GetSubFilter'),
    (P: @@FPDFSignatureObj_GetReason;                   N: 'FPDFSignatureObj_GetReason'),
    (P: @@FPDFSignatureObj_GetTime;                     N: 'FPDFSignatureObj_GetTime'),
    (P: @@FPDFSignatureObj_GetDocMDPPermission;         N: 'FPDFSignatureObj_GetDocMDPPermission'),

    // *** _FPDF_FLATTEN_H_ ***
    (P: @@FPDFPage_Flatten;                             N: 'FPDFPage_Flatten'),

    // *** _FPDF_DOC_H_ ***
    (P: @@FPDFBookmark_GetFirstChild;                   N: 'FPDFBookmark_GetFirstChild'),
    (P: @@FPDFBookmark_GetNextSibling;                  N: 'FPDFBookmark_GetNextSibling'),
    (P: @@FPDFBookmark_GetTitle;                        N: 'FPDFBookmark_GetTitle'),
    (P: @@FPDFBookmark_GetCount;                        N: 'FPDFBookmark_GetCount'),
    (P: @@FPDFBookmark_Find;                            N: 'FPDFBookmark_Find'),
    (P: @@FPDFBookmark_GetDest;                         N: 'FPDFBookmark_GetDest'),
    (P: @@FPDFBookmark_GetAction;                       N: 'FPDFBookmark_GetAction'),
    (P: @@FPDFAction_GetDest;                           N: 'FPDFAction_GetDest'),
    (P: @@FPDFAction_GetType;                           N: 'FPDFAction_GetType'),
    (P: @@FPDFAction_GetFilePath;                       N: 'FPDFAction_GetFilePath'),
    (P: @@FPDFAction_GetURIPath;                        N: 'FPDFAction_GetURIPath'),
    (P: @@FPDFDest_GetDestPageIndex;                    N: 'FPDFDest_GetDestPageIndex'),
    (P: @@FPDFDest_GetView;                             N: 'FPDFDest_GetView'),
    (P: @@FPDFDest_GetLocationInPage;                   N: 'FPDFDest_GetLocationInPage'),
    (P: @@FPDFLink_GetLinkAtPoint;                      N: 'FPDFLink_GetLinkAtPoint'),
    (P: @@FPDFLink_GetLinkZOrderAtPoint;                N: 'FPDFLink_GetLinkZOrderAtPoint'),
    (P: @@FPDFLink_GetDest;                             N: 'FPDFLink_GetDest'),
    (P: @@FPDFLink_GetAction;                           N: 'FPDFLink_GetAction'),
    (P: @@FPDFLink_Enumerate;                           N: 'FPDFLink_Enumerate'),
    (P: @@FPDFLink_GetAnnot;                            N: 'FPDFLink_GetAnnot'),
    (P: @@FPDFLink_GetAnnotRect;                        N: 'FPDFLink_GetAnnotRect'),
    (P: @@FPDFLink_CountQuadPoints;                     N: 'FPDFLink_CountQuadPoints'),
    (P: @@FPDFLink_GetQuadPoints;                       N: 'FPDFLink_GetQuadPoints'),
    (P: @@FPDF_GetPageAAction;                          N: 'FPDF_GetPageAAction'),
    (P: @@FPDF_GetFileIdentifier;                       N: 'FPDF_GetFileIdentifier'),
    (P: @@FPDF_GetMetaText;                             N: 'FPDF_GetMetaText'),
    (P: @@FPDF_GetPageLabel;                            N: 'FPDF_GetPageLabel'),

    // *** _FPDF_SYSFONTINFO_H_ ***
    (P: @@FPDF_GetDefaultTTFMap;                        N: 'FPDF_GetDefaultTTFMap'),
    (P: @@FPDF_GetDefaultTTFMapCount;                   N: 'FPDF_GetDefaultTTFMapCount'),
    (P: @@FPDF_GetDefaultTTFMapEntry;                   N: 'FPDF_GetDefaultTTFMapEntry'),
    (P: @@FPDF_AddInstalledFont;                        N: 'FPDF_AddInstalledFont'),
    (P: @@FPDF_SetSystemFontInfo;                       N: 'FPDF_SetSystemFontInfo'),
    (P: @@FPDF_GetDefaultSystemFontInfo;                N: 'FPDF_GetDefaultSystemFontInfo'),
    (P: @@FPDFDoc_GetPageMode;                          N: 'FPDFDoc_GetPageMode'),

    // *** _FPDF_EXT_H_ ***
    (P: @@FSDK_SetUnSpObjProcessHandler;                N: 'FSDK_SetUnSpObjProcessHandler'),
    (P: @@FSDK_SetTimeFunction;                         N: 'FSDK_SetTimeFunction'),
    (P: @@FSDK_SetLocaltimeFunction;                    N: 'FSDK_SetLocaltimeFunction'),

    // *** _FPDF_DATAAVAIL_H_ ***
    (P: @@FPDFAvail_Create;                             N: 'FPDFAvail_Create'),
    (P: @@FPDFAvail_Destroy;                            N: 'FPDFAvail_Destroy'),
    (P: @@FPDFAvail_IsDocAvail;                         N: 'FPDFAvail_IsDocAvail'),
    (P: @@FPDFAvail_GetDocument;                        N: 'FPDFAvail_GetDocument'),
    (P: @@FPDFAvail_GetFirstPageNum;                    N: 'FPDFAvail_GetFirstPageNum'),
    (P: @@FPDFAvail_IsPageAvail;                        N: 'FPDFAvail_IsPageAvail'),
    (P: @@FPDFAvail_IsFormAvail;                        N: 'FPDFAvail_IsFormAvail'),
    (P: @@FPDFAvail_IsLinearized;                       N: 'FPDFAvail_IsLinearized'),

    // *** _FPD_FORMFILL_H ***
    (P: @@FPDFDOC_InitFormFillEnvironment;              N: 'FPDFDOC_InitFormFillEnvironment'),
    (P: @@FPDFDOC_ExitFormFillEnvironment;              N: 'FPDFDOC_ExitFormFillEnvironment'),
    (P: @@FORM_OnAfterLoadPage;                         N: 'FORM_OnAfterLoadPage'),
    (P: @@FORM_OnBeforeClosePage;                       N: 'FORM_OnBeforeClosePage'),
    (P: @@FORM_DoDocumentJSAction;                      N: 'FORM_DoDocumentJSAction'),
    (P: @@FORM_DoDocumentOpenAction;                    N: 'FORM_DoDocumentOpenAction'),
    (P: @@FORM_DoDocumentAAction;                       N: 'FORM_DoDocumentAAction'),
    (P: @@FORM_DoPageAAction;                           N: 'FORM_DoPageAAction'),
    (P: @@FORM_OnMouseMove;                             N: 'FORM_OnMouseMove'),
    (P: @@FORM_OnMouseWheel;                            N: 'FORM_OnMouseWheel'),
    (P: @@FORM_OnFocus;                                 N: 'FORM_OnFocus'),
    (P: @@FORM_OnLButtonDown;                           N: 'FORM_OnLButtonDown'),
    (P: @@FORM_OnRButtonDown;                           N: 'FORM_OnRButtonDown'),
    (P: @@FORM_OnLButtonUp;                             N: 'FORM_OnLButtonUp'),
    (P: @@FORM_OnRButtonUp;                             N: 'FORM_OnRButtonUp'),
    (P: @@FORM_OnLButtonDoubleClick;                    N: 'FORM_OnLButtonDoubleClick'),
    (P: @@FORM_OnKeyDown;                               N: 'FORM_OnKeyDown'),
    (P: @@FORM_OnKeyUp;                                 N: 'FORM_OnKeyUp'),
    (P: @@FORM_OnChar;                                  N: 'FORM_OnChar'),
    (P: @@FORM_GetFocusedText;                          N: 'FORM_GetFocusedText'),
    (P: @@FORM_GetSelectedText;                         N: 'FORM_GetSelectedText'),
    (P: @@FORM_ReplaceAndKeepSelection;                 N: 'FORM_ReplaceAndKeepSelection'),
    (P: @@FORM_ReplaceSelection;                        N: 'FORM_ReplaceSelection'),
    (P: @@FORM_SelectAllText;                           N: 'FORM_SelectAllText'),
    (P: @@FORM_CanUndo;                                 N: 'FORM_CanUndo'),
    (P: @@FORM_CanRedo;                                 N: 'FORM_CanRedo'),
    (P: @@FORM_Undo;                                    N: 'FORM_Undo'),
    (P: @@FORM_Redo;                                    N: 'FORM_Redo'),
    (P: @@FORM_ForceToKillFocus;                        N: 'FORM_ForceToKillFocus'),
    (P: @@FORM_GetFocusedAnnot;                         N: 'FORM_GetFocusedAnnot'),
    (P: @@FORM_SetFocusedAnnot;                         N: 'FORM_SetFocusedAnnot'),
    (P: @@FPDFPage_HasFormFieldAtPoint;                 N: 'FPDFPage_HasFormFieldAtPoint'),
    (P: @@FPDFPage_FormFieldZOrderAtPoint;              N: 'FPDFPage_FormFieldZOrderAtPoint'),
    (P: @@FPDF_SetFormFieldHighlightColor;              N: 'FPDF_SetFormFieldHighlightColor'),
    (P: @@FPDF_SetFormFieldHighlightAlpha;              N: 'FPDF_SetFormFieldHighlightAlpha'),
    (P: @@FPDF_RemoveFormFieldHighlight;                N: 'FPDF_RemoveFormFieldHighlight'),
    (P: @@FPDF_FFLDraw;                                 N: 'FPDF_FFLDraw'),
    {$IFDEF PDF_USE_SKIA}
    (P: @@FPDF_FFLDrawSkia;                             N: 'FPDF_FFLDrawSkia'; Quirk: True; Optional: True),
    {$ENDIF PDF_USE_SKIA}

    (P: @@FPDF_GetFormType;                             N: 'FPDF_GetFormType'),
    (P: @@FORM_SetIndexSelected;                        N: 'FORM_SetIndexSelected'),
    (P: @@FORM_IsIndexSelected;                         N: 'FORM_IsIndexSelected'),
    (P: @@FPDF_LoadXFA;                                 N: 'FPDF_LoadXFA'),

    // *** _FPDF_CATALOG_H_ ***
    (P: @@FPDFCatalog_IsTagged;                         N: 'FPDFCatalog_IsTagged'),

    // *** _FPDF_ATTACHMENT_H_ ***
    (P: @@FPDFDoc_GetAttachmentCount;                   N: 'FPDFDoc_GetAttachmentCount'),
    (P: @@FPDFDoc_AddAttachment;                        N: 'FPDFDoc_AddAttachment'),
    (P: @@FPDFDoc_GetAttachment;                        N: 'FPDFDoc_GetAttachment'),
    (P: @@FPDFDoc_DeleteAttachment;                     N: 'FPDFDoc_DeleteAttachment'),
    (P: @@FPDFAttachment_GetName;                       N: 'FPDFAttachment_GetName'),
    (P: @@FPDFAttachment_HasKey;                        N: 'FPDFAttachment_HasKey'),
    (P: @@FPDFAttachment_GetValueType;                  N: 'FPDFAttachment_GetValueType'),
    (P: @@FPDFAttachment_SetStringValue;                N: 'FPDFAttachment_SetStringValue'),
    (P: @@FPDFAttachment_GetStringValue;                N: 'FPDFAttachment_GetStringValue'),
    (P: @@FPDFAttachment_SetFile;                       N: 'FPDFAttachment_SetFile'),
    (P: @@FPDFAttachment_GetFile;                       N: 'FPDFAttachment_GetFile'),

    // *** _FPDF_TRANSFORMPAGE_H_ ***
    (P: @@FPDFPage_SetMediaBox;                         N: 'FPDFPage_SetMediaBox'),
    (P: @@FPDFPage_SetCropBox;                          N: 'FPDFPage_SetCropBox'),
    (P: @@FPDFPage_SetBleedBox;                         N: 'FPDFPage_SetBleedBox'),
    (P: @@FPDFPage_SetTrimBox;                          N: 'FPDFPage_SetTrimBox'),
    (P: @@FPDFPage_SetArtBox;                           N: 'FPDFPage_SetArtBox'),
    (P: @@FPDFPage_GetMediaBox;                         N: 'FPDFPage_GetMediaBox'),
    (P: @@FPDFPage_GetCropBox;                          N: 'FPDFPage_GetCropBox'),
    (P: @@FPDFPage_GetBleedBox;                         N: 'FPDFPage_GetBleedBox'),
    (P: @@FPDFPage_GetTrimBox;                          N: 'FPDFPage_GetTrimBox'),
    (P: @@FPDFPage_GetArtBox;                           N: 'FPDFPage_GetArtBox'),
    (P: @@FPDFPage_TransFormWithClip;                   N: 'FPDFPage_TransFormWithClip'),
    (P: @@FPDFPageObj_TransformClipPath;                N: 'FPDFPageObj_TransformClipPath'),
    (P: @@FPDFPageObj_GetClipPath;                      N: 'FPDFPageObj_GetClipPath'),
    (P: @@FPDFClipPath_CountPaths;                      N: 'FPDFClipPath_CountPaths'),
    (P: @@FPDFClipPath_CountPathSegments;               N: 'FPDFClipPath_CountPathSegments'),
    (P: @@FPDFClipPath_GetPathSegment;                  N: 'FPDFClipPath_GetPathSegment'),
    (P: @@FPDF_CreateClipPath;                          N: 'FPDF_CreateClipPath'),
    (P: @@FPDF_DestroyClipPath;                         N: 'FPDF_DestroyClipPath'),
    (P: @@FPDFPage_InsertClipPath;                      N: 'FPDFPage_InsertClipPath'),

    // *** _FPDF_STRUCTTREE_H_ ***
    (P: @@FPDF_StructTree_GetForPage;                   N: 'FPDF_StructTree_GetForPage'),
    (P: @@FPDF_StructTree_Close;                        N: 'FPDF_StructTree_Close'),
    (P: @@FPDF_StructTree_CountChildren;                N: 'FPDF_StructTree_CountChildren'),
    (P: @@FPDF_StructTree_GetChildAtIndex;              N: 'FPDF_StructTree_GetChildAtIndex'),
    (P: @@FPDF_StructElement_GetAltText;                N: 'FPDF_StructElement_GetAltText'),
    (P: @@FPDF_StructElement_GetActualText;             N: 'FPDF_StructElement_GetActualText'),
    (P: @@FPDF_StructElement_GetID;                     N: 'FPDF_StructElement_GetID'),
    (P: @@FPDF_StructElement_GetLang;                   N: 'FPDF_StructElement_GetLang'),
    (P: @@FPDF_StructElement_GetStringAttribute;        N: 'FPDF_StructElement_GetStringAttribute'),
    (P: @@FPDF_StructElement_GetMarkedContentID;        N: 'FPDF_StructElement_GetMarkedContentID'),
    (P: @@FPDF_StructElement_GetType;                   N: 'FPDF_StructElement_GetType'),
    (P: @@FPDF_StructElement_GetObjType;                N: 'FPDF_StructElement_GetObjType'),
    (P: @@FPDF_StructElement_GetTitle;                  N: 'FPDF_StructElement_GetTitle'),
    (P: @@FPDF_StructElement_CountChildren;             N: 'FPDF_StructElement_CountChildren'),
    (P: @@FPDF_StructElement_GetChildAtIndex;           N: 'FPDF_StructElement_GetChildAtIndex'),
    (P: @@FPDF_StructElement_GetChildMarkedContentID;   N: 'FPDF_StructElement_GetChildMarkedContentID'),
    (P: @@FPDF_StructElement_GetParent;                 N: 'FPDF_StructElement_GetParent'),
    (P: @@FPDF_StructElement_GetAttributeCount;         N: 'FPDF_StructElement_GetAttributeCount'),
    (P: @@FPDF_StructElement_GetAttributeAtIndex;       N: 'FPDF_StructElement_GetAttributeAtIndex'),
    (P: @@FPDF_StructElement_Attr_GetCount;             N: 'FPDF_StructElement_Attr_GetCount'),
    (P: @@FPDF_StructElement_Attr_GetName;              N: 'FPDF_StructElement_Attr_GetName'),
    (P: @@FPDF_StructElement_Attr_GetType;              N: 'FPDF_StructElement_Attr_GetType'),
    (P: @@FPDF_StructElement_Attr_GetBooleanValue;      N: 'FPDF_StructElement_Attr_GetBooleanValue'),
    (P: @@FPDF_StructElement_Attr_GetNumberValue;       N: 'FPDF_StructElement_Attr_GetNumberValue'),
    (P: @@FPDF_StructElement_Attr_GetStringValue;       N: 'FPDF_StructElement_Attr_GetStringValue'),
    (P: @@FPDF_StructElement_Attr_GetBlobValue;         N: 'FPDF_StructElement_Attr_GetBlobValue'),
    (P: @@FPDF_StructElement_Attr_CountChildren;        N: 'FPDF_StructElement_Attr_CountChildren'),
    (P: @@FPDF_StructElement_Attr_GetChildAtIndex;      N: 'FPDF_StructElement_Attr_GetChildAtIndex'),
    (P: @@FPDF_StructElement_GetMarkedContentIdCount;   N: 'FPDF_StructElement_GetMarkedContentIdCount'),
    (P: @@FPDF_StructElement_GetMarkedContentIdAtIndex; N: 'FPDF_StructElement_GetMarkedContentIdAtIndex'),

    (P: @@FPDFAnnot_IsSupportedSubtype;                 N: 'FPDFAnnot_IsSupportedSubtype'),
    (P: @@FPDFPage_CreateAnnot;                         N: 'FPDFPage_CreateAnnot'),
    (P: @@FPDFPage_GetAnnotCount;                       N: 'FPDFPage_GetAnnotCount'),
    (P: @@FPDFPage_GetAnnot;                            N: 'FPDFPage_GetAnnot'),
    (P: @@FPDFPage_GetAnnotIndex;                       N: 'FPDFPage_GetAnnotIndex'),
    (P: @@FPDFPage_CloseAnnot;                          N: 'FPDFPage_CloseAnnot'),
    (P: @@FPDFPage_RemoveAnnot;                         N: 'FPDFPage_RemoveAnnot'),
    (P: @@FPDFAnnot_GetSubtype;                         N: 'FPDFAnnot_GetSubtype'),
    (P: @@FPDFAnnot_IsObjectSupportedSubtype;           N: 'FPDFAnnot_IsObjectSupportedSubtype'),
    (P: @@FPDFAnnot_UpdateObject;                       N: 'FPDFAnnot_UpdateObject'),
    (P: @@FPDFAnnot_AddInkStroke;                       N: 'FPDFAnnot_AddInkStroke'),
    (P: @@FPDFAnnot_RemoveInkList;                      N: 'FPDFAnnot_RemoveInkList'),
    (P: @@FPDFAnnot_AppendObject;                       N: 'FPDFAnnot_AppendObject'),
    (P: @@FPDFAnnot_GetObjectCount;                     N: 'FPDFAnnot_GetObjectCount'),
    (P: @@FPDFAnnot_GetObject;                          N: 'FPDFAnnot_GetObject'),
    (P: @@FPDFAnnot_RemoveObject;                       N: 'FPDFAnnot_RemoveObject'),
    (P: @@FPDFAnnot_SetColor;                           N: 'FPDFAnnot_SetColor'),
    (P: @@FPDFAnnot_GetColor;                           N: 'FPDFAnnot_GetColor'),
    (P: @@FPDFAnnot_HasAttachmentPoints;                N: 'FPDFAnnot_HasAttachmentPoints'),
    (P: @@FPDFAnnot_SetAttachmentPoints;                N: 'FPDFAnnot_SetAttachmentPoints'),
    (P: @@FPDFAnnot_AppendAttachmentPoints;             N: 'FPDFAnnot_AppendAttachmentPoints'),
    (P: @@FPDFAnnot_CountAttachmentPoints;              N: 'FPDFAnnot_CountAttachmentPoints'),
    (P: @@FPDFAnnot_GetAttachmentPoints;                N: 'FPDFAnnot_GetAttachmentPoints'),
    (P: @@FPDFAnnot_SetRect;                            N: 'FPDFAnnot_SetRect'),
    (P: @@FPDFAnnot_GetRect;                            N: 'FPDFAnnot_GetRect'),
    (P: @@FPDFAnnot_GetVertices;                        N: 'FPDFAnnot_GetVertices'),
    (P: @@FPDFAnnot_GetInkListCount;                    N: 'FPDFAnnot_GetInkListCount'),
    (P: @@FPDFAnnot_GetInkListPath;                     N: 'FPDFAnnot_GetInkListPath'),
    (P: @@FPDFAnnot_GetLine;                            N: 'FPDFAnnot_GetLine'),
    (P: @@FPDFAnnot_SetBorder;                          N: 'FPDFAnnot_SetBorder'),
    (P: @@FPDFAnnot_GetBorder;                          N: 'FPDFAnnot_GetBorder'),
    (P: @@FPDFAnnot_GetFormAdditionalActionJavaScript;  N: 'FPDFAnnot_GetFormAdditionalActionJavaScript'),
    (P: @@FPDFAnnot_HasKey;                             N: 'FPDFAnnot_HasKey'),
    (P: @@FPDFAnnot_GetValueType;                       N: 'FPDFAnnot_GetValueType'),
    (P: @@FPDFAnnot_SetStringValue;                     N: 'FPDFAnnot_SetStringValue'),
    (P: @@FPDFAnnot_GetStringValue;                     N: 'FPDFAnnot_GetStringValue'),
    (P: @@FPDFAnnot_GetNumberValue;                     N: 'FPDFAnnot_GetNumberValue'),
    (P: @@FPDFAnnot_SetAP;                              N: 'FPDFAnnot_SetAP'),
    (P: @@FPDFAnnot_GetAP;                              N: 'FPDFAnnot_GetAP'),
    (P: @@FPDFAnnot_GetLinkedAnnot;                     N: 'FPDFAnnot_GetLinkedAnnot'),
    (P: @@FPDFAnnot_GetFlags;                           N: 'FPDFAnnot_GetFlags'),
    (P: @@FPDFAnnot_SetFlags;                           N: 'FPDFAnnot_SetFlags'),
    (P: @@FPDFAnnot_GetFormFieldFlags;                  N: 'FPDFAnnot_GetFormFieldFlags'),
    (P: @@FPDFAnnot_GetFormFieldAtPoint;                N: 'FPDFAnnot_GetFormFieldAtPoint'),
    (P: @@FPDFAnnot_GetFormFieldName;                   N: 'FPDFAnnot_GetFormFieldName'),
    (P: @@FPDFAnnot_GetFormFieldAlternateName;          N: 'FPDFAnnot_GetFormFieldAlternateName'),
    (P: @@FPDFAnnot_GetFormFieldType;                   N: 'FPDFAnnot_GetFormFieldType'),
    (P: @@FPDFAnnot_GetFormFieldValue;                  N: 'FPDFAnnot_GetFormFieldValue'),
    (P: @@FPDFAnnot_GetOptionCount;                     N: 'FPDFAnnot_GetOptionCount'),
    (P: @@FPDFAnnot_GetOptionLabel;                     N: 'FPDFAnnot_GetOptionLabel'),
    (P: @@FPDFAnnot_IsOptionSelected;                   N: 'FPDFAnnot_IsOptionSelected'),
    (P: @@FPDFAnnot_GetFontSize;                        N: 'FPDFAnnot_GetFontSize'),
    (P: @@FPDFAnnot_GetFontColor;                       N: 'FPDFAnnot_GetFontColor'),
    (P: @@FPDFAnnot_IsChecked;                          N: 'FPDFAnnot_IsChecked'),

    (P: @@FPDFAnnot_SetFocusableSubtypes;               N: 'FPDFAnnot_SetFocusableSubtypes'),
    (P: @@FPDFAnnot_GetFocusableSubtypesCount;          N: 'FPDFAnnot_GetFocusableSubtypesCount'),
    (P: @@FPDFAnnot_GetFocusableSubtypes;               N: 'FPDFAnnot_GetFocusableSubtypes'),
    (P: @@FPDFAnnot_GetLink;                            N: 'FPDFAnnot_GetLink'),
    (P: @@FPDFAnnot_GetFormControlCount;                N: 'FPDFAnnot_GetFormControlCount'),
    (P: @@FPDFAnnot_GetFormControlIndex;                N: 'FPDFAnnot_GetFormControlIndex'),
    (P: @@FPDFAnnot_GetFormFieldExportValue;            N: 'FPDFAnnot_GetFormFieldExportValue'),
    (P: @@FPDFAnnot_SetURI;                             N: 'FPDFAnnot_SetURI'),
    (P: @@FPDFAnnot_GetFileAttachment;                  N: 'FPDFAnnot_GetFileAttachment'),
    (P: @@FPDFAnnot_AddFileAttachment;                  N: 'FPDFAnnot_AddFileAttachment'),

    {$IFDEF PDF_ENABLE_V8}
    // *** _FPDF_LIBS_H_ ***
    (P: @@FPDF_InitEmbeddedLibraries;                   N: 'FPDF_InitEmbeddedLibraries'; Optional: True),
    {$ENDIF PDF_ENABLE_V8}

    // *** _FPDF_JAVASCRIPT_H_ ***
    (P: @@FPDFDoc_GetJavaScriptActionCount;             N: 'FPDFDoc_GetJavaScriptActionCount'),
    (P: @@FPDFDoc_GetJavaScriptAction;                  N: 'FPDFDoc_GetJavaScriptAction'),
    (P: @@FPDFDoc_CloseJavaScriptAction;                N: 'FPDFDoc_CloseJavaScriptAction'),
    (P: @@FPDFJavaScriptAction_GetName;                 N: 'FPDFJavaScriptAction_GetName'),
    (P: @@FPDFJavaScriptAction_GetScript;               N: 'FPDFJavaScriptAction_GetScript'),

    // *** _FPDF_THUMBNAIL_H_ ***
    (P: @@FPDFPage_GetDecodedThumbnailData;             N: 'FPDFPage_GetDecodedThumbnailData'),
    (P: @@FPDFPage_GetRawThumbnailData;                 N: 'FPDFPage_GetRawThumbnailData'),
    (P: @@FPDFPage_GetThumbnailAsBitmap;                N: 'FPDFPage_GetThumbnailAsBitmap')
  );
  {$IFDEF FPC}
    {$WARN 3175 on : Some fields coming before "$1" were not initialized}
    {$WARN 3177 on : Some fields coming after "$1" were not initialized}
  {$ENDIF FPC}

const
  pdfium_dll = 'pdfium.dll';

var
  PdfiumModule: HMODULE;

procedure NotLoaded; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};
begin
  raise Exception.CreateRes(@RsPdfiumNotLoaded);
end;

procedure FunctionNotSupported; {$IFDEF DLLEXPORT}stdcall{$ELSE}cdecl{$ENDIF};
begin
  raise Exception.CreateRes(@RsFunctionNotSupported);
end;

function PDF_USE_XFA: Boolean;
begin
  {$IFDEF PDF_ENABLE_XFA}
  Result := Assigned(FPDF_BStr_Init) and (@FPDF_BStr_Init <> @NotLoaded) and (@FPDF_BStr_Init <> @FunctionNotSupported);
  {$ELSE}
  Result := False;
  {$ENDIF PDF_ENABLE_XFA}
end;

function PDF_IsSkiaAvailable: Boolean;
begin
  {$IFDEF PDF_USE_SKIA}
  Result := Assigned(FPDF_RenderPageSkia) and (@FPDF_RenderPageSkia <> @NotLoaded) and (@FPDF_RenderPageSkia <> @FunctionNotSupported)
            and Assigned(FPDF_FFLDrawSkia) and (@FPDF_FFLDrawSkia <> @NotLoaded) and (@FPDF_FFLDrawSkia <> @FunctionNotSupported);
  {$ELSE}
  Result := False;
  {$ENDIF PDF_USE_SKIA}
end;

procedure Init;
var
  I: Integer;
begin
  for I := 0 to Length(ImportFuncs) - 1 do
    ImportFuncs[I].P^ := @NotLoaded;
end;

procedure InitPDFium(const DllPath: string{$IFDEF PDF_ENABLE_V8}; const ResPath: string{$ENDIF});
begin
  if DllPath <> '' then
    InitPDFiumEx(IncludeTrailingPathDelimiter(DllPath) + pdfium_dll{$IFDEF PDF_ENABLE_V8}, ResPath{$ENDIF})
  else
    InitPDFiumEx(''{$IFDEF PDF_ENABLE_V8}, ResPath{$ENDIF});
end;

procedure InitPDFiumEx(const DllFileName: string{$IFDEF PDF_ENABLE_V8}; const ResPath: string{$ENDIF});
var
  I: Integer;
  Path: string;
  LibraryConfig: FPDF_LIBRARY_CONFIG;
begin
  if PdfiumModule <> 0 then
    Exit;

  {$IFDEF CPUX64}
    {$IFDEF FPC}
  SetExceptionMask([exInvalidOp, exDenormalized, exZeroDivide, exOverflow, exUnderflow, exPrecision]);
    {$ELSE}
  // Pdfium requires all arithmetic exceptions to be masked in 64bit mode
  if GetExceptionMask <> exAllArithmeticExceptions then
    SetExceptionMask(exAllArithmeticExceptions);
    {$ENDIF FPC}
  {$ENDIF CPUX64}

  if DllFileName <> '' then
    PdfiumModule := SafeLoadLibrary(DllFileName)
  else
    PdfiumModule := SafeLoadLibrary(pdfium_dll);

  if PdfiumModule = 0 then
  begin
    {$IF not defined(FPC) and (CompilerVersion >= 24.0)} // XE3+
    if DllFileName <> '' then
      RaiseLastOSError(GetLastError, '.'#10#10 + DllFileName)
    else
      RaiseLastOSError(GetLastError, '.'#10#10 + pdfium_dll);
    {$ELSE}
    RaiseLastOSError;
    {$IFEND}
  end;

  // Import the pdfium.dll functions
  for I := 0 to Length(ImportFuncs) - 1 do
  begin
    if ImportFuncs[I].P^ = @NotLoaded then
    begin
      ImportFuncs[I].P^ := GetProcAddress(PdfiumModule, ImportFuncs[I].N);
      if ImportFuncs[I].P^ = nil then
      begin
        if ImportFuncs[I].Optional then
        begin
          if ImportFuncs[I].Quirk then
            ImportFuncs[I].P^ := @FunctionNotSupported;
        end
        else
        begin
          ImportFuncs[I].P^ := @NotLoaded;
          if not ImportFuncs[I].Quirk then
          begin
            FreeLibrary(PdfiumModule);
            PdfiumModule := 0;
            Init; // reset all functions to @NotLoaded
            raise Exception.CreateResFmt(@RsFailedToLoadProc, [ImportFuncs[I].N]);
          end;
        end;
      end;
    end;
  end;

  {$IFDEF PDF_ENABLE_V8}
  // Initialize the V8 engine if available
  if Assigned(FPDF_InitEmbeddedLibraries) then
  begin
    if ResPath <> '' then
      Path := IncludeTrailingPathDelimiter(ResPath)
    else if DllFileName <> '' then
    begin
      Path := ExtractFileDir(DllFileName);
      if Path <> '' then
        Path := IncludeTrailingPathDelimiter(Path);
    end;

    if Path = '' then
    begin
      // If the DLL was already loaded we can use its path
      Path := GetModuleName(PdfiumModule);
      if Path <> '' then
        Path := IncludeTrailingPathDelimiter(ExtractFilePath(Path));
    end;

    FPDF_InitEmbeddedLibraries(PAnsiChar(AnsiString(Path))); // requires trailing path delimiter
  end
  else
    @FPDF_InitEmbeddedLibraries := @FunctionNotSupported;
  {$ENDIF PDF_ENABLE_V8}

  // Initialize the pdfium library
  {$IFDEF FPC} {$WARN 5057 off : Local variable "$1" does not seem to be initialized} {$ENDIF FPC}
  FillChar(LibraryConfig, SizeOf(LibraryConfig), 0);
  {$IFDEF FPC} {$WARN 5057 on} {$ENDIF FPC}
  LibraryConfig.version := 2;
  LibraryConfig.m_RendererType := FPDF_RENDERERTYPE_AGG;
  {if IsSkiaAvailable and SkiaRendererEnabled then
    LibraryConfig.m_RendererType := FPDF_RENDERERTYPE_SKIA;}
  FPDF_InitLibraryWithConfig(@LibraryConfig);
end;

initialization
  Init;

finalization
  if PdfiumModule <> 0 then
  begin
    FPDF_DestroyLibrary;
    FreeLibrary(PdfiumModule);
  end;

end.

