1#include <QtCore/QDebug>
2#include <QtWidgets/QApplication>
3#include <QtGui/QImage>
4#include <QtGui/QPainter>
5#include <QtGui/QPaintEvent>
6#include <QtWidgets/QWidget>
7
8#include <poppler-qt6.h>
9
10class PDFDisplay : public QWidget // picture display widget
11{
12 Q_OBJECT
13public:
14 explicit PDFDisplay(std::unique_ptr<Poppler::Document> &&d, QWidget *parent = nullptr);
15 ~PDFDisplay() override;
16
17protected:
18 void paintEvent(QPaintEvent *) override;
19 void keyPressEvent(QKeyEvent *) override;
20
21private:
22 void display();
23 int m_currentPage;
24 QImage image;
25 std::unique_ptr<Poppler::Document> doc;
26};
27
28PDFDisplay::PDFDisplay(std::unique_ptr<Poppler::Document> &&d, QWidget *parent) : QWidget(parent)
29{
30 doc = std::move(d);
31 m_currentPage = 0;
32 display();
33}
34
35void PDFDisplay::display()
36{
37 if (doc) {
38 std::unique_ptr<Poppler::Page> page = doc->page(index: m_currentPage);
39 if (page) {
40 qDebug() << "Displaying page: " << m_currentPage;
41 image = page->renderToImage();
42 update();
43 }
44 } else {
45 qWarning() << "doc not loaded";
46 }
47}
48
49PDFDisplay::~PDFDisplay() { }
50
51void PDFDisplay::paintEvent(QPaintEvent *e)
52{
53 QPainter paint(this); // paint widget
54 if (!image.isNull()) {
55 paint.drawImage(x: 0, y: 0, image);
56 } else {
57 qWarning() << "null image";
58 }
59}
60
61void PDFDisplay::keyPressEvent(QKeyEvent *e)
62{
63 if (e->key() == Qt::Key_Down) {
64 if (m_currentPage + 1 < doc->numPages()) {
65 m_currentPage++;
66 display();
67 }
68 } else if (e->key() == Qt::Key_Up) {
69 if (m_currentPage > 0) {
70 m_currentPage--;
71 display();
72 }
73 } else if (e->key() == Qt::Key_Q) {
74 exit(status: 0);
75 }
76}
77
78int main(int argc, char **argv)
79{
80 QApplication a(argc, argv); // QApplication required!
81
82 if (argc != 3) {
83 qWarning() << "usage: test-password-qt6 owner-password filename";
84 exit(status: 1);
85 }
86
87 std::unique_ptr<Poppler::Document> doc = Poppler::Document::load(filePath: argv[2], ownerPassword: argv[1]);
88 if (!doc) {
89 qWarning() << "doc not loaded";
90 exit(status: 1);
91 }
92
93 // output some meta-data
94 auto pdfVersion = doc->getPdfVersion();
95 qDebug() << " PDF Version: " << qPrintable(QStringLiteral("%1.%2").arg(pdfVersion.major).arg(pdfVersion.minor));
96 qDebug() << " Title: " << doc->info(QStringLiteral("Title"));
97 qDebug() << " Subject: " << doc->info(QStringLiteral("Subject"));
98 qDebug() << " Author: " << doc->info(QStringLiteral("Author"));
99 qDebug() << " Key words: " << doc->info(QStringLiteral("Keywords"));
100 qDebug() << " Creator: " << doc->info(QStringLiteral("Creator"));
101 qDebug() << " Producer: " << doc->info(QStringLiteral("Producer"));
102 qDebug() << " Date created: " << doc->date(QStringLiteral("CreationDate")).toString();
103 qDebug() << " Date modified: " << doc->date(QStringLiteral("ModDate")).toString();
104 qDebug() << "Number of pages: " << doc->numPages();
105 qDebug() << " Linearised: " << doc->isLinearized();
106 qDebug() << " Encrypted: " << doc->isEncrypted();
107 qDebug() << " OK to print: " << doc->okToPrint();
108 qDebug() << " OK to copy: " << doc->okToCopy();
109 qDebug() << " OK to change: " << doc->okToChange();
110 qDebug() << "OK to add notes: " << doc->okToAddNotes();
111 qDebug() << " Page mode: " << doc->pageMode();
112 QStringList fontNameList;
113 foreach (const Poppler::FontInfo &font, doc->fonts())
114 fontNameList += font.name();
115 qDebug() << " Fonts: " << fontNameList.join(QStringLiteral(", "));
116
117 std::unique_ptr<Poppler::Page> page = doc->page(index: 0);
118 qDebug() << " Page 1 size: " << page->pageSize().width() / 72 << "inches x " << page->pageSize().height() / 72 << "inches";
119
120 PDFDisplay test(std::move(doc)); // create picture display
121 test.setWindowTitle(QStringLiteral("Poppler-Qt6 Test"));
122 test.show(); // show it
123
124 return a.exec(); // start event loop
125}
126
127#include "test-password-qt6.moc"
128

source code of poppler/qt6/tests/test-password-qt6.cpp