/*
* PDFedit - free program for PDF document manipulation.
* Copyright (C) 2006, 2007 PDFedit team: Michal Hocko,
* Miroslav Jahoda,
* Jozef Misutka,
* Martin Petricek
*
* Project is hosted on http://sourceforge.net/projects/pdfedit
*/
/** @file
QObject wrapper around CPdf (PDF document)
Export some functions to scripting.
See doc/user/scripting.xml or kernel documentation for more informations about these functions
@author Martin Petricek
*/
#include
#include "qspdf.h"
#include "pdfutil.h"
#include
#include "qspage.h"
#include "qsdict.h"
#include
#include
#include "util.h"
namespace gui {
/**
Construct wrapper with given PDF document
@param _pdf Pdf document
@param _base Scripting base
@param _destructive If true, document will be closed (without saving) when this object is deleted
*/
QSPdf::QSPdf(CPdf *_pdf,BaseCore *_base,bool _destructive/*=false*/) : QSCObject ("Pdf",_base) {
destructive=_destructive;
obj=_pdf;
}
/** destructor */
QSPdf::~QSPdf() {
//Unload the pdf if this is 'destructive' PDF
unloadPdf();
}
/**
Close the document, if it was opened with 'destructive' flag set (via loadPdf).
Otherwise it does nothing.
The document must not be used in any way after it is closed
*/
void QSPdf::unloadPdf() {
if (obj && destructive) {
obj->close();
obj=NULL;
}
}
/**
Check validity of specified reference
@param valueNum Object number
@param valueGen Generation number
@return True if valid and is contained in this document
*/
bool QSPdf::referenceValid(int valueNum,int valueGen) {
if (nullPtr(obj,"referenceValid")) return false;
IndiRef ref;
ref.num=valueNum;
ref.gen=valueGen;
//Check reference validity
return util::isRefValid(obj,ref);
}
/**
Save copy under different name. Does not check if the file exists, overwrite anything without warning
@param name Name of file
@return true if saved successfully, false if any error occured
*/
bool QSPdf::saveAs(QString name) {
if (nullPtr(obj,"saveAs")) return false;
if (name.isNull()) return false;//No empty names!
return util::saveCopy(obj,name);
}
/**
Save document to disk under original name
@param newRevision If true, create new revision while saving
@return true if saved succesfully, false if failed to save because of any reason
*/
bool QSPdf::save(bool newRevision/*=false*/) {
try {
//Exception can occur while saving, for example if document is read-only
obj->save(newRevision);
return true;
} catch (ReadOnlyDocumentException &e) {
base->errorException("Pdf","save",tr("Document is in read-only mode"));
return false;
} catch (...) {
base->errorException("Pdf","save",tr("Unknown error occured while saving document"));
return false;
}
}
/**
\see CPdf::getDictionary
@return document catalog
*/
QSDict* QSPdf::getDictionary() {
if (nullPtr(obj,"getDictionary")) return NULL;
return new QSDict(obj->getDictionary(),base);
}
/**
\see CPdf::isLinearized()
@return True if document is linearized
*/
bool QSPdf::isLinearized() {
if (nullPtr(obj,"isLinearized")) return false;
return obj->isLinearized();
}
/**
Check for PDF validity - return true, if this object is valid PDF wrapper,
false if the pdf was closed or not yet opened
@return True if document is valid
*/
bool QSPdf::isValid() {
if (obj==NULL) return false;
return true;
}
/**
Insert page in document at specified position
\see CPdf::insertPage
@param page page to insert
@param position Positin in which to insert
*/
QSPage* QSPdf::insertPage(QSPage* page, int position) {
if (nullPtr(obj,"insertPage")) return NULL;
try {
return new QSPage(obj->insertPage(page->get(),position),base);
} catch (ReadOnlyDocumentException &e) {
base->errorException("Pdf","insertPage",QObject::tr("Document is read-only"));
return NULL;
}
}
/**
QSA bugfix version
\copydoc insertPage(QSPage*,int)
*/
QSPage* QSPdf::insertPage(QObject* page, int position) {
QSPage *qpage=qobject_cast(page,"insertPage",1,"Page");
if (!qpage) return NULL;//Something invalid passed
try {
return insertPage(qpage,position);
} catch (ReadOnlyDocumentException &e) {
base->errorException("Pdf","insertPage",QObject::tr("Document is read-only"));
return NULL;
}
}
/**
Remove page at given position
(numbering starts from 1)
\see CPdf::removePage()
@param position Page number to remove
*/
void QSPdf::removePage(int position) {
if (nullPtr(obj,"removePage")) return;
try {
obj->removePage(position);
} catch (ReadOnlyDocumentException &e) {
base->errorException("Pdf","removePage",QObject::tr("Document is read-only"));
} catch (PageNotFoundException &e) {
base->errorException("Pdf","removePage",tr("Page not found"));
}
}
/**
Return position of given page
\see CPdf::getPagePosition
@param page page to examine
@return page position or -1 in case of error (page not in document, invalid page, etc...)
*/
int QSPdf::getPagePosition(QSPage *page) {
if (nullPtr(obj,"getPagePosition")) return -1;
if (nullPtr(page,"getPagePosition")) return -1;
try {
return obj->getPagePosition(page->get());
} catch (...) {
//Probably "page not found"
return -1;
}
}
/**
\copydoc getPagePosition(QSPage *)
QSA bugfix version
*/
int QSPdf::getPagePosition(QObject *page) {
QSPage *qpage=qobject_cast(page,"getPagePosition",1,"Page");
if (!qpage) return -1;//Something invalid passed
return getPagePosition(qpage);
}
/**
Return number of pages in document
\see CPdf::getPageCount
@return count of pages
*/
int QSPdf::getPageCount() {
if (nullPtr(obj,"getPageCount")) return -1;
return obj->getPageCount();
}
/**
Return page at given position
(numbering starts from 1)
\see CPdf::getPage()
@param position Page number
@return page at positoin
*/
QSPage* QSPdf::getPage(int position) {
if (nullPtr(obj,"getPage")) return NULL;
try {
return new QSPage(obj->getPage(position),base);
} catch (PageNotFoundException &e) {
base->errorException("Pdf","getPage",tr("Page not found"));
return NULL;
}
}
/**
Get first page
\see CPdf::getFirstPage
@return first page in document
*/
QSPage* QSPdf::getFirstPage() {
if (nullPtr(obj,"getFirstPage")) return NULL;
try {
return new QSPage(obj->getFirstPage(),base);
} catch (PageNotFoundException &e) {
base->errorException("Pdf","getFirstPage",tr("Page not found"));
return NULL;
}
}
/**
Return page next to the one specified
\see CPdf::getNextPage
@param page Page to examine
@return next page
*/
QSPage* QSPdf::getNextPage(QSPage* page) {
if (nullPtr(obj,"getNextPage")) return NULL;
try {
return new QSPage(obj->getNextPage(page->get()),base);
} catch (PageNotFoundException &e) {
base->errorException("Pdf","getNextPage",tr("Page not found"));
return NULL;
}
}
/**
Return page previous to the one specified
\see CPdf::getPrevPage
@param page Page to examine
@return previous page
*/
QSPage* QSPdf::getPrevPage(QSPage* page) {
if (nullPtr(obj,"getPrevPage")) return NULL;
try {
return new QSPage(obj->getPrevPage(page->get()),base);
} catch (PageNotFoundException &e) {
base->errorException("Pdf","getPrevPage",tr("Page not found"));
return NULL;
}
}
/**
Return true if next page in relation to given page exists
\see CPdf::hasNextPage
@param page Page to examine
@return presence of next page
*/
bool QSPdf::hasNextPage(QSPage* page) {
if (nullPtr(obj,"hasNextPage")) return false;
return obj->hasNextPage(page->get());
}
/**
Return true if previous page in relation to given page exists
\see CPdf::hasPrevPage
@param page Page to examine
@return presence of previous page
*/
bool QSPdf::hasPrevPage(QSPage* page) {
if (nullPtr(obj,"hasPrevPage")) return false;
return obj->hasPrevPage(page->get());
}
/**
\copydoc getNextPage(QSPage*)
qsa bugfix version
*/
QSPage* QSPdf::getNextPage(QObject* page) {
QSPage *qpage=qobject_cast(page,"getNextPage",1,"Page");
if (!qpage) return NULL;
return getNextPage(qpage);
}
/**
\copydoc getPrevPage(QSPage*)
qsa bugfix version
*/
QSPage* QSPdf::getPrevPage(QObject* page) {
QSPage *qpage=qobject_cast(page,"getNextPage",1,"Page");
if (!qpage) return NULL;
return getPrevPage(qpage);
}
/**
\copydoc hasNextPage(QSPage*)
qsa bugfix version
*/
bool QSPdf::hasNextPage(QObject* page) {
QSPage *qpage=qobject_cast(page,"hasNextPage",1,"Page");
if (!qpage) return false;
return hasNextPage(qpage);
}
/**
\copydoc hasPrevPage(QSPage*)
qsa bugfix version
*/
bool QSPdf::hasPrevPage(QObject* page) {
QSPage *qpage=qobject_cast(page,"hasPrevPage",1,"Page");
if (!qpage) return false;
return hasPrevPage(qpage);
}
/**
Get count of revisions
\see CPdf::getRevisionsCount
@return count of revisions
*/
int QSPdf::getRevisionsCount() {
if (nullPtr(obj,"getRevisionsCount")) return 0;
return obj->getRevisionsCount();
}
/**
Get actual revision number
\see CPdf::getActualRevision
@return actual revison
*/
int QSPdf::getActualRevision() {
if (nullPtr(obj,"getActualRevision")) return 0;
return obj->getActualRevision();
}
/**
Get last page in document
\see CPdf::getLastPage
@return last page
*/
QSPage* QSPdf::getLastPage() {
if (nullPtr(obj,"getLastPage")) return 0;
try {
return new QSPage(obj->getLastPage(),base);
} catch (PageNotFoundException &e) {
base->errorException("Pdf","getLastPage",tr("Page not found"));
return NULL;
}
}
/**
Get CPdf held inside this class. Not exposed to scripting
@return CPdf object
*/
CPdf* QSPdf::get() const {
return obj;
}
/**
Set CPdf held inside this class. Not exposed to scripting
@param pdf CPdf object
*/
void QSPdf::set(CPdf* pdf) {
obj=pdf;
}
/**
Return name of filter used to encrypt the document, or NULL if document is not encrypted
@return Encryption filter
*/
QString QSPdf::encryption() {
if (nullPtr(obj,"encryption")) return 0;
std::string filter;
if (!pdfobjects::utils::isEncrypted(*obj,&filter)) return QString::null;
return util::convertToUnicode(filter,util::PDF);
}
} // namespace gui