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.
134 lines
3.0 KiB
134 lines
3.0 KiB
#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
|
|
|