text: //========================================================================
  //
  // PDFDoc.h
  //
  // Copyright 1996-2003 Glyph & Cog, LLC
  //
  //========================================================================
  
  #ifndef PDFDOC_H
  #define PDFDOC_H
  
  #include <xpdf-aconf.h>
  
  #ifdef USE_GCC_PRAGMAS
  #pragma interface
  #endif
  
  #include <stdio.h>
  #include "xpdf/XRef.h"
  #include "xpdf/Catalog.h"
  #include "xpdf/Page.h"
  
  class GString;
  class BaseStream;
  class OutputDev;
  class Links;
  class LinkAction;
  class LinkDest;
  class Outline;
  
  //------------------------------------------------------------------------
  // PDFDoc
  //------------------------------------------------------------------------
  
  class PDFDoc {
  public:
  
    PDFDoc(GString *fileNameA, GString *ownerPassword = NULL,
  	 GString *userPassword = NULL, void *guiDataA = NULL);
  #ifdef WIN32
    PDFDoc(wchar_t *fileNameA, int fileNameLen, GString *ownerPassword = NULL,
  	 GString *userPassword = NULL, void *guiDataA = NULL);
  #endif
    PDFDoc(BaseStream *strA, GString *ownerPassword = NULL,
  	 GString *userPassword = NULL, void *guiDataA = NULL);
    ~PDFDoc();
  
    // Was PDF document successfully opened?
    GBool isOk() { return ok; }
  
    // Get the error code (if isOk() returns false).
    int getErrorCode() { return errCode; }
  
    // Get file name.
    GString *getFileName() { return fileName; }
  
    // Get the xref table.
    XRef *getXRef() { return xref; }
  
    // Get catalog.
    Catalog *getCatalog() { return catalog; }
  
    // Get base stream.
    BaseStream *getBaseStream() { return str; }
  
    // Get page parameters.
    double getPageMediaWidth(int page)
      { return catalog->getPage(page)->getMediaWidth(); }
    double getPageMediaHeight(int page)
      { return catalog->getPage(page)->getMediaHeight(); }
    double getPageCropWidth(int page)
      { return catalog->getPage(page)->getCropWidth(); }
    double getPageCropHeight(int page)
      { return catalog->getPage(page)->getCropHeight(); }
    int getPageRotate(int page)
      { return catalog->getPage(page)->getRotate(); }
  
    // Get number of pages.
    int getNumPages()const { return catalog->getNumPages(); }
  
    // Return the contents of the metadata stream, or NULL if there is
    // no metadata.
    const GString *readMetadata() { return catalog->readMetadata(); }
  
    // Return the structure tree root object.
    const Object *getStructTreeRoot() { return catalog->getStructTreeRoot(); }
  
    // Display a page.
    void displayPage(OutputDev *out, int page,
  		   double hDPI, double vDPI, int rotate,
  		   GBool useMediaBox, GBool crop, GBool printing,
  		   GBool (*abortCheckCbk)(void *data) = NULL,
  		   void *abortCheckCbkData = NULL);
  
    // Display a range of pages.
    void displayPages(OutputDev *out, int firstPage, int lastPage,
  		    double hDPI, double vDPI, int rotate,
  		    GBool useMediaBox, GBool crop, GBool printing,
  		    GBool (*abortCheckCbk)(void *data) = NULL,
  		    void *abortCheckCbkData = NULL);
  
    // Display part of a page.
    void displayPageSlice(OutputDev *out, int page,
  			double hDPI, double vDPI, int rotate,
  			GBool useMediaBox, GBool crop, GBool printing,
  			int sliceX, int sliceY, int sliceW, int sliceH,
  			GBool (*abortCheckCbk)(void *data) = NULL,
  			void *abortCheckCbkData = NULL);
  
    // Find a page, given its object ID.  Returns page number, or 0 if
    // not found.
    int findPage(int num, int gen) { return catalog->findPage(num, gen); }
  
    // Returns the links for the current page, transferring ownership to
    // the caller.
    Links *getLinks(int page);
  
    // Find a named destination.  Returns the link destination, or
    // NULL if <name> is not a destination.
    LinkDest *findDest(GString *name)
      { return catalog->findDest(name); }
  
    // Process the links for a page.
    void processLinks(OutputDev *out, int page);
  
  #ifndef DISABLE_OUTLINE
    // Return the outline object.
    Outline *getOutline() { return outline; }
  #endif
  
    // Is the file encrypted?
    GBool isEncrypted() { return xref->isEncrypted(); }
  
    // Check various permissions.
    GBool okToPrint(GBool ignoreOwnerPW = gFalse)
      { return xref->okToPrint(ignoreOwnerPW); }
    GBool okToChange(GBool ignoreOwnerPW = gFalse)
      { return xref->okToChange(ignoreOwnerPW); }
    GBool okToCopy(GBool ignoreOwnerPW = gFalse)
      { return xref->okToCopy(ignoreOwnerPW); }
    GBool okToAddNotes(GBool ignoreOwnerPW = gFalse)
      { return xref->okToAddNotes(ignoreOwnerPW); }
  
    // Is this document linearized?
    //GBool isLinearized();
  
    // Return the document's Info dictionary (if any).
    Object *getDocInfo(Object *obj) { return xref->getDocInfo(obj); }
    Object *getDocInfoNF(Object *obj) { return xref->getDocInfoNF(obj); }
  
    // Return the PDF version specified by the file.
    double getPDFVersion() { return pdfVersion; }
  
    // Save this file with another name.
    GBool saveAs(GString *name);
  
    // Return a pointer to the GUI (XPDFCore or WinPDFCore object).
    void *getGUIData() { return guiData; }
  
  
  private:
  
    GBool setup(GString *ownerPassword, GString *userPassword);
    void checkHeader();
    GBool checkEncryption(GString *ownerPassword, GString *userPassword);
  
    GString *fileName;
    FILE *file;
    BaseStream *str;
    void *guiData;
    double pdfVersion;
    XRef *xref;
    Catalog *catalog;
  #ifndef DISABLE_OUTLINE
    Outline *outline;
  #endif
  
  
    GBool ok;
    int errCode;
  };
  
  #endif
  