1 #include <QtTest/QtTest>
2 
3 #include <poppler-qt6.h>
4 
5 class TestMetaData : public QObject
6 {
7     Q_OBJECT
8 public:
TestMetaData(QObject * parent=nullptr)9     explicit TestMetaData(QObject *parent = nullptr) : QObject(parent) { }
10 private slots:
11     void checkStrings_data();
12     void checkStrings();
13     void checkStrings2_data();
14     void checkStrings2();
15     void checkStringKeys();
16     void checkLinearised();
17     void checkNumPages();
18     void checkDate();
19     void checkPageSize();
20     void checkPortraitOrientation();
21     void checkLandscapeOrientation();
22     void checkUpsideDownOrientation();
23     void checkSeascapeOrientation();
24     void checkVersion();
25     void checkPdfId();
26     void checkNoPdfId();
27 };
28 
checkStrings_data()29 void TestMetaData::checkStrings_data()
30 {
31     QTest::addColumn<QString>("key");
32     QTest::addColumn<QString>("value");
33 
34     QTest::newRow("Author") << "Author"
35                             << "Brad Hards";
36     QTest::newRow("Title") << "Title"
37                            << "Two pages";
38     QTest::newRow("Subject") << "Subject"
39                              << "A two page layout for poppler testing";
40     QTest::newRow("Keywords") << "Keywords"
41                               << "Qt4 bindings";
42     QTest::newRow("Creator") << "Creator"
43                              << "iText: cgpdftops CUPS filter";
44     QTest::newRow("Producer") << "Producer"
45                               << "Acrobat Distiller 7.0 for Macintosh";
46 }
47 
checkStrings()48 void TestMetaData::checkStrings()
49 {
50     std::unique_ptr<Poppler::Document> doc = Poppler::Document::load(TESTDATADIR "/unittestcases/doublepage.pdf");
51     QVERIFY(doc);
52 
53     QFETCH(QString, key);
54     QFETCH(QString, value);
55     QCOMPARE(doc->info(key), value);
56 }
57 
checkStrings2_data()58 void TestMetaData::checkStrings2_data()
59 {
60     QTest::addColumn<QString>("key");
61     QTest::addColumn<QString>("value");
62 
63     QTest::newRow("Title") << "Title"
64                            << "Malaga hotels";
65     QTest::newRow("Author") << "Author"
66                             << "Brad Hards";
67     QTest::newRow("Creator") << "Creator"
68                              << "Safari: cgpdftops CUPS filter";
69     QTest::newRow("Producer") << "Producer"
70                               << "Acrobat Distiller 7.0 for Macintosh";
71     QTest::newRow("Keywords") << "Keywords"
72                               << "First\rSecond\rthird";
73     QTest::newRow("Custom1") << "Custom1"
74                              << "CustomValue1";
75     QTest::newRow("Custom2") << "Custom2"
76                              << "CustomValue2";
77 }
78 
checkStrings2()79 void TestMetaData::checkStrings2()
80 {
81     std::unique_ptr<Poppler::Document> doc = Poppler::Document::load(TESTDATADIR "/unittestcases/truetype.pdf");
82     QVERIFY(doc);
83 
84     QFETCH(QString, key);
85     QFETCH(QString, value);
86     QCOMPARE(doc->info(key), value);
87 }
88 
checkStringKeys()89 void TestMetaData::checkStringKeys()
90 {
91     std::unique_ptr<Poppler::Document> doc = Poppler::Document::load(TESTDATADIR "/unittestcases/truetype.pdf");
92     QVERIFY(doc);
93 
94     QStringList keyList;
95     keyList << QStringLiteral("Title") << QStringLiteral("Author") << QStringLiteral("Creator") << QStringLiteral("Keywords") << QStringLiteral("CreationDate");
96     keyList << QStringLiteral("Producer") << QStringLiteral("ModDate") << QStringLiteral("Custom1") << QStringLiteral("Custom2");
97     keyList.sort();
98     QStringList keysInDoc = doc->infoKeys();
99     keysInDoc.sort();
100     QCOMPARE(keysInDoc, keyList);
101 }
102 
checkLinearised()103 void TestMetaData::checkLinearised()
104 {
105     std::unique_ptr<Poppler::Document> doc = Poppler::Document::load(TESTDATADIR "/unittestcases/orientation.pdf");
106     QVERIFY(doc);
107 
108     QVERIFY(doc->isLinearized());
109 
110     doc = Poppler::Document::load(TESTDATADIR "/unittestcases/truetype.pdf");
111     QVERIFY(doc);
112     QCOMPARE(doc->isLinearized(), false);
113 }
114 
checkPortraitOrientation()115 void TestMetaData::checkPortraitOrientation()
116 {
117     std::unique_ptr<Poppler::Document> doc = Poppler::Document::load(TESTDATADIR "/unittestcases/orientation.pdf");
118     QVERIFY(doc);
119 
120     std::unique_ptr<Poppler::Page> page = doc->page(0);
121     QCOMPARE(page->orientation(), Poppler::Page::Portrait);
122 }
123 
checkNumPages()124 void TestMetaData::checkNumPages()
125 {
126     std::unique_ptr<Poppler::Document> doc = Poppler::Document::load(TESTDATADIR "/unittestcases/doublepage.pdf");
127     QVERIFY(doc);
128     QCOMPARE(doc->numPages(), 2);
129 
130     doc = Poppler::Document::load(TESTDATADIR "/unittestcases/truetype.pdf");
131     QVERIFY(doc);
132     QCOMPARE(doc->numPages(), 1);
133 }
134 
checkDate()135 void TestMetaData::checkDate()
136 {
137     std::unique_ptr<Poppler::Document> doc = Poppler::Document::load(TESTDATADIR "/unittestcases/truetype.pdf");
138     QVERIFY(doc);
139     QCOMPARE(doc->date(QStringLiteral("ModDate")), QDateTime(QDate(2005, 12, 5), QTime(9, 44, 46), Qt::UTC));
140     QCOMPARE(doc->date(QStringLiteral("CreationDate")), QDateTime(QDate(2005, 8, 13), QTime(1, 12, 11), Qt::UTC));
141 }
142 
checkPageSize()143 void TestMetaData::checkPageSize()
144 {
145     std::unique_ptr<Poppler::Document> doc = Poppler::Document::load(TESTDATADIR "/unittestcases/truetype.pdf");
146     QVERIFY(doc);
147     std::unique_ptr<Poppler::Page> page = doc->page(0);
148     QCOMPARE(page->pageSize(), QSize(595, 842));
149     QCOMPARE(page->pageSizeF(), QSizeF(595.22, 842));
150 }
151 
checkLandscapeOrientation()152 void TestMetaData::checkLandscapeOrientation()
153 {
154     std::unique_ptr<Poppler::Document> doc = Poppler::Document::load(TESTDATADIR "/unittestcases/orientation.pdf");
155     QVERIFY(doc);
156 
157     std::unique_ptr<Poppler::Page> page = doc->page(1);
158     QCOMPARE(page->orientation(), Poppler::Page::Landscape);
159 }
160 
checkUpsideDownOrientation()161 void TestMetaData::checkUpsideDownOrientation()
162 {
163     std::unique_ptr<Poppler::Document> doc = Poppler::Document::load(TESTDATADIR "/unittestcases/orientation.pdf");
164     QVERIFY(doc);
165 
166     std::unique_ptr<Poppler::Page> page = doc->page(2);
167     QCOMPARE(page->orientation(), Poppler::Page::UpsideDown);
168 }
169 
checkSeascapeOrientation()170 void TestMetaData::checkSeascapeOrientation()
171 {
172     std::unique_ptr<Poppler::Document> doc = Poppler::Document::load(TESTDATADIR "/unittestcases/orientation.pdf");
173     QVERIFY(doc);
174 
175     std::unique_ptr<Poppler::Page> page = doc->page(3);
176     QCOMPARE(page->orientation(), Poppler::Page::Seascape);
177 }
178 
checkVersion()179 void TestMetaData::checkVersion()
180 {
181     std::unique_ptr<Poppler::Document> doc = Poppler::Document::load(TESTDATADIR "/unittestcases/doublepage.pdf");
182     QVERIFY(doc);
183 
184     auto pdfVersion = doc->getPdfVersion();
185     QCOMPARE(pdfVersion.major, 1);
186     QCOMPARE(pdfVersion.minor, 6);
187 }
188 
checkPdfId()189 void TestMetaData::checkPdfId()
190 {
191     std::unique_ptr<Poppler::Document> doc = Poppler::Document::load(TESTDATADIR "/unittestcases/A6EmbeddedFiles.pdf");
192     QVERIFY(doc);
193 
194     const QByteArray referencePermanentId("00C9D5B6D8FB11D7A902003065D630AA");
195     const QByteArray referenceUpdateId("39AECAE6D8FB11D7A902003065D630AA");
196 
197     {
198         // no IDs wanted, just existance check
199         QVERIFY(doc->getPdfId(nullptr, nullptr));
200     }
201     {
202         // only permanent ID
203         QByteArray permanentId;
204         QVERIFY(doc->getPdfId(&permanentId, nullptr));
205         QCOMPARE(permanentId.toUpper(), referencePermanentId);
206     }
207     {
208         // only update ID
209         QByteArray updateId;
210         QVERIFY(doc->getPdfId(nullptr, &updateId));
211         QCOMPARE(updateId.toUpper(), referenceUpdateId);
212     }
213     {
214         // both IDs
215         QByteArray permanentId;
216         QByteArray updateId;
217         QVERIFY(doc->getPdfId(&permanentId, &updateId));
218         QCOMPARE(permanentId.toUpper(), referencePermanentId);
219         QCOMPARE(updateId.toUpper(), referenceUpdateId);
220     }
221 }
222 
checkNoPdfId()223 void TestMetaData::checkNoPdfId()
224 {
225     std::unique_ptr<Poppler::Document> doc = Poppler::Document::load(TESTDATADIR "/unittestcases/WithActualText.pdf");
226     QVERIFY(doc);
227 
228     QVERIFY(!doc->getPdfId(nullptr, nullptr));
229 }
230 
231 QTEST_GUILESS_MAIN(TestMetaData)
232 #include "check_metadata.moc"
233