CMake support still needs to be added git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdegraphics@1237420 283d02a7-25f6-0310-bc7c-ecb5cbfe19dav3.5.13-sru
parent
a6df54bf10
commit
eecec9afb8
@ -0,0 +1,42 @@
|
||||
INCLUDES = \
|
||||
-I$(top_srcdir) \
|
||||
-I/usr/include/poppler \
|
||||
$(cairo_includes) \
|
||||
$(QT_INCLUDES) \
|
||||
$(FREETYPE_CFLAGS) \
|
||||
$(FONTCONFIG_CFLAGS)
|
||||
|
||||
|
||||
poppler_includedir = $(includedir)/poppler/qt3
|
||||
poppler_include_HEADERS = \
|
||||
poppler-qt.h \
|
||||
poppler-page-transition.h \
|
||||
poppler-link-qt3.h
|
||||
|
||||
lib_LTLIBRARIES = libpoppler-qt.la
|
||||
libpoppler_qt_la_SOURCES = \
|
||||
poppler-document.cc \
|
||||
poppler-fontinfo.cc \
|
||||
poppler-link.cc \
|
||||
poppler-page.cc \
|
||||
poppler-page-transition.cc \
|
||||
poppler-page-transition-private.h \
|
||||
poppler-private.cc \
|
||||
poppler-private.h
|
||||
|
||||
libpoppler_qt_la_LIBADD = \
|
||||
-lpoppler \
|
||||
$(QT_LIBS) \
|
||||
$(FREETYPE_LIBS) \
|
||||
$(FONTCONFIG_LIBS)
|
||||
|
||||
# libpoppler_qt_la_LDFLAGS = -version-info 2:0:0 @create_shared_lib@
|
||||
|
||||
test_poppler_qt_SOURCES = \
|
||||
test-poppler-qt.cpp
|
||||
|
||||
test_poppler_qt_LDADD = \
|
||||
$(top_builddir)/poppler/libpoppler.la \
|
||||
libpoppler-qt.la \
|
||||
$(QT_LIBS) \
|
||||
$(FREETYPE_LIBS)
|
@ -0,0 +1,334 @@
|
||||
/* poppler-document.cc: qt interface to poppler
|
||||
* Copyright (C) 2005, Net Integration Technologies, Inc.
|
||||
* Copyright (C) 2005-2009, Albert Astals Cid <aacid@kde.org>
|
||||
* Copyright (C) 2006, Stefan Kebekus <stefan.kebekus@math.uni-koeln.de>
|
||||
* Copyright (C) 2006, Wilfried Huss <Wilfried.Huss@gmx.at>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#include <poppler-qt.h>
|
||||
#include <qfile.h>
|
||||
#include <GlobalParams.h>
|
||||
#include <Outline.h>
|
||||
#include <PDFDoc.h>
|
||||
#include <PSOutputDev.h>
|
||||
#include <Catalog.h>
|
||||
#include <ErrorCodes.h>
|
||||
#include <SplashOutputDev.h>
|
||||
#include <splash/SplashBitmap.h>
|
||||
#include <DateInfo.h>
|
||||
#include "poppler-private.h"
|
||||
|
||||
#undef bool
|
||||
|
||||
namespace Poppler {
|
||||
|
||||
Document *Document::load(const QString &filePath)
|
||||
{
|
||||
if (!globalParams) {
|
||||
globalParams = new GlobalParams();
|
||||
}
|
||||
|
||||
DocumentData *doc = new DocumentData(new GooString(QFile::encodeName(filePath)), NULL);
|
||||
Document *pdoc;
|
||||
if (doc->doc.isOk() || doc->doc.getErrorCode() == errEncrypted) {
|
||||
pdoc = new Document(doc);
|
||||
if (doc->doc.getErrorCode() == errEncrypted)
|
||||
pdoc->data->locked = true;
|
||||
else
|
||||
pdoc->data->locked = false;
|
||||
pdoc->data->m_fontInfoScanner = new FontInfoScanner(&(doc->doc));
|
||||
return pdoc;
|
||||
}
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Document::Document(DocumentData *dataA)
|
||||
{
|
||||
data = dataA;
|
||||
}
|
||||
|
||||
Document::~Document()
|
||||
{
|
||||
delete data;
|
||||
}
|
||||
|
||||
bool Document::isLocked() const
|
||||
{
|
||||
return data->locked;
|
||||
}
|
||||
|
||||
bool Document::unlock(const QCString &password)
|
||||
{
|
||||
if (data->locked) {
|
||||
/* racier then it needs to be */
|
||||
GooString *filename = new GooString(data->doc.getFileName());
|
||||
GooString *pwd = new GooString(password.data());
|
||||
DocumentData *doc2 = new DocumentData(filename, pwd);
|
||||
delete pwd;
|
||||
if (!doc2->doc.isOk()) {
|
||||
delete doc2;
|
||||
} else {
|
||||
delete data;
|
||||
data = doc2;
|
||||
data->locked = false;
|
||||
data->m_fontInfoScanner = new FontInfoScanner(&(data->doc));
|
||||
}
|
||||
}
|
||||
return data->locked;
|
||||
}
|
||||
|
||||
Document::PageMode Document::getPageMode(void) const
|
||||
{
|
||||
switch (data->doc.getCatalog()->getPageMode()) {
|
||||
case Catalog::pageModeNone:
|
||||
return UseNone;
|
||||
case Catalog::pageModeOutlines:
|
||||
return UseOutlines;
|
||||
case Catalog::pageModeThumbs:
|
||||
return UseThumbs;
|
||||
case Catalog::pageModeFullScreen:
|
||||
return FullScreen;
|
||||
case Catalog::pageModeOC:
|
||||
return UseOC;
|
||||
default:
|
||||
return UseNone;
|
||||
}
|
||||
}
|
||||
|
||||
int Document::getNumPages() const
|
||||
{
|
||||
return data->doc.getNumPages();
|
||||
}
|
||||
|
||||
QValueList<FontInfo> Document::fonts() const
|
||||
{
|
||||
QValueList<FontInfo> ourList;
|
||||
scanForFonts(getNumPages(), &ourList);
|
||||
return ourList;
|
||||
}
|
||||
|
||||
bool Document::scanForFonts( int numPages, QValueList<FontInfo> *fontList ) const
|
||||
{
|
||||
GooList *items = data->m_fontInfoScanner->scan( numPages );
|
||||
|
||||
if ( NULL == items )
|
||||
return false;
|
||||
|
||||
for ( int i = 0; i < items->getLength(); ++i ) {
|
||||
QString fontName;
|
||||
if (((::FontInfo*)items->get(i))->getName())
|
||||
fontName = ((::FontInfo*)items->get(i))->getName()->getCString();
|
||||
|
||||
FontInfo font(fontName,
|
||||
((::FontInfo*)items->get(i))->getEmbedded(),
|
||||
((::FontInfo*)items->get(i))->getSubset(),
|
||||
(Poppler::FontInfo::Type)((::FontInfo*)items->get(i))->getType());
|
||||
fontList->append(font);
|
||||
}
|
||||
deleteGooList(items, ::FontInfo);
|
||||
return true;
|
||||
}
|
||||
|
||||
/* borrowed from kpdf */
|
||||
QString Document::getInfo( const QString & type ) const
|
||||
{
|
||||
// [Albert] Code adapted from pdfinfo.cc on xpdf
|
||||
Object info;
|
||||
if ( data->locked )
|
||||
return NULL;
|
||||
|
||||
data->doc.getDocInfo( &info );
|
||||
if ( !info.isDict() )
|
||||
return NULL;
|
||||
|
||||
QString result;
|
||||
Object obj;
|
||||
GooString *s1;
|
||||
GBool isUnicode;
|
||||
Unicode u;
|
||||
int i;
|
||||
Dict *infoDict = info.getDict();
|
||||
|
||||
if ( infoDict->lookup( (char*)type.latin1(), &obj )->isString() )
|
||||
{
|
||||
s1 = obj.getString();
|
||||
if ( ( s1->getChar(0) & 0xff ) == 0xfe && ( s1->getChar(1) & 0xff ) == 0xff )
|
||||
{
|
||||
isUnicode = gTrue;
|
||||
i = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
isUnicode = gFalse;
|
||||
i = 0;
|
||||
}
|
||||
while ( i < obj.getString()->getLength() )
|
||||
{
|
||||
if ( isUnicode )
|
||||
{
|
||||
u = ( ( s1->getChar(i) & 0xff ) << 8 ) | ( s1->getChar(i+1) & 0xff );
|
||||
i += 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
u = s1->getChar(i) & 0xff;
|
||||
++i;
|
||||
}
|
||||
result += unicodeToQString( &u, 1 );
|
||||
}
|
||||
obj.free();
|
||||
info.free();
|
||||
return result;
|
||||
}
|
||||
obj.free();
|
||||
info.free();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* borrowed from kpdf */
|
||||
QDateTime Document::getDate( const QString & type ) const
|
||||
{
|
||||
// [Albert] Code adapted from pdfinfo.cc on xpdf
|
||||
if ( data->locked )
|
||||
return QDateTime();
|
||||
|
||||
Object info;
|
||||
data->doc.getDocInfo( &info );
|
||||
if ( !info.isDict() ) {
|
||||
info.free();
|
||||
return QDateTime();
|
||||
}
|
||||
|
||||
Object obj;
|
||||
int year, mon, day, hour, min, sec, tz_hour, tz_minute;
|
||||
char tz;
|
||||
Dict *infoDict = info.getDict();
|
||||
QString result;
|
||||
|
||||
if ( infoDict->lookup( (char*)type.latin1(), &obj )->isString() )
|
||||
{
|
||||
QString s = UnicodeParsedString(obj.getString());
|
||||
// TODO do something with the timezone information
|
||||
if ( parseDateString( s.latin1(), &year, &mon, &day, &hour, &min, &sec, &tz, &tz_hour, &tz_minute ) )
|
||||
{
|
||||
QDate d( year, mon, day ); //CHECK: it was mon-1, Jan->0 (??)
|
||||
QTime t( hour, min, sec );
|
||||
if ( d.isValid() && t.isValid() ) {
|
||||
obj.free();
|
||||
info.free();
|
||||
return QDateTime( d, t );
|
||||
}
|
||||
}
|
||||
}
|
||||
obj.free();
|
||||
info.free();
|
||||
return QDateTime();
|
||||
}
|
||||
|
||||
bool Document::isEncrypted() const
|
||||
{
|
||||
return data->doc.isEncrypted();
|
||||
}
|
||||
|
||||
bool Document::isLinearized() const
|
||||
{
|
||||
return data->doc.isLinearized();
|
||||
}
|
||||
|
||||
bool Document::okToPrint() const
|
||||
{
|
||||
return data->doc.okToPrint();
|
||||
}
|
||||
|
||||
bool Document::okToChange() const
|
||||
{
|
||||
return data->doc.okToChange();
|
||||
}
|
||||
|
||||
bool Document::okToCopy() const
|
||||
{
|
||||
return data->doc.okToCopy();
|
||||
}
|
||||
|
||||
bool Document::okToAddNotes() const
|
||||
{
|
||||
return data->doc.okToAddNotes();
|
||||
}
|
||||
|
||||
double Document::getPDFVersion() const
|
||||
{
|
||||
return data->doc.getPDFMajorVersion () + data->doc.getPDFMinorVersion() / 10.0;
|
||||
}
|
||||
|
||||
void Document::getPdfVersion(int *major, int *minor) const
|
||||
{
|
||||
if (major)
|
||||
*major = data->doc.getPDFMajorVersion();
|
||||
if (minor)
|
||||
*minor = data->doc.getPDFMinorVersion();
|
||||
}
|
||||
|
||||
QDomDocument *Document::toc() const
|
||||
{
|
||||
Outline * outline = data->doc.getOutline();
|
||||
if ( !outline )
|
||||
return NULL;
|
||||
|
||||
GooList * items = outline->getItems();
|
||||
if ( !items || items->getLength() < 1 )
|
||||
return NULL;
|
||||
|
||||
QDomDocument *toc = new QDomDocument();
|
||||
if ( items->getLength() > 0 )
|
||||
data->addTocChildren( toc, toc, items );
|
||||
|
||||
return toc;
|
||||
}
|
||||
|
||||
LinkDestination *Document::linkDestination( const QString &name )
|
||||
{
|
||||
GooString * namedDest = QStringToGooString( name );
|
||||
LinkDestinationData ldd(NULL, namedDest, data);
|
||||
LinkDestination *ld = new LinkDestination(ldd);
|
||||
delete namedDest;
|
||||
return ld;
|
||||
}
|
||||
|
||||
bool Document::print(const QString &fileName, QValueList<int> pageList, double hDPI, double vDPI, int rotate)
|
||||
{
|
||||
return print(fileName, pageList, hDPI, vDPI, rotate, -1, -1);
|
||||
}
|
||||
|
||||
bool Document::print(const QString &file, QValueList<int> pageList, double hDPI, double vDPI, int rotate, int paperWidth, int paperHeight)
|
||||
{
|
||||
PSOutputDev *psOut = new PSOutputDev(file.latin1(), data->doc.getXRef(), data->doc.getCatalog(), NULL, 1, data->doc.getNumPages(), psModePS, paperWidth, paperHeight);
|
||||
|
||||
if (psOut->isOk()) {
|
||||
QValueList<int>::iterator it;
|
||||
for (it = pageList.begin(); it != pageList.end(); ++it )
|
||||
data->doc.displayPage(psOut, *it, hDPI, vDPI, rotate, gFalse, gTrue, gTrue);
|
||||
|
||||
delete psOut;
|
||||
return true;
|
||||
} else {
|
||||
delete psOut;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,83 @@
|
||||
/* poppler-qt.h: qt interface to poppler
|
||||
* Copyright (C) 2005, Albert Astals Cid <aacid@kde.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#include "poppler-qt.h"
|
||||
|
||||
namespace Poppler {
|
||||
|
||||
class FontInfoData
|
||||
{
|
||||
public:
|
||||
QString fontName;
|
||||
bool isEmbedded;
|
||||
bool isSubset;
|
||||
FontInfo::Type type;
|
||||
};
|
||||
|
||||
FontInfo::FontInfo( const QString &fontName, const bool isEmbedded, const bool isSubset, Type type )
|
||||
{
|
||||
data = new FontInfoData();
|
||||
data->fontName = fontName;
|
||||
data->isEmbedded = isEmbedded;
|
||||
data->isSubset = isSubset;
|
||||
data->type = type;
|
||||
}
|
||||
|
||||
FontInfo::FontInfo( const FontInfo &fi )
|
||||
{
|
||||
data = new FontInfoData();
|
||||
data->fontName = fi.data->fontName;
|
||||
data->isEmbedded = fi.data->isEmbedded;
|
||||
data->isSubset = fi.data->isSubset;
|
||||
data->type = fi.data->type;
|
||||
}
|
||||
|
||||
FontInfo::FontInfo()
|
||||
{
|
||||
data = new FontInfoData();
|
||||
data->isEmbedded = false;
|
||||
data->isSubset = false;
|
||||
data->type = unknown;
|
||||
}
|
||||
|
||||
FontInfo::~FontInfo()
|
||||
{
|
||||
delete data;
|
||||
}
|
||||
|
||||
const QString &FontInfo::name() const
|
||||
{
|
||||
return data->fontName;
|
||||
}
|
||||
|
||||
bool FontInfo::isEmbedded() const
|
||||
{
|
||||
return data->isEmbedded;
|
||||
}
|
||||
|
||||
bool FontInfo::isSubset() const
|
||||
{
|
||||
return data->isSubset;
|
||||
}
|
||||
|
||||
FontInfo::Type FontInfo::type() const
|
||||
{
|
||||
return data->type;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,188 @@
|
||||
/* poppler-link.h: qt interface to poppler
|
||||
* Copyright (C) 2006, Albert Astals Cid <aacid@kde.org>
|
||||
* Adapting code from
|
||||
* Copyright (C) 2004 by Enrico Ros <eros.kde@email.it>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#ifndef _POPPLER_LINK_H_
|
||||
#define _POPPLER_LINK_H_
|
||||
|
||||
#include <qstring.h>
|
||||
#include <qrect.h>
|
||||
|
||||
namespace Poppler {
|
||||
|
||||
class LinkDestinationData;
|
||||
|
||||
class LinkDestination
|
||||
{
|
||||
public:
|
||||
enum Kind
|
||||
{
|
||||
destXYZ = 1,
|
||||
destFit = 2,
|
||||
destFitH = 3,
|
||||
destFitV = 4,
|
||||
destFitR = 5,
|
||||
destFitB = 6,
|
||||
destFitBH = 7,
|
||||
destFitBV = 8
|
||||
};
|
||||
|
||||
LinkDestination(const LinkDestinationData &data);
|
||||
LinkDestination(const QString &description);
|
||||
|
||||
// Accessors.
|
||||
Kind kind() const;
|
||||
int pageNumber() const;
|
||||
double left() const;
|
||||
double bottom() const;
|
||||
double right() const;
|
||||
double top() const;
|
||||
double zoom() const;
|
||||
bool isChangeLeft() const;
|
||||
bool isChangeTop() const;
|
||||
bool isChangeZoom() const;
|
||||
|
||||
QString toString() const;
|
||||
|
||||
private:
|
||||
Kind m_kind; // destination type
|
||||
int m_pageNum; // page number
|
||||
double m_left, m_bottom; // position
|
||||
double m_right, m_top;
|
||||
double m_zoom; // zoom factor
|
||||
bool m_changeLeft, m_changeTop; // for destXYZ links, which position
|
||||
bool m_changeZoom; // components to change
|
||||
};
|
||||
|
||||
/**
|
||||
* @short Encapsulates data that describes a link.
|
||||
*
|
||||
* This is the base class for links. It makes mandatory for inherited
|
||||
* widgets to reimplement the 'linkType' method and return the type of
|
||||
* the link described by the reimplemented class.
|
||||
*/
|
||||
class Link
|
||||
{
|
||||
public:
|
||||
Link( const QRect &linkArea );
|
||||
|
||||
// get link type (inherited classes mustreturn an unique identifier)
|
||||
enum LinkType { None, Goto, Execute, Browse, Action, Movie };
|
||||
virtual LinkType linkType() const;
|
||||
|
||||
// virtual destructor
|
||||
virtual ~Link();
|
||||
|
||||
QRect linkArea() const;
|
||||
|
||||
private:
|
||||
QRect m_linkArea;
|
||||
};
|
||||
|
||||
|
||||
/** Goto: a viewport and maybe a reference to an external filename **/
|
||||
class LinkGoto : public Link
|
||||
{
|
||||
public:
|
||||
LinkGoto( const QRect &linkArea, QString extFileName, const LinkDestination & destination );
|
||||
|
||||
// query for goto parameters
|
||||
bool isExternal() const;
|
||||
const QString & fileName() const;
|
||||
const LinkDestination & destination() const;
|
||||
LinkType linkType() const;
|
||||
|
||||
private:
|
||||
QString m_extFileName;
|
||||
LinkDestination m_destination;
|
||||
};
|
||||
|
||||
/** Execute: filename and parameters to execute **/
|
||||
class LinkExecute : public Link
|
||||
{
|
||||
public:
|
||||
// query for filename / parameters
|
||||
const QString & fileName() const;
|
||||
const QString & parameters() const;
|
||||
|
||||
// create a Link_Execute
|
||||
LinkExecute( const QRect &linkArea, const QString & file, const QString & params );
|
||||
LinkType linkType() const;
|
||||
|
||||
private:
|
||||
QString m_fileName;
|
||||
QString m_parameters;
|
||||
};
|
||||
|
||||
/** Browse: an URL to open, ranging from 'http://' to 'mailto:' etc.. **/
|
||||
class LinkBrowse : public Link
|
||||
{
|
||||
public:
|
||||
// query for URL
|
||||
const QString & url() const;
|
||||
|
||||
// create a Link_Browse
|
||||
LinkBrowse( const QRect &linkArea, const QString &url );
|
||||
LinkType linkType() const;
|
||||
|
||||
private:
|
||||
QString m_url;
|
||||
};
|
||||
|
||||
/** Action: contains an action to perform on document / viewer **/
|
||||
class LinkAction : public Link
|
||||
{
|
||||
public:
|
||||
// define types of actions
|
||||
enum ActionType { PageFirst = 1,
|
||||
PagePrev = 2,
|
||||
PageNext = 3,
|
||||
PageLast = 4,
|
||||
HistoryBack = 5,
|
||||
HistoryForward = 6,
|
||||
Quit = 7,
|
||||
Presentation = 8,
|
||||
EndPresentation = 9,
|
||||
Find = 10,
|
||||
GoToPage = 11,
|
||||
Close = 12 };
|
||||
|
||||
// query for action type
|
||||
ActionType actionType() const;
|
||||
|
||||
// create a Link_Action
|
||||
LinkAction( const QRect &linkArea, ActionType actionType );
|
||||
LinkType linkType() const;
|
||||
|
||||
private:
|
||||
ActionType m_type;
|
||||
};
|
||||
|
||||
/** Movie: Not yet defined -> think renaming to 'Media' link **/
|
||||
class LinkMovie : public Link
|
||||
// TODO this (Movie link)
|
||||
{
|
||||
public:
|
||||
LinkMovie( const QRect &linkArea );
|
||||
LinkType linkType() const;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
@ -0,0 +1,267 @@
|
||||
/* poppler-link.cc: qt interface to poppler
|
||||
* Copyright (C) 2006, 2008 Albert Astals Cid
|
||||
* Adapting code from
|
||||
* Copyright (C) 2004 by Enrico Ros <eros.kde@email.it>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#include <poppler-qt.h>
|
||||
#include <poppler-private.h>
|
||||
|
||||
#include <qstringlist.h>
|
||||
|
||||
#include <Link.h>
|
||||
|
||||
namespace Poppler {
|
||||
|
||||
LinkDestination::LinkDestination(const LinkDestinationData &data)
|
||||
{
|
||||
bool deleteDest = false;
|
||||
LinkDest *ld = data.ld;
|
||||
|
||||
if ( data.namedDest && !ld )
|
||||
{
|
||||
deleteDest = true;
|
||||
ld = data.doc->doc.findDest( data.namedDest );
|
||||
}
|
||||
|
||||
if (!ld) return;
|
||||
|
||||
if (ld->getKind() == ::destXYZ) m_kind = destXYZ;
|
||||
else if (ld->getKind() == ::destFit) m_kind = destFit;
|
||||
else if (ld->getKind() == ::destFitH) m_kind = destFitH;
|
||||
else if (ld->getKind() == ::destFitV) m_kind = destFitV;
|
||||
else if (ld->getKind() == ::destFitR) m_kind = destFitR;
|
||||
else if (ld->getKind() == ::destFitB) m_kind = destFitB;
|
||||
else if (ld->getKind() == ::destFitBH) m_kind = destFitBH;
|
||||
else if (ld->getKind() == ::destFitBV) m_kind = destFitBV;
|
||||
|
||||
if ( !ld->isPageRef() ) m_pageNum = ld->getPageNum();
|
||||
else
|
||||
{
|
||||
Ref ref = ld->getPageRef();
|
||||
m_pageNum = data.doc->doc.findPage( ref.num, ref.gen );
|
||||
}
|
||||
double left = ld->getLeft();
|
||||
double bottom = ld->getBottom();
|
||||
double right = ld->getRight();
|
||||
double top = ld->getTop();
|
||||
m_zoom = ld->getZoom();
|
||||
m_changeLeft = ld->getChangeLeft();
|
||||
m_changeTop = ld->getChangeTop();
|
||||
m_changeZoom = ld->getChangeZoom();
|
||||
|
||||
int leftAux = 0, topAux = 0, rightAux = 0, bottomAux = 0;
|
||||
|
||||
#if defined(HAVE_SPLASH)
|
||||
SplashOutputDev *sod = data.doc->getOutputDev();
|
||||
sod->cvtUserToDev( left, top, &leftAux, &topAux );
|
||||
sod->cvtUserToDev( right, bottom, &rightAux, &bottomAux );
|
||||
#endif
|
||||
|
||||
m_left = leftAux;
|
||||
m_top = topAux;
|
||||
m_right = rightAux;
|
||||
m_bottom = bottomAux;
|
||||
|
||||
if (deleteDest) delete ld;
|
||||
}
|
||||
|
||||
LinkDestination::LinkDestination(const QString &description)
|
||||
{
|
||||
QStringList tokens = QStringList::split(';', description);
|
||||
m_kind = static_cast<Kind>(tokens[0].toInt());
|
||||
m_pageNum = tokens[1].toInt();
|
||||
m_left = tokens[2].toDouble();
|
||||
m_bottom = tokens[3].toDouble();
|
||||
m_right = tokens[4].toDouble();
|
||||
m_top = tokens[5].toDouble();
|
||||
m_zoom = tokens[6].toDouble();
|
||||
m_changeLeft = static_cast<bool>(tokens[7].toInt());
|
||||
m_changeTop = static_cast<bool>(tokens[8].toInt());
|
||||
m_changeZoom = static_cast<bool>(tokens[9].toInt());
|
||||
}
|
||||
|
||||
LinkDestination::Kind LinkDestination::kind() const
|
||||
{
|
||||
return m_kind;
|
||||
}
|
||||
|
||||
int LinkDestination::pageNumber() const
|
||||
{
|
||||
return m_pageNum;
|
||||
}
|
||||
|
||||
double LinkDestination::left() const
|
||||
{
|
||||
return m_left;
|
||||
}
|
||||
|
||||
double LinkDestination::bottom() const
|
||||
{
|
||||
return m_bottom;
|
||||
}
|
||||
|
||||
double LinkDestination::right() const
|
||||
{
|
||||
return m_right;
|
||||
}
|
||||
|
||||
double LinkDestination::top() const
|
||||
{
|
||||
return m_top;
|
||||
}
|
||||
|
||||
double LinkDestination::zoom() const
|
||||
{
|
||||
return m_zoom;
|
||||
}
|
||||
|
||||
bool LinkDestination::isChangeLeft() const
|
||||
{
|
||||
return m_changeLeft;
|
||||
}
|
||||
|
||||
bool LinkDestination::isChangeTop() const
|
||||
{
|
||||
return m_changeTop;
|
||||
}
|
||||
|
||||
bool LinkDestination::isChangeZoom() const
|
||||
{
|
||||
return m_changeZoom;
|
||||
}
|
||||
|
||||
QString LinkDestination::toString() const
|
||||
{
|
||||
QString s = QString::number( (Q_INT8)m_kind );
|
||||
s += ";" + QString::number( m_pageNum );
|
||||
s += ";" + QString::number( m_left );
|
||||
s += ";" + QString::number( m_bottom );
|
||||
s += ";" + QString::number( m_right );
|
||||
s += ";" + QString::number( m_top );
|
||||
s += ";" + QString::number( m_zoom );
|
||||
s += ";" + QString::number( (Q_INT8)m_changeLeft );
|
||||
s += ";" + QString::number( (Q_INT8)m_changeTop );
|
||||
s += ";" + QString::number( (Q_INT8)m_changeZoom );
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
// Link
|
||||
Link::~Link()
|
||||
{
|
||||
}
|
||||
|
||||
Link::Link(const QRect &linkArea) : m_linkArea(linkArea)
|
||||
{
|
||||
}
|
||||
|
||||
Link::LinkType Link::linkType() const
|
||||
{
|
||||
return None;
|
||||
}
|
||||
|
||||
QRect Link::linkArea() const
|
||||
{
|
||||
return m_linkArea;
|
||||
}
|
||||
|
||||
// LinkGoto
|
||||
LinkGoto::LinkGoto( const QRect &linkArea, QString extFileName, const LinkDestination & destination ) : Link(linkArea), m_extFileName(extFileName), m_destination(destination)
|
||||
{
|
||||
}
|
||||
|
||||
bool LinkGoto::isExternal() const
|
||||
{
|
||||
return !m_extFileName.isEmpty();
|
||||
}
|
||||
|
||||
const QString &LinkGoto::fileName() const
|
||||
{
|
||||
return m_extFileName;
|
||||
}
|
||||
|
||||
const LinkDestination &LinkGoto::destination() const
|
||||
{
|
||||
return m_destination;
|
||||
}
|
||||
|
||||
Link::LinkType LinkGoto::linkType() const
|
||||
{
|
||||
return Goto;
|
||||
}
|
||||
|
||||
// LinkExecute
|
||||
LinkExecute::LinkExecute( const QRect &linkArea, const QString & file, const QString & params ) : Link(linkArea), m_fileName(file), m_parameters(params)
|
||||
{
|
||||
}
|
||||
|
||||
const QString & LinkExecute::fileName() const
|
||||
{
|
||||
return m_fileName;
|
||||
}
|
||||
const QString & LinkExecute::parameters() const
|
||||
{
|
||||
return m_parameters;
|
||||
}
|
||||
|
||||
Link::LinkType LinkExecute::linkType() const
|
||||
{
|
||||
return Execute;
|
||||
}
|
||||
|
||||
// LinkBrowse
|
||||
LinkBrowse::LinkBrowse( const QRect &linkArea, const QString &url ) : Link(linkArea), m_url(url)
|
||||
{
|
||||
}
|
||||
|
||||
const QString & LinkBrowse::url() const
|
||||
{
|
||||
return m_url;
|
||||
}
|
||||
|
||||
Link::LinkType LinkBrowse::linkType() const
|
||||
{
|
||||
return Browse;
|
||||
}
|
||||
|
||||
// LinkAction
|
||||
LinkAction::LinkAction( const QRect &linkArea, ActionType actionType ) : Link(linkArea), m_type(actionType)
|
||||
{
|
||||
}
|
||||
|
||||
LinkAction::ActionType LinkAction::actionType() const
|
||||
{
|
||||
return m_type;
|
||||
}
|
||||
|
||||
Link::LinkType LinkAction::linkType() const
|
||||
{
|
||||
return Action;
|
||||
}
|
||||
|
||||
// LinkMovie
|
||||
LinkMovie::LinkMovie( const QRect &linkArea ) : Link(linkArea)
|
||||
{
|
||||
}
|
||||
|
||||
Link::LinkType LinkMovie::linkType() const
|
||||
{
|
||||
return Movie;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,33 @@
|
||||
/*
|
||||
* Copyright (C) 2005, Albert Astals Cid
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#ifndef POPPLER_PAGE_TRANSITION_PRIVATE_H
|
||||
#define POPPLER_PAGE_TRANSITION_PRIVATE_H
|
||||
|
||||
class Object;
|
||||
|
||||
namespace Poppler {
|
||||
|
||||
class PageTransitionParams {
|
||||
public:
|
||||
Object *dictObj;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // POPPLER_PAGE_TRANSITION_PRIVATE_H
|
@ -0,0 +1,95 @@
|
||||
/* PageTransition.cc
|
||||
* Copyright (C) 2005, Net Integration Technologies, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#include "PageTransition.h"
|
||||
#include "poppler-page-transition.h"
|
||||
#include "poppler-page-transition-private.h"
|
||||
|
||||
namespace Poppler {
|
||||
|
||||
class PageTransitionData
|
||||
{
|
||||
public:
|
||||
PageTransitionData(Object *trans)
|
||||
{
|
||||
pt = new ::PageTransition(trans);
|
||||
}
|
||||
|
||||
PageTransitionData(const PageTransitionData &ptd)
|
||||
{
|
||||
pt = new ::PageTransition(*ptd.pt);
|
||||
}
|
||||
|
||||
~PageTransitionData()
|
||||
{
|
||||
delete pt;
|
||||
}
|
||||
|
||||
::PageTransition *pt;
|
||||
};
|
||||
|
||||
PageTransition::PageTransition(const PageTransitionParams ¶ms)
|
||||
{
|
||||
data = new PageTransitionData(params.dictObj);
|
||||
}
|
||||
|
||||
PageTransition::PageTransition(const PageTransition &pt)
|
||||
{
|
||||
data = new PageTransitionData(*pt.data);
|
||||
}
|
||||
|
||||
PageTransition::~PageTransition()
|
||||
{
|
||||
delete data;
|
||||
}
|
||||
|
||||
PageTransition::Type PageTransition::type() const
|
||||
{
|
||||
return (Poppler::PageTransition::Type)data->pt->getType();
|
||||
}
|
||||
|
||||
int PageTransition::duration() const
|
||||
{
|
||||
return data->pt->getDuration();
|
||||
}
|
||||
|
||||
PageTransition::Alignment PageTransition::alignment() const
|
||||
{
|
||||
return (Poppler::PageTransition::Alignment)data->pt->getAlignment();
|
||||
}
|
||||
|
||||
PageTransition::Direction PageTransition::direction() const
|
||||
{
|
||||
return (Poppler::PageTransition::Direction)data->pt->getDirection();
|
||||
}
|
||||
|
||||
int PageTransition::angle() const
|
||||
{
|
||||
return data->pt->getAngle();
|
||||
}
|
||||
|
||||
double PageTransition::scale() const
|
||||
{
|
||||
return data->pt->getScale();
|
||||
}
|
||||
bool PageTransition::isRectangular() const
|
||||
{
|
||||
return data->pt->isRectangular();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,146 @@
|
||||
/* PageTransition.h
|
||||
* Copyright (C) 2005, Net Integration Technologies, Inc.
|
||||
* Copyright (C) 2005, Brad Hards <bradh@frogmouth.net>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#ifndef __PAGETRANSITION_X_H__
|
||||
#define __PAGETRANSITION_X_H__
|
||||
|
||||
namespace Poppler {
|
||||
|
||||
class PageTransitionParams;
|
||||
class PageTransitionData;
|
||||
|
||||
/**
|
||||
\brief Describes how a PDF file viewer shall perform the transition
|
||||
from one page to another
|
||||
|
||||
In PDF files there is a way to specify if the viewer shall use
|
||||
certain effects to perform the transition from one page to
|
||||
another. This feature can be used, e.g., in a PDF-based beamer
|
||||
presentation.
|
||||
|
||||
This utility class represents the transition effect, and can be
|
||||
used to extract the information from a PDF object.
|
||||
*/
|
||||
|
||||
|
||||
class PageTransition {
|
||||
public:
|
||||
|
||||
/** \brief transition effect that shall be used
|
||||
*/
|
||||
// if changed remember to keep in sync with PageTransition.h enum
|
||||
enum Type {
|
||||
Replace = 0,
|
||||
Split,
|
||||
Blinds,
|
||||
Box,
|
||||
Wipe,
|
||||
Dissolve,
|
||||
Glitter,
|
||||
Fly,
|
||||
Push,
|
||||
Cover,
|
||||
Uncover,
|
||||
Fade
|
||||
};
|
||||
|
||||
/** \brief alignment of the transition effect that shall be used
|
||||
*/
|
||||
// if changed remember to keep in sync with PageTransition.h enum
|
||||
enum Alignment {
|
||||
Horizontal = 0,
|
||||
Vertical
|
||||
};
|
||||
|
||||
/** \brief direction of the transition effect that shall be used
|
||||
*/
|
||||
// if changed remember to keep in sync with PageTransition.h enum
|
||||
enum Direction {
|
||||
Inward = 0,
|
||||
Outward
|
||||
};
|
||||
|
||||
/** \brief Construct a new PageTransition object from a page dictionary.
|
||||
|
||||
Users of the library will rarely need to construct a
|
||||
PageTransition object themselves. Instead, the method
|
||||
Poppler::Page::transition() can be used to find out if a certain
|
||||
transition effect is specified.
|
||||
|
||||
@warning In case or error, this method will print an error message to stderr,
|
||||
and construct a default object.
|
||||
|
||||
@param params an object whose dictionary will be read and
|
||||
parsed. This must be a valid object, whose dictionaries are
|
||||
accessed by the constructor. The object is only accessed by this
|
||||
constructor, and may be deleted after the constructor returns.
|
||||
*/
|
||||
PageTransition(const PageTransitionParams ¶ms);
|
||||
|
||||
/** \brief copy constructor */
|
||||
PageTransition(const PageTransition &pt);
|
||||
|
||||
/**
|
||||
Destructor
|
||||
*/
|
||||
~PageTransition();
|
||||
|
||||
/**
|
||||
\brief Get type of the transition.
|
||||
*/
|
||||
Type type() const;
|
||||
|
||||
/**
|
||||
\brief Get duration of the transition in seconds.
|
||||
*/
|
||||
int duration() const;
|
||||
|
||||
/**
|
||||
\brief Get dimension in which the transition effect occurs.
|
||||
*/
|
||||
Alignment alignment() const;
|
||||
|
||||
/**
|
||||
\brief Get direction of motion of the transition effect.
|
||||
*/
|
||||
Direction direction() const;
|
||||
|
||||
/**
|
||||
\brief Get direction in which the transition effect moves.
|
||||
*/
|
||||
int angle() const;
|
||||
|
||||
/**
|
||||
\brief Get starting or ending scale.
|
||||
*/
|
||||
double scale() const;
|
||||
|
||||
/**
|
||||
\brief Returns true if the area to be flown is rectangular and
|
||||
opaque.
|
||||
*/
|
||||
bool isRectangular() const;
|
||||
|
||||
private:
|
||||
PageTransitionData *data;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
@ -0,0 +1,362 @@
|
||||
/* poppler-page.cc: qt interface to poppler
|
||||
* Copyright (C) 2005, Net Integration Technologies, Inc.
|
||||
* Copyright (C) 2005-2006, Albert Astals Cid <aacid@kde.org>
|
||||
* Copyright (C) 2005, Tobias Koening <tokoe@kde.org>
|
||||
* Copyright (C) 2005, Stefan Kebekus <stefan.kebekus@math.uni-koeln.de>
|
||||
* Copyright (C) 2006, Wilfried Huss <Wilfried.Huss@gmx.at>
|
||||
* Copyright (C) 2006, Jerry Epplin <jepplin@globalvelocity.com>
|
||||
* Copyright (C) 2007, 2010, Pino Toscano <pino@kde.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#include <poppler-qt.h>
|
||||
#include <qfile.h>
|
||||
#include <qimage.h>
|
||||
#include <config.h>
|
||||
#include <GlobalParams.h>
|
||||
#include <PDFDoc.h>
|
||||
#include <Catalog.h>
|
||||
#include <ErrorCodes.h>
|
||||
#include <TextOutputDev.h>
|
||||
#include <Link.h>
|
||||
#if defined(HAVE_SPLASH)
|
||||
#include <SplashOutputDev.h>
|
||||
#include <splash/SplashBitmap.h>
|
||||
#endif
|
||||
|
||||
#include "poppler-private.h"
|
||||
#include "poppler-page-transition-private.h"
|
||||
|
||||
namespace Poppler {
|
||||
|
||||
class PageData {
|
||||
public:
|
||||
const Document *doc;
|
||||
int index;
|
||||
PageTransition *transition;
|
||||
};
|
||||
|
||||
Page::Page(const Document *doc, int index) {
|
||||
data = new PageData();
|
||||
data->index = index;
|
||||
data->doc = doc;
|
||||
data->transition = 0;
|
||||
}
|
||||
|
||||
Page::~Page()
|
||||
{
|
||||
delete data->transition;
|
||||
delete data;
|
||||
}
|
||||
|
||||
void Page::renderToPixmap(QPixmap **q, int x, int y, int w, int h, bool doLinks) const
|
||||
{
|
||||
renderToPixmap(q, x, y, w, h, 72.0, 72.0, doLinks);
|
||||
}
|
||||
|
||||
void Page::renderToPixmap(QPixmap **q, int x, int y, int w, int h, double xres, double yres, bool doLinks) const
|
||||
{
|
||||
QImage img = renderToImage(xres, yres, doLinks);
|
||||
*q = new QPixmap( img );
|
||||
}
|
||||
|
||||
QImage Page::renderToImage(double xres, double yres, bool doLinks) const
|
||||
{
|
||||
#if defined(HAVE_SPLASH)
|
||||
SplashOutputDev *output_dev;
|
||||
SplashBitmap *bitmap;
|
||||
SplashColorPtr color_ptr;
|
||||
output_dev = data->doc->data->getOutputDev();
|
||||
|
||||
data->doc->data->doc.displayPageSlice(output_dev, data->index + 1, xres, yres,
|
||||
0, false, true, false, -1, -1, -1, -1);
|
||||
bitmap = output_dev->getBitmap ();
|
||||
color_ptr = bitmap->getDataPtr ();
|
||||
int bw = output_dev->getBitmap()->getWidth();
|
||||
int bh = output_dev->getBitmap()->getHeight();
|
||||
SplashColorPtr dataPtr = output_dev->getBitmap()->getDataPtr();
|
||||
|
||||
if (QImage::BigEndian == QImage::systemByteOrder())
|
||||
{
|
||||
uchar c;
|
||||
int count = bw * bh * 4;
|
||||
for (int k = 0; k < count; k += 4)
|
||||
{
|
||||
c = dataPtr[k];
|
||||
dataPtr[k] = dataPtr[k+3];
|
||||
dataPtr[k+3] = c;
|
||||
|
||||
c = dataPtr[k+1];
|
||||
dataPtr[k+1] = dataPtr[k+2];
|
||||
dataPtr[k+2] = c;
|
||||
}
|
||||
}
|
||||
|
||||
// construct a qimage SHARING the raw bitmap data in memory
|
||||
QImage img( dataPtr, bw, bh, 32, 0, 0, QImage::IgnoreEndian );
|
||||
img = img.copy();
|
||||
// unload underlying xpdf bitmap
|
||||
output_dev->startPage( 0, NULL );
|
||||
|
||||
return img;
|
||||
#else
|
||||
(void)xres;
|
||||
(void)xres;
|
||||
(void)doLinks;
|
||||
|
||||
return QImage();
|
||||
#endif
|
||||
}
|
||||
|
||||
QString Page::getText(const Rectangle &r) const
|
||||
{
|
||||
TextOutputDev *output_dev;
|
||||
GooString *s;
|
||||
PDFRectangle *rect;
|
||||
QString result;
|
||||
::Page *p;
|
||||
|
||||
output_dev = new TextOutputDev(0, gFalse, gFalse, gFalse);
|
||||
data->doc->data->doc.displayPageSlice(output_dev, data->index + 1, 72, 72,
|
||||
0, false, false, false, -1, -1, -1, -1);
|
||||
p = data->doc->data->doc.getCatalog()->getPage(data->index + 1);
|
||||
if (r.isNull())
|
||||
{
|
||||
rect = p->getCropBox();
|
||||
s = output_dev->getText(rect->x1, rect->y1, rect->x2, rect->y2);
|
||||
}
|
||||
else
|
||||
{
|
||||
double height, y1, y2;
|
||||
height = p->getCropHeight();
|
||||
y1 = height - r.m_y2;
|
||||
y2 = height - r.m_y1;
|
||||
s = output_dev->getText(r.m_x1, y1, r.m_x2, y2);
|
||||
}
|
||||
|
||||
result = QString::fromUtf8(s->getCString());
|
||||
|
||||
delete output_dev;
|
||||
delete s;
|
||||
return result;
|
||||
}
|
||||
|
||||
QValueList<TextBox*> Page::textList() const
|
||||
{
|
||||
TextOutputDev *output_dev;
|
||||
|
||||
QValueList<TextBox*> output_list;
|
||||
|
||||
output_dev = new TextOutputDev(0, gFalse, gFalse, gFalse);
|
||||
|
||||
data->doc->data->doc.displayPageSlice(output_dev, data->index + 1, 72, 72,
|
||||
0, false, false, false, -1, -1, -1, -1);
|
||||
|
||||
TextWordList *word_list = output_dev->makeWordList();
|
||||
|
||||
if (!word_list) {
|
||||
delete output_dev;
|
||||
return output_list;
|
||||
}
|
||||
|
||||
for (int i = 0; i < word_list->getLength(); i++) {
|
||||
TextWord *word = word_list->get(i);
|
||||
GooString *word_str = word->getText();
|
||||
QString string = QString::fromUtf8(word_str->getCString());
|
||||
delete word_str;
|
||||
double xMin, yMin, xMax, yMax;
|
||||
word->getBBox(&xMin, &yMin, &xMax, &yMax);
|
||||
|
||||
TextBox* text_box = new TextBox(string, Rectangle(xMin, yMin, xMax, yMax));
|
||||
|
||||
output_list.append(text_box);
|
||||
}
|
||||
|
||||
delete word_list;
|
||||
delete output_dev;
|
||||
|
||||
return output_list;
|
||||
}
|
||||
|
||||
PageTransition *Page::getTransition() const
|
||||
{
|
||||
if (!data->transition)
|
||||
{
|
||||
Object o;
|
||||
PageTransitionParams params;
|
||||
params.dictObj = data->doc->data->doc.getCatalog()->getPage(data->index + 1)->getTrans(&o);
|
||||
data->transition = new PageTransition(params);
|
||||
o.free();
|
||||
}
|
||||
return data->transition;
|
||||
}
|
||||
|
||||
QSize Page::pageSize() const
|
||||
{
|
||||
::Page *p;
|
||||
|
||||
p = data->doc->data->doc.getCatalog()->getPage(data->index + 1);
|
||||
if ( ( Page::Landscape == orientation() ) || (Page::Seascape == orientation() ) ) {
|
||||
return QSize( (int)p->getCropHeight(), (int)p->getCropWidth() );
|
||||
} else {
|
||||
return QSize( (int)p->getCropWidth(), (int)p->getCropHeight() );
|
||||
}
|
||||
}
|
||||
|
||||
Page::Orientation Page::orientation() const
|
||||
{
|
||||
::Page *p = data->doc->data->doc.getCatalog()->getPage(data->index + 1);
|
||||
|
||||
int rotation = p->getRotate();
|
||||
switch (rotation) {
|
||||
case 90:
|
||||
return Page::Landscape;
|
||||
break;
|
||||
case 180:
|
||||
return Page::UpsideDown;
|
||||
break;
|
||||
case 270:
|
||||
return Page::Seascape;
|
||||
break;
|
||||
default:
|
||||
return Page::Portrait;
|
||||
}
|
||||
}
|
||||
|
||||
QValueList<Link*> Page::links() const
|
||||
{
|
||||
QValueList<Link*> popplerLinks;
|
||||
|
||||
#if defined(HAVE_SPLASH)
|
||||
Links *xpdfLinks = data->doc->data->doc.getLinks(data->index + 1);
|
||||
for (int i = 0; i < xpdfLinks->getNumLinks(); ++i)
|
||||
{
|
||||
::Link *xpdfLink = xpdfLinks->getLink(i);
|
||||
|
||||
double left, top, right, bottom;
|
||||
int leftAux, topAux, rightAux, bottomAux;
|
||||
xpdfLink->getRect( &left, &top, &right, &bottom );
|
||||
QRect linkArea;
|
||||
|
||||
data->doc->data->m_outputDev->cvtUserToDev( left, top, &leftAux, &topAux );
|
||||
data->doc->data->m_outputDev->cvtUserToDev( right, bottom, &rightAux, &bottomAux );
|
||||
linkArea.setLeft(leftAux);
|
||||
linkArea.setTop(topAux);
|
||||
linkArea.setRight(rightAux);
|
||||
linkArea.setBottom(bottomAux);
|
||||
|
||||
if (!xpdfLink->isOk()) continue;
|
||||
|
||||
Link *popplerLink = NULL;
|
||||
::LinkAction *a = xpdfLink->getAction();
|
||||
if ( a )
|
||||
{
|
||||
switch ( a->getKind() )
|
||||
{
|
||||
case actionGoTo:
|
||||
{
|
||||
LinkGoTo * g = (LinkGoTo *) a;
|
||||
// create link: no ext file, namedDest, object pointer
|
||||
popplerLink = new LinkGoto( linkArea, QString::null, LinkDestination( LinkDestinationData(g->getDest(), g->getNamedDest(), data->doc->data ) ) );
|
||||
}
|
||||
break;
|
||||
|
||||
case actionGoToR:
|
||||
{
|
||||
LinkGoToR * g = (LinkGoToR *) a;
|
||||
// copy link file
|
||||
const QString fileName = UnicodeParsedString( g->getFileName() );
|
||||
// ceate link: fileName, namedDest, object pointer
|
||||
popplerLink = new LinkGoto( linkArea, fileName, LinkDestination( LinkDestinationData(g->getDest(), g->getNamedDest(), data->doc->data ) ) );
|
||||
}
|
||||
break;
|
||||
|
||||
case actionLaunch:
|
||||
{
|
||||
LinkLaunch * e = (LinkLaunch *)a;
|
||||
GooString * p = e->getParams();
|
||||
popplerLink = new LinkExecute( linkArea, e->getFileName()->getCString(), p ? p->getCString() : 0 );
|
||||
}
|
||||
break;
|
||||
|
||||
case actionNamed:
|
||||
{
|
||||
const char * name = ((LinkNamed *)a)->getName()->getCString();
|
||||
if ( !strcmp( name, "NextPage" ) )
|
||||
popplerLink = new LinkAction( linkArea, LinkAction::PageNext );
|
||||
else if ( !strcmp( name, "PrevPage" ) )
|
||||
popplerLink = new LinkAction( linkArea, LinkAction::PagePrev );
|
||||
else if ( !strcmp( name, "FirstPage" ) )
|
||||
popplerLink = new LinkAction( linkArea, LinkAction::PageFirst );
|
||||
else if ( !strcmp( name, "LastPage" ) )
|
||||
popplerLink = new LinkAction( linkArea, LinkAction::PageLast );
|
||||
else if ( !strcmp( name, "GoBack" ) )
|
||||
popplerLink = new LinkAction( linkArea, LinkAction::HistoryBack );
|
||||
else if ( !strcmp( name, "GoForward" ) )
|
||||
popplerLink = new LinkAction( linkArea, LinkAction::HistoryForward );
|
||||
else if ( !strcmp( name, "Quit" ) )
|
||||
popplerLink = new LinkAction( linkArea, LinkAction::Quit );
|
||||
else if ( !strcmp( name, "GoToPage" ) )
|
||||
popplerLink = new LinkAction( linkArea, LinkAction::GoToPage );
|
||||
else if ( !strcmp( name, "Find" ) )
|
||||
popplerLink = new LinkAction( linkArea, LinkAction::Find );
|
||||
else if ( !strcmp( name, "FullScreen" ) )
|
||||
popplerLink = new LinkAction( linkArea, LinkAction::Presentation );
|
||||
else if ( !strcmp( name, "Close" ) )
|
||||
{
|
||||
// acroread closes the document always, doesnt care whether
|
||||
// its presentation mode or not
|
||||
// popplerLink = new LinkAction( linkArea, LinkAction::EndPresentation );
|
||||
popplerLink = new LinkAction( linkArea, LinkAction::Close );
|
||||
}
|
||||
else
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case actionURI:
|
||||
{
|
||||
popplerLink = new LinkBrowse( linkArea, ((LinkURI *)a)->getURI()->getCString() );
|
||||
}
|
||||
break;
|
||||
|
||||
case actionMovie:
|
||||
case actionSound:
|
||||
case actionRendition:
|
||||
case actionJavaScript:
|
||||
case actionOCGState:
|
||||
break;
|
||||
|
||||
case actionUnknown:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (popplerLink)
|
||||
{
|
||||
popplerLinks.append(popplerLink);
|
||||
}
|
||||
}
|
||||
|
||||
delete xpdfLinks;
|
||||
#endif
|
||||
|
||||
return popplerLinks;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,147 @@
|
||||
/* poppler-private.h: qt interface to poppler
|
||||
* Copyright (C) 2005, Net Integration Technologies, Inc.
|
||||
* Copyright (C) 2005-2008, Albert Astals Cid <aacid@kde.org>
|
||||
* Copyright (C) 2006, Kristian Høgsberg <krh@bitplanet.net>
|
||||
* Copyright (C) 2006, Wilfried Huss <Wilfried.Huss@gmx.at>
|
||||
* Copyright (C) 2007, Pino Toscano <pino@kde.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#include "poppler-private.h"
|
||||
#include "poppler-link-qt3.h"
|
||||
|
||||
#include <qstring.h>
|
||||
|
||||
#include <Outline.h>
|
||||
#include <Link.h>
|
||||
|
||||
namespace Poppler {
|
||||
|
||||
/* borrowed from kpdf */
|
||||
QString unicodeToQString(Unicode* u, int len)
|
||||
{
|
||||
QString ret;
|
||||
ret.setLength(len);
|
||||
QChar* qch = (QChar*) ret.unicode();
|
||||
for (;len;--len)
|
||||
*qch++ = (QChar) *u++;
|
||||
return ret;
|
||||
}
|
||||
|
||||
QString UnicodeParsedString(GooString *s1)
|
||||
{
|
||||
GBool isUnicode;
|
||||
int i;
|
||||
Unicode u;
|
||||
QString result;
|
||||
if ( ( s1->getChar(0) & 0xff ) == 0xfe && ( s1->getChar(1) & 0xff ) == 0xff )
|
||||
{
|
||||
isUnicode = gTrue;
|
||||
i = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
isUnicode = gFalse;
|
||||
i = 0;
|
||||
}
|
||||
while ( i < s1->getLength() )
|
||||
{
|
||||
if ( isUnicode )
|
||||
{
|
||||
u = ( ( s1->getChar(i) & 0xff ) << 8 ) | ( s1->getChar(i+1) & 0xff );
|
||||
i += 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
u = s1->getChar(i) & 0xff;
|
||||
++i;
|
||||
}
|
||||
result += unicodeToQString( &u, 1 );
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
GooString *QStringToGooString(const QString &s)
|
||||
{
|
||||
int len = s.length();
|
||||
char *cstring = (char *)gmallocn(s.length(), sizeof(char));
|
||||
for (int i = 0; i < len; ++i)
|
||||
cstring[i] = s.at(i).unicode();
|
||||
GooString *ret = new GooString(cstring, len);
|
||||
gfree(cstring);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
void DocumentData::addTocChildren( QDomDocument * docSyn, QDomNode * parent, GooList * items )
|
||||
{
|
||||
int numItems = items->getLength();
|
||||
for ( int i = 0; i < numItems; ++i )
|
||||
{
|
||||
// iterate over every object in 'items'
|
||||
OutlineItem * outlineItem = (OutlineItem *)items->get( i );
|
||||
|
||||
// 1. create element using outlineItem's title as tagName
|
||||
QString name;
|
||||
Unicode * uniChar = outlineItem->getTitle();
|
||||
int titleLength = outlineItem->getTitleLength();
|
||||
name = unicodeToQString(uniChar, titleLength);
|
||||
if ( name.isEmpty() )
|
||||
continue;
|
||||
|
||||
QDomElement item = docSyn->createElement( name );
|
||||
parent->appendChild( item );
|
||||
|
||||
// 2. find the page the link refers to
|
||||
::LinkAction * a = outlineItem->getAction();
|
||||
if ( a && ( a->getKind() == actionGoTo || a->getKind() == actionGoToR ) )
|
||||
{
|
||||
// page number is contained/referenced in a LinkGoTo
|
||||
LinkGoTo * g = static_cast< LinkGoTo * >( a );
|
||||
LinkDest * destination = g->getDest();
|
||||
if ( !destination && g->getNamedDest() )
|
||||
{
|
||||
// no 'destination' but an internal 'named reference'. we could
|
||||
// get the destination for the page now, but it's VERY time consuming,
|
||||
// so better storing the reference and provide the viewport on demand
|
||||
GooString *s = g->getNamedDest();
|
||||
QChar *charArray = new QChar[s->getLength()];
|
||||
for (int i = 0; i < s->getLength(); ++i) charArray[i] = QChar(s->getCString()[i]);
|
||||
QString aux(charArray, s->getLength());
|
||||
item.setAttribute( "DestinationName", aux );
|
||||
delete[] charArray;
|
||||
}
|
||||
else if ( destination && destination->isOk() )
|
||||
{
|
||||
LinkDestinationData ldd(destination, NULL, this);
|
||||
item.setAttribute( "Destination", LinkDestination(ldd).toString() );
|
||||
}
|
||||
if ( a->getKind() == actionGoToR )
|
||||
{
|
||||
LinkGoToR * g2 = static_cast< LinkGoToR * >( a );
|
||||
item.setAttribute( "ExternalFileName", g2->getFileName()->getCString() );
|
||||
}
|
||||
}
|
||||
|
||||
// 3. recursively descend over children
|
||||
outlineItem->open();
|
||||
GooList * children = outlineItem->getKids();
|
||||
if ( children )
|
||||
addTocChildren( docSyn, &item, children );
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,97 @@
|
||||
/* poppler-private.h: qt interface to poppler
|
||||
* Copyright (C) 2005, Net Integration Technologies, Inc.
|
||||
* Copyright (C) 2005-2008, Albert Astals Cid <aacid@kde.org>
|
||||
* Copyright (C) 2006, Kristian Høgsberg <krh@bitplanet.net>
|
||||
* Copyright (C) 2006, Wilfried Huss <Wilfried.Huss@gmx.at>
|
||||
* Copyright (C) 2007, Pino Toscano <pino@kde.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#ifndef POPPLER_PRIVATE_H
|
||||
#define POPPLER_PRIVATE_H
|
||||
|
||||
#include <qdom.h>
|
||||
|
||||
#include <config.h>
|
||||
#include <Object.h>
|
||||
#include <PDFDoc.h>
|
||||
#include <FontInfo.h>
|
||||
#if defined(HAVE_SPLASH)
|
||||
#include <SplashOutputDev.h>
|
||||
#else
|
||||
class SplashOutputDev;
|
||||
#endif
|
||||
|
||||
namespace Poppler {
|
||||
|
||||
class DocumentData;
|
||||
|
||||
QString unicodeToQString(Unicode* u, int len);
|
||||
|
||||
QString UnicodeParsedString(GooString *s1);
|
||||
|
||||
GooString *QStringToGooString(const QString &s);
|
||||
|
||||
class LinkDestinationData {
|
||||
public:
|
||||
LinkDestinationData( LinkDest *l, GooString *nd, Poppler::DocumentData *pdfdoc ) : ld(l), namedDest(nd), doc(pdfdoc)
|
||||
{
|
||||
}
|
||||
|
||||
LinkDest *ld;
|
||||
GooString *namedDest;
|
||||
Poppler::DocumentData *doc;
|
||||
};
|
||||
|
||||
class DocumentData {
|
||||
public:
|
||||
DocumentData(GooString *filePath, GooString *password) : doc(filePath,password), m_fontInfoScanner(0), m_outputDev(0) {}
|
||||
|
||||
~DocumentData()
|
||||
{
|
||||
#if defined(HAVE_SPLASH)
|
||||
delete m_outputDev;
|
||||
#endif
|
||||
delete m_fontInfoScanner;
|
||||
}
|
||||
|
||||
SplashOutputDev *getOutputDev()
|
||||
{
|
||||
#if defined(HAVE_SPLASH)
|
||||
if (!m_outputDev)
|
||||
{
|
||||
SplashColor white;
|
||||
white[0] = 255;
|
||||
white[1] = 255;
|
||||
white[2] = 255;
|
||||
m_outputDev = new SplashOutputDev(splashModeXBGR8, 4, gFalse, white);
|
||||
m_outputDev->startDoc(doc.getXRef());
|
||||
}
|
||||
#endif
|
||||
return m_outputDev;
|
||||
}
|
||||
|
||||
void addTocChildren( QDomDocument * docSyn, QDomNode * parent, GooList * items );
|
||||
|
||||
class PDFDoc doc;
|
||||
bool locked;
|
||||
FontInfoScanner *m_fontInfoScanner;
|
||||
SplashOutputDev *m_outputDev;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // POPPLER_PRIVATE_H
|
@ -0,0 +1,310 @@
|
||||
/* poppler-qt.h: qt interface to poppler
|
||||
* Copyright (C) 2005, Net Integration Technologies, Inc.
|
||||
* Copyright (C) 2005, Tobias Koening <tokoe@kde.org>
|
||||
* Copyright (C) 2005-2007, Albert Astals Cid <aacid@kde.org>
|
||||
* Copyright (C) 2005-2006, Stefan Kebekus <stefan.kebekus@math.uni-koeln.de>
|
||||
* Copyright (C) 2006, Wilfried Huss <Wilfried.Huss@gmx.at>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#ifndef __POPPLER_QT_H__
|
||||
#define __POPPLER_QT_H__
|
||||
|
||||
#include "poppler-link-qt3.h"
|
||||
#include "poppler-page-transition.h"
|
||||
|
||||
#include <qcstring.h>
|
||||
#include <qdatetime.h>
|
||||
#include <qdom.h>
|
||||
#include <qpixmap.h>
|
||||
|
||||
namespace Poppler {
|
||||
|
||||
class Document;
|
||||
class Page;
|
||||
|
||||
/* A rectangle on a page, with coordinates in PDF points. */
|
||||
class Rectangle
|
||||
{
|
||||
public:
|
||||
Rectangle(double x1 = 0, double y1 = 0, double x2 = 0, double y2 = 0) :
|
||||
m_x1(x1), m_y1(y1), m_x2(x2), m_y2(y2) {}
|
||||
bool isNull() const { return m_x1 == 0 && m_y1 == 0 && m_x2 == 0 && m_y2 == 0; }
|
||||
|
||||
double m_x1;
|
||||
double m_y1;
|
||||
double m_x2;
|
||||
double m_y2;
|
||||
};
|
||||
|
||||
class TextBox
|
||||
{
|
||||
public:
|
||||
TextBox(const QString& text, const Rectangle &bBox) :
|
||||
m_text(text), m_bBox(bBox) {};
|
||||
|
||||
QString getText() const { return m_text; };
|
||||
Rectangle getBoundingBox() const { return m_bBox; };
|
||||
|
||||
private:
|
||||
QString m_text;
|
||||
Rectangle m_bBox;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
Container class for information about a font within a PDF document
|
||||
*/
|
||||
class FontInfoData;
|
||||
class FontInfo {
|
||||
public:
|
||||
enum Type {
|
||||
unknown,
|
||||
Type1,
|
||||
Type1C,
|
||||
Type1COT,
|
||||
Type3,
|
||||
TrueType,
|
||||
TrueTypeOT,
|
||||
CIDType0,
|
||||
CIDType0C,
|
||||
CIDType0COT,
|
||||
CIDTrueType,
|
||||
CIDTrueTypeOT
|
||||
};
|
||||
|
||||
/**
|
||||
Create a new font information container
|
||||
*/
|
||||
FontInfo( const QString &fontName, const bool isEmbedded,
|
||||
const bool isSubset, Type type );
|
||||
|
||||
FontInfo();
|
||||
|
||||
FontInfo( const FontInfo &fi );
|
||||
|
||||
~FontInfo();
|
||||
|
||||
/**
|
||||
The name of the font. Can be QString::null if the font has no name
|
||||
*/
|
||||
const QString &name() const;
|
||||
|
||||
/**
|
||||
Whether the font is embedded in the file, or not
|
||||
|
||||
\return true if the font is embedded
|
||||
*/
|
||||
bool isEmbedded() const;
|
||||
|
||||
/**
|
||||
Whether the font provided is only a subset of the full
|
||||
font or not. This only has meaning if the font is embedded.
|
||||
|
||||
\return true if the font is only a subset
|
||||
*/
|
||||
bool isSubset() const;
|
||||
|
||||
/**
|
||||
The type of font encoding
|
||||
*/
|
||||
Type type() const;
|
||||
|
||||
const QString &typeName() const;
|
||||
|
||||
private:
|
||||
FontInfoData *data;
|
||||
};
|
||||
|
||||
class PageData;
|
||||
class Page {
|
||||
friend class Document;
|
||||
public:
|
||||
~Page();
|
||||
void renderToPixmap(QPixmap **q, int x, int y, int w, int h, double xres, double yres, bool doLinks = false) const;
|
||||
|
||||
/**
|
||||
This is a convenience function that is equivalent to
|
||||
renderToPixmap() with xres and yres set to 72.0. We keep it
|
||||
only for binary compatibility
|
||||
|
||||
\sa renderToImage()
|
||||
*/
|
||||
void renderToPixmap(QPixmap **q, int x, int y, int w, int h, bool doLinks = false) const;
|
||||
|
||||
/**
|
||||
\brief Render the page to a QImage using the Splash renderer
|
||||
|
||||
This method can be used to render the page to a QImage. It
|
||||
uses the "Splash" rendering engine.
|
||||
|
||||
\param xres horizontal resolution of the graphics device,
|
||||
in dots per inch (defaults to 72 dpi)
|
||||
|
||||
\param yres vertical resolution of the graphics device, in
|
||||
dots per inch (defaults to 72 dpi)
|
||||
|
||||
\returns a QImage of the page.
|
||||
|
||||
\sa renderToPixmap()
|
||||
*/
|
||||
QImage renderToImage(double xres = 72.0, double yres = 72.0, bool doLinks = false) const;
|
||||
|
||||
/**
|
||||
* Returns the size of the page in points
|
||||
**/
|
||||
QSize pageSize() const;
|
||||
|
||||
/**
|
||||
* Returns the text that is inside the Rectangle r
|
||||
* If r is a null Rectangle all text of the page is given
|
||||
**/
|
||||
QString getText(const Rectangle &r) const;
|
||||
|
||||
QValueList<TextBox*> textList() const;
|
||||
|
||||
/**
|
||||
* Returns the transition of this page
|
||||
**/
|
||||
PageTransition *getTransition() const;
|
||||
|
||||
enum Orientation {
|
||||
Landscape,
|
||||
Portrait,
|
||||
Seascape,
|
||||
UpsideDown
|
||||
};
|
||||
|
||||
/**
|
||||
* The orientation of the page
|
||||
**/
|
||||
Orientation orientation() const;
|
||||
|
||||
/**
|
||||
Gets the links of the page once it has been rendered if doLinks was true
|
||||
*/
|
||||
QValueList<Link*> links() const;
|
||||
|
||||
private:
|
||||
Page(const Document *doc, int index);
|
||||
PageData *data;
|
||||
};
|
||||
|
||||
class DocumentData;
|
||||
|
||||
class Document {
|
||||
friend class Page;
|
||||
|
||||
public:
|
||||
enum PageMode {
|
||||
UseNone,
|
||||
UseOutlines,
|
||||
UseThumbs,
|
||||
FullScreen,
|
||||
UseOC
|
||||
};
|
||||
|
||||
static Document *load(const QString & filePath);
|
||||
|
||||
Page *getPage(int index) const{ return new Page(this, index); }
|
||||
|
||||
int getNumPages() const;
|
||||
|
||||
PageMode getPageMode() const;
|
||||
|
||||
bool unlock(const QCString &password);
|
||||
|
||||
bool isLocked() const;
|
||||
|
||||
QDateTime getDate( const QString & data ) const;
|
||||
QString getInfo( const QString & data ) const;
|
||||
bool isEncrypted() const;
|
||||
bool isLinearized() const;
|
||||
bool okToPrint() const;
|
||||
bool okToChange() const;
|
||||
bool okToCopy() const;
|
||||
bool okToAddNotes() const;
|
||||
double getPDFVersion() const;
|
||||
/**
|
||||
The version of the PDF specification that the document
|
||||
conforms to
|
||||
|
||||
\param major an optional pointer to a variable where store the
|
||||
"major" number of the version
|
||||
\param minor an optional pointer to a variable where store the
|
||||
"minor" number of the version
|
||||
|
||||
\since 0.12
|
||||
*/
|
||||
void getPdfVersion(int *major, int *minor) const;
|
||||
|
||||
bool print(const QString &fileName, QValueList<int> pageList, double hDPI, double vDPI, int rotate);
|
||||
|
||||
// If you are using QPrinter you can get paper size doing
|
||||
// QPrinter dummy(QPrinter::PrinterResolution);
|
||||
// dummy.setFullPage(true);
|
||||
// dummy.setPageSize(thePageSizeYouWant);
|
||||
// QPaintDeviceMetrics metrics(&dummy);
|
||||
// int width = metrics.width();
|
||||
// int height = metrics.height();
|
||||
bool print(const QString &fileName, QValueList<int> pageList, double hDPI, double vDPI, int rotate, int paperWidth, int paperHeight);
|
||||
|
||||
/**
|
||||
The fonts within the PDF document.
|
||||
|
||||
\note this can take a very long time to run with a large
|
||||
document. You may wish to use the call below if you have more
|
||||
than say 20 pages
|
||||
*/
|
||||
QValueList<FontInfo> fonts() const;
|
||||
|
||||
/**
|
||||
\overload
|
||||
|
||||
\param numPages the number of pages to scan
|
||||
\param fontList pointer to the list where the font information
|
||||
should be placed
|
||||
|
||||
\return false if the end of the document has been reached
|
||||
*/
|
||||
bool scanForFonts( int numPages, QValueList<FontInfo> *fontList ) const;
|
||||
|
||||
/**
|
||||
Gets the TOC of the Document, it is application responsabiliy to delete
|
||||
it when no longer needed
|
||||
|
||||
* In the tree the tag name is the 'screen' name of the entry. A tag can have
|
||||
* attributes. Here follows the list of tag attributes with meaning:
|
||||
* - Destination: A string description of the referred destination
|
||||
* - DestinationName: A 'named reference' to the viewport that must be converted
|
||||
* using linkDestination( *destination_name* )
|
||||
* - ExternalFileName: A link to a external filename
|
||||
|
||||
\returns NULL if the Document does not have TOC
|
||||
*/
|
||||
QDomDocument *toc() const;
|
||||
|
||||
LinkDestination *linkDestination( const QString &name );
|
||||
|
||||
~Document();
|
||||
|
||||
private:
|
||||
DocumentData *data;
|
||||
Document(DocumentData *dataA);
|
||||
};
|
||||
|
||||
}
|
||||
#endif
|
@ -0,0 +1,122 @@
|
||||
#include <qapplication.h>
|
||||
#include <qpainter.h>
|
||||
#include <qpixmap.h>
|
||||
#include <qwidget.h>
|
||||
#include <qlabel.h>
|
||||
#include <qmessagebox.h>
|
||||
#include <qfile.h>
|
||||
#include <ctype.h>
|
||||
#include <poppler-qt.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
class PDFDisplay : public QWidget // picture display widget
|
||||
{
|
||||
public:
|
||||
PDFDisplay( Poppler::Document *d );
|
||||
~PDFDisplay();
|
||||
protected:
|
||||
void paintEvent( QPaintEvent * );
|
||||
void keyPressEvent( QKeyEvent * );
|
||||
private:
|
||||
void display();
|
||||
|
||||
int currentPage;
|
||||
QPixmap *pixmap;
|
||||
Poppler::Document *doc;
|
||||
};
|
||||
|
||||
PDFDisplay::PDFDisplay( Poppler::Document *d )
|
||||
{
|
||||
doc = d;
|
||||
pixmap = 0;
|
||||
currentPage = 0;
|
||||
display();
|
||||
}
|
||||
|
||||
PDFDisplay::~PDFDisplay()
|
||||
{
|
||||
delete doc;
|
||||
delete pixmap;
|
||||
}
|
||||
|
||||
void PDFDisplay::paintEvent( QPaintEvent *e )
|
||||
{
|
||||
QPainter paint( this ); // paint widget
|
||||
if (pixmap)
|
||||
paint.drawPixmap(0, 0, *pixmap);
|
||||
}
|
||||
|
||||
void PDFDisplay::keyPressEvent( QKeyEvent *e )
|
||||
{
|
||||
if (e->key() == Qt::Key_Down)
|
||||
{
|
||||
if (currentPage + 1 < doc->getNumPages())
|
||||
{
|
||||
currentPage++;
|
||||
display();
|
||||
}
|
||||
}
|
||||
else if (e->key() == Qt::Key_Up)
|
||||
{
|
||||
if (currentPage > 0)
|
||||
{
|
||||
currentPage--;
|
||||
display();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PDFDisplay::display()
|
||||
{
|
||||
if (doc) {
|
||||
Poppler::Page *page = doc->getPage(currentPage);
|
||||
if (page) {
|
||||
delete pixmap;
|
||||
page->renderToPixmap(&pixmap, -1, -1, -1, -1);
|
||||
delete page;
|
||||
update();
|
||||
}
|
||||
} else {
|
||||
printf("doc not loaded\n");
|
||||
}
|
||||
}
|
||||
|
||||
int main( int argc, char **argv )
|
||||
{
|
||||
QApplication a( argc, argv ); // QApplication required!
|
||||
|
||||
if ( argc < 2 || (argc == 3 && strcmp(argv[2], "-extract") != 0) || argc > 3)
|
||||
{
|
||||
// use argument as file name
|
||||
printf("usage: test-poppler-qt filename [-extract]\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
Poppler::Document *doc = Poppler::Document::load(argv[1]);
|
||||
if (!doc)
|
||||
{
|
||||
printf("doc not loaded\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (argc == 2)
|
||||
{
|
||||
PDFDisplay test( doc ); // create picture display
|
||||
a.setMainWidget( &test); // set main widget
|
||||
test.setCaption("Poppler-Qt Test");
|
||||
test.show(); // show it
|
||||
|
||||
return a.exec(); // start event loop
|
||||
}
|
||||
else
|
||||
{
|
||||
Poppler::Page *page = doc->getPage(0);
|
||||
|
||||
QLabel *l = new QLabel(page->getText(Poppler::Rectangle()), 0);
|
||||
l->show();
|
||||
a.setMainWidget(l); // set main widget
|
||||
delete page;
|
||||
delete doc;
|
||||
return a.exec();
|
||||
}
|
||||
}
|
Loading…
Reference in new issue