You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
3.0 KiB
135 lines
3.0 KiB
13 years ago
|
#ifndef __PDFDISPLAY_HPP__
|
||
|
#define __PDFDISPLAY_HPP__
|
||
|
|
||
|
#include <QtCore/QFile>
|
||
|
#include <QtGui/QApplication>
|
||
|
#include <QtGui/QImage>
|
||
|
#include <QtGui/QLabel>
|
||
|
#include <QtGui/QMouseEvent>
|
||
|
#include <QtGui/QPainter>
|
||
|
#include <QtGui/QPaintEvent>
|
||
|
#include <QtGui/QToolTip>
|
||
|
#include <QtGui/QWidget>
|
||
|
|
||
|
#include <QtCore/QDebug>
|
||
|
|
||
|
#include <poppler/qt4/poppler-qt4.h>
|
||
|
|
||
|
class PDFDisplay : public QWidget // picture display widget
|
||
|
{
|
||
|
public:
|
||
|
PDFDisplay( Poppler::Document *d, bool arthur )
|
||
|
{
|
||
|
showTextRects = false;
|
||
|
doc = d;
|
||
|
m_currentPage = 0;
|
||
|
if (arthur)
|
||
|
{
|
||
|
backendString = "Arthur";
|
||
|
doc->setRenderBackend(Poppler::Document::ArthurBackend);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
backendString = "Splash";
|
||
|
doc->setRenderBackend(Poppler::Document::SplashBackend);
|
||
|
}
|
||
|
doc->setRenderHint(Poppler::Document::Antialiasing, true);
|
||
|
doc->setRenderHint(Poppler::Document::TextAntialiasing, true);
|
||
|
}
|
||
|
~PDFDisplay()
|
||
|
{
|
||
|
qDeleteAll(textRects);
|
||
|
delete doc;
|
||
|
}
|
||
|
|
||
|
void setShowTextRects(bool show)
|
||
|
{
|
||
|
showTextRects = show;
|
||
|
}
|
||
|
void display()
|
||
|
{
|
||
|
if (doc) {
|
||
|
Poppler::Page *page = doc->page(m_currentPage);
|
||
|
if (page) {
|
||
|
qDebug() << "Displaying page using" << backendString << "backend: " << m_currentPage;
|
||
|
QTime t = QTime::currentTime();
|
||
|
image = page->renderToImage();
|
||
|
qDebug() << "Rendering took" << t.msecsTo(QTime::currentTime()) << "msecs";
|
||
|
qDeleteAll(textRects);
|
||
|
if (showTextRects)
|
||
|
{
|
||
|
QPainter painter(&image);
|
||
|
painter.setPen(Qt::red);
|
||
|
textRects = page->textList();
|
||
|
for (auto tb(textRects.begin()); tb!=textRects.end(); ++tb)
|
||
|
painter.drawRect((*tb)->boundingBox());
|
||
|
}
|
||
|
else textRects.clear();
|
||
|
update();
|
||
|
delete page;
|
||
|
}
|
||
|
} else {
|
||
|
qWarning() << "doc not loaded";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
protected:
|
||
|
void paintEvent( QPaintEvent * )
|
||
|
{
|
||
|
QPainter paint( this ); // paint widget
|
||
|
if (!image.isNull()) {
|
||
|
paint.drawImage(0, 0, image);
|
||
|
} else {
|
||
|
qWarning() << "null image";
|
||
|
}
|
||
|
}
|
||
|
void keyPressEvent( QKeyEvent *e )
|
||
|
{
|
||
|
if (e->key() == Qt::Key_Down)
|
||
|
{
|
||
|
if (m_currentPage + 1 < doc->numPages())
|
||
|
{
|
||
|
m_currentPage++;
|
||
|
display();
|
||
|
}
|
||
|
}
|
||
|
else if (e->key() == Qt::Key_Up)
|
||
|
{
|
||
|
if (m_currentPage > 0)
|
||
|
{
|
||
|
m_currentPage--;
|
||
|
display();
|
||
|
}
|
||
|
}
|
||
|
else if (e->key() == Qt::Key_Q)
|
||
|
{
|
||
|
exit(0);
|
||
|
}
|
||
|
}
|
||
|
void mousePressEvent( QMouseEvent *e )
|
||
|
{
|
||
|
int i = 0;
|
||
|
for (auto tb(textRects.begin()); tb!=textRects.end(); ++tb)
|
||
|
{
|
||
|
if ((*tb)->boundingBox().contains(e->pos()))
|
||
|
{
|
||
|
QString tt = QString("Text: \"%1\"\nIndex in text list: %2").arg((*tb)->text()).arg(i);
|
||
|
QToolTip::showText(e->globalPos(), tt, this);
|
||
|
break;
|
||
|
}
|
||
|
++i;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private:
|
||
|
int m_currentPage;
|
||
|
QImage image;
|
||
|
Poppler::Document *doc;
|
||
|
QString backendString;
|
||
|
bool showTextRects;
|
||
|
QList<Poppler::TextBox*> textRects;
|
||
|
};
|
||
|
|
||
|
|
||
|
#endif
|