blob: bc9ce20b0985ae23c09113ba70cba371f4c99051 [file] [log] [blame]
// Catalog.h
// Copyright 1996-2007 Glyph & Cog, LLC
// Modified under the Poppler project -
// All changes made under the Poppler project to this file are licensed
// under GPL version 2 or later
// Copyright (C) 2005 Kristian Høgsberg <>
// Copyright (C) 2005, 2007, 2009-2011, 2013 Albert Astals Cid <>
// Copyright (C) 2005 Jonathan Blandford <>
// Copyright (C) 2005, 2006, 2008 Brad Hards <>
// Copyright (C) 2007 Julien Rebetez <>
// Copyright (C) 2008, 2011 Pino Toscano <>
// Copyright (C) 2010 Hib Eris <>
// Copyright (C) 2012 Fabio D'Urso <>
// Copyright (C) 2013 Thomas Freitag <>
// Copyright (C) 2013 Adrian Perez de Castro <>
// Copyright (C) 2013 Adrian Johnson <>
// Copyright (C) 2013 José Aliste <>
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
#ifndef CATALOG_H
#define CATALOG_H
#pragma interface
#include "poppler-config.h"
#include "Object.h"
#include "goo/GooMutex.h"
#include <vector>
class PDFDoc;
class XRef;
class Object;
class Page;
class PageAttrs;
struct Ref;
class LinkDest;
class LinkAction;
class PageLabelInfo;
class Form;
class OCGs;
class ViewerPreferences;
class FileSpec;
class StructTreeRoot;
// NameTree
class NameTree {
void init(XRef *xref, Object *tree);
GBool lookup(GooString *name, Object *obj);
int numEntries() { return length; };
// iterator accessor, note it returns a shallow copy, do not free the object
Object getValue(int i);
GooString *getName(int i);
struct Entry {
Entry(Array *array, int index);
GooString name;
Object value;
void free();
static int cmpEntry(const void *voidEntry, const void *voidOtherEntry);
static int cmp(const void *key, const void *entry);
void parse(Object *tree);
void addEntry(Entry *entry);
XRef *xref;
Object *root;
Entry **entries;
int size, length; // size is the number of entries in
// the array of Entry*
// length is the number of real Entry
// Catalog
class Catalog {
// Constructor.
Catalog(PDFDoc *docA);
// Destructor.
// Is catalog valid?
GBool isOk() { return ok; }
// Get number of pages.
int getNumPages();
// Get a page.
Page *getPage(int i);
// Get the reference for a page object.
Ref *getPageRef(int i);
// Return base URI, or NULL if none.
GooString *getBaseURI() { return baseURI; }
// Return the contents of the metadata stream, or NULL if there is
// no metadata.
GooString *readMetadata();
// Return the structure tree root object.
StructTreeRoot *getStructTreeRoot();
// Return values from the MarkInfo dictionary as flags in a bitfield.
enum MarkInfoFlags {
markInfoNull = 1 << 0,
markInfoMarked = 1 << 1,
markInfoUserProperties = 1 << 2,
markInfoSuspects = 1 << 3,
Guint getMarkInfo();
// Find a page, given its object ID. Returns page number, or 0 if
// not found.
int findPage(int num, int gen);
// Find a named destination. Returns the link destination, or
// NULL if <name> is not a destination.
LinkDest *findDest(GooString *name);
Object *getDests();
// Get the number of embedded files
int numEmbeddedFiles() { return getEmbeddedFileNameTree()->numEntries(); }
// Get the i'th file embedded (at the Document level) in the document
FileSpec *embeddedFile(int i);
// Get the number of javascript scripts
int numJS() { return getJSNameTree()->numEntries(); }
GooString *getJSName(int i) { return getJSNameTree()->getName(i); }
// Get the i'th JavaScript script (at the Document level) in the document
GooString *getJS(int i);
// Convert between page indices and page labels.
GBool labelToIndex(GooString *label, int *index);
GBool indexToLabel(int index, GooString *label);
Object *getOutline();
Object *getAcroForm() { return &acroForm; }
OCGs *getOptContentConfig() { return optContent; }
enum FormType
FormType getFormType();
Form* getForm();
ViewerPreferences *getViewerPreferences();
enum PageMode {
enum PageLayout {
// Returns the page mode.
PageMode getPageMode();
PageLayout getPageLayout();
enum DocumentAdditionalActionsType {
actionCloseDocument, ///< Performed before closing the document
actionSaveDocumentStart, ///< Performed before saving the document
actionSaveDocumentFinish, ///< Performed after saving the document
actionPrintDocumentStart, ///< Performed before printing the document
actionPrintDocumentFinish, ///< Performed after printing the document
LinkAction *getAdditionalAction(DocumentAdditionalActionsType type);
// Get page label info.
PageLabelInfo *getPageLabelInfo();
PDFDoc *doc;
XRef *xref; // the xref table for this PDF file
Page **pages; // array of pages
Ref *pageRefs; // object ID for each page
int lastCachedPage;
std::vector<Dict *> *pagesList;
std::vector<Ref> *pagesRefList;
std::vector<PageAttrs *> *attrsList;
std::vector<int> *kidsIdxList;
Form *form;
ViewerPreferences *viewerPrefs;
int numPages; // number of pages
int pagesSize; // size of pages array
Object dests; // named destination dictionary
Object names; // named names dictionary
NameTree *destNameTree; // named destination name-tree
NameTree *embeddedFileNameTree; // embedded file name-tree
NameTree *jsNameTree; // Java Script name-tree
GooString *baseURI; // base URI for URI-type links
Object metadata; // metadata stream
StructTreeRoot *structTreeRoot; // structure tree root
Guint markInfo; // Flags from MarkInfo dictionary
Object outline; // outline dictionary
Object acroForm; // AcroForm dictionary
Object viewerPreferences; // ViewerPreference dictionary
OCGs *optContent; // Optional Content groups
GBool ok; // true if catalog is valid
PageLabelInfo *pageLabelInfo; // info about page labels
PageMode pageMode; // page mode
PageLayout pageLayout; // page layout
Object additionalActions; // page additional actions
GBool cachePageTree(int page); // Cache first <page> pages.
Object *findDestInTree(Object *tree, GooString *name, Object *obj);
Object *getNames();
NameTree *getDestNameTree();
NameTree *getEmbeddedFileNameTree();
NameTree *getJSNameTree();
GooMutex mutex;