#ifndef __PDFDISPLAY_HPP__ #define __PDFDISPLAY_HPP__ #include #include #include #include #include #include #include #include #include #include #include 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 textRects; }; #endif