summaryrefslogtreecommitdiff
path: root/qt5/tests/test-poppler-qt5.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'qt5/tests/test-poppler-qt5.cpp')
-rw-r--r--qt5/tests/test-poppler-qt5.cpp235
1 files changed, 235 insertions, 0 deletions
diff --git a/qt5/tests/test-poppler-qt5.cpp b/qt5/tests/test-poppler-qt5.cpp
new file mode 100644
index 00000000..d16728bb
--- /dev/null
+++ b/qt5/tests/test-poppler-qt5.cpp
@@ -0,0 +1,235 @@
+#include <QtCore/QDebug>
+#include <QtCore/QFile>
+#include <QtWidgets/QApplication>
+#include <QtGui/QImage>
+#include <QtWidgets/QLabel>
+#include <QtGui/QMouseEvent>
+#include <QtGui/QPainter>
+#include <QtGui/QPaintEvent>
+#include <QtWidgets/QToolTip>
+#include <QtWidgets/QWidget>
+
+#include <poppler-qt5.h>
+
+class PDFDisplay : public QWidget // picture display widget
+{
+public:
+ PDFDisplay( Poppler::Document *d, bool arthur );
+ ~PDFDisplay();
+ void setShowTextRects(bool show);
+ void display();
+protected:
+ void paintEvent( QPaintEvent * );
+ void keyPressEvent( QKeyEvent * );
+ void mousePressEvent( QMouseEvent * );
+private:
+ int m_currentPage;
+ QImage image;
+ Poppler::Document *doc;
+ QString backendString;
+ bool showTextRects;
+ QList<Poppler::TextBox*> textRects;
+};
+
+PDFDisplay::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);
+}
+
+void PDFDisplay::setShowTextRects(bool show)
+{
+ showTextRects = show;
+}
+
+void PDFDisplay::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();
+ foreach(Poppler::TextBox *tb, textRects)
+ {
+ painter.drawRect(tb->boundingBox());
+ }
+ }
+ else textRects.clear();
+ update();
+ delete page;
+ }
+ } else {
+ qWarning() << "doc not loaded";
+ }
+}
+
+PDFDisplay::~PDFDisplay()
+{
+ qDeleteAll(textRects);
+ delete doc;
+}
+
+void PDFDisplay::paintEvent( QPaintEvent *e )
+{
+ QPainter paint( this ); // paint widget
+ if (!image.isNull()) {
+ paint.drawImage(0, 0, image);
+ } else {
+ qWarning() << "null image";
+ }
+}
+
+void PDFDisplay::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 PDFDisplay::mousePressEvent( QMouseEvent *e )
+{
+ int i = 0;
+ foreach(Poppler::TextBox *tb, textRects)
+ {
+ 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;
+ }
+}
+
+int main( int argc, char **argv )
+{
+ QApplication a( argc, argv ); // QApplication required!
+
+ if ( argc < 2 ||
+ (argc == 3 && strcmp(argv[2], "-extract") != 0 && strcmp(argv[2], "-arthur") != 0 && strcmp(argv[2], "-textRects") != 0) ||
+ argc > 3)
+ {
+ // use argument as file name
+ qWarning() << "usage: test-poppler-qt5 filename [-extract|-arthur|-textRects]";
+ exit(1);
+ }
+
+ Poppler::Document *doc = Poppler::Document::load(QFile::decodeName(argv[1]));
+ if (!doc)
+ {
+ qWarning() << "doc not loaded";
+ exit(1);
+ }
+
+ if (doc->isLocked())
+ {
+ qWarning() << "document locked (needs password)";
+ exit(0);
+ }
+
+ // output some meta-data
+ int major = 0, minor = 0;
+ doc->getPdfVersion( &major, &minor );
+ qDebug() << " PDF Version: " << qPrintable(QString::fromLatin1("%1.%2").arg(major).arg(minor));
+ qDebug() << " Title: " << doc->info("Title");
+ qDebug() << " Subject: " << doc->info("Subject");
+ qDebug() << " Author: " << doc->info("Author");
+ qDebug() << " Key words: " << doc->info("Keywords");
+ qDebug() << " Creator: " << doc->info("Creator");
+ qDebug() << " Producer: " << doc->info("Producer");
+ qDebug() << " Date created: " << doc->date("CreationDate").toString();
+ qDebug() << " Date modified: " << doc->date("ModDate").toString();
+ qDebug() << "Number of pages: " << doc->numPages();
+ qDebug() << " Linearised: " << doc->isLinearized();
+ qDebug() << " Encrypted: " << doc->isEncrypted();
+ qDebug() << " OK to print: " << doc->okToPrint();
+ qDebug() << " OK to copy: " << doc->okToCopy();
+ qDebug() << " OK to change: " << doc->okToChange();
+ qDebug() << "OK to add notes: " << doc->okToAddNotes();
+ qDebug() << " Page mode: " << doc->pageMode();
+ qDebug() << " Metadata: " << doc->metadata();
+
+ if ( doc->hasEmbeddedFiles() ) {
+ qDebug() << "Embedded files:";
+ foreach( Poppler::EmbeddedFile *file, doc->embeddedFiles() ) {
+ qDebug() << " " << file->name();
+ }
+ qDebug();
+ } else {
+ qDebug() << "No embedded files";
+ }
+
+ if (doc->numPages() <= 0)
+ {
+ delete doc;
+ qDebug() << "Doc has no pages";
+ return 0;
+ }
+
+ Poppler::Page *page = doc->page(0);
+ if (page)
+ {
+ qDebug() << "Page 1 size: " << page->pageSize().width()/72 << "inches x " << page->pageSize().height()/72 << "inches";
+ delete page;
+ }
+
+ if (argc == 2 || (argc == 3 && strcmp(argv[2], "-arthur") == 0) || (argc == 3 && strcmp(argv[2], "-textRects") == 0))
+ {
+ bool useArthur = (argc == 3 && strcmp(argv[2], "-arthur") == 0);
+ PDFDisplay test( doc, useArthur ); // create picture display
+ test.setWindowTitle("Poppler-Qt5 Test");
+ test.setShowTextRects(argc == 3 && strcmp(argv[2], "-textRects") == 0);
+ test.display();
+ test.show(); // show it
+
+ return a.exec(); // start event loop
+ }
+ else
+ {
+ Poppler::Page *page = doc->page(0);
+
+ QLabel *l = new QLabel(page->text(QRectF()), 0);
+ l->show();
+ delete page;
+ delete doc;
+ return a.exec();
+ }
+}