diff options
author | Shawn Rutledge <shawn.rutledge@theqtcompany.com> | 2015-12-01 13:12:14 +0100 |
---|---|---|
committer | Michal Klocek <michal.klocek@qt.io> | 2019-11-25 12:01:39 +0100 |
commit | 7fe31a05db2f807e61c2878a6d5f429f3212b0b7 (patch) | |
tree | dcf2fa1763ed9e6aee07579479aed765f0467d05 | |
parent | 728414509b8f370c2e94baef06c85934d902ee3d (diff) |
Add metaData() accessor method to QPdfDocument
Change-Id: Ib25ae8940ff8a35627093031a82c1f25c7c940fc
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
-rw-r--r-- | src/pdf/qpdfdocument.cpp | 96 | ||||
-rw-r--r-- | src/pdf/qpdfdocument.h | 15 | ||||
-rw-r--r-- | tests/auto/pdf/qpdfdocument/pdf-sample.metadata.pdf | bin | 0 -> 9298 bytes | |||
-rw-r--r-- | tests/auto/pdf/qpdfdocument/tst_qpdfdocument.cpp | 28 |
4 files changed, 138 insertions, 1 deletions
diff --git a/src/pdf/qpdfdocument.cpp b/src/pdf/qpdfdocument.cpp index 119b74bca..e1c9b0fa3 100644 --- a/src/pdf/qpdfdocument.cpp +++ b/src/pdf/qpdfdocument.cpp @@ -20,9 +20,10 @@ ******************************************************************************/ #include "qpdfdocument.h" - #include "qpdfdocument_p.h" +#include "public/fpdf_doc.h" + #include <QFile> #include <QMutex> @@ -302,6 +303,99 @@ QString QPdfDocument::password() const return QString::fromUtf8(d->password); } +/*! + \enum QPdfDocument::MetaDataField + + This enum describes the available fields of meta data. + + \value Title The document's title as QString. + \value Author The name of the person who created the document as QString. + \value Subject The subject of the document as QString. + \value Keywords Keywords associated with the document as QString. + \value Creator If the document was converted to PDF from another format, + the name of the conforming product that created the original document + from which it was converted as QString. + \value Producer If the document was converted to PDF from another format, + the name of the conforming product that converted it to PDF as QString. + \value CreationDate The date and time the document was created as QDateTime. + \value ModificationDate The date and time the document was most recently modified as QDateTime. + + \sa QPdfDocument::metaData() +*/ + +/*! + Returns the meta data of the document for the given field. +*/ +QVariant QPdfDocument::metaData(MetaDataField field) const +{ + const QMutexLocker lock(pdfMutex()); + + if (!d->doc) + return QString(); + + QByteArray fieldName; + switch (field) { + case Title: + fieldName = "Title"; + break; + case Subject: + fieldName = "Subject"; + break; + case Author: + fieldName = "Author"; + break; + case Keywords: + fieldName = "Keywords"; + break; + case Producer: + fieldName = "Producer"; + break; + case Creator: + fieldName = "Creator"; + break; + case CreationDate: + fieldName = "CreationDate"; + break; + case ModificationDate: + fieldName = "ModDate"; + break; + } + + const unsigned long len = FPDF_GetMetaText(d->doc, fieldName.constData(), Q_NULLPTR, 0); + + QVector<ushort> buf(len); + FPDF_GetMetaText(d->doc, fieldName.constData(), buf.data(), buf.length()); + + QString text = QString::fromUtf16(buf.data()); + + switch (field) { + case Title: // fall through + case Subject: + case Author: + case Keywords: + case Producer: + case Creator: + return text; + case CreationDate: // fall through + case ModificationDate: + // convert a "D:YYYYMMDDHHmmSSOHH'mm'" into "YYYY-MM-DDTHH:mm:ss+HH:mm" + if (text.startsWith(QLatin1String("D:"))) + text = text.mid(2); + text.insert(4, QLatin1Char('-')); + text.insert(7, QLatin1Char('-')); + text.insert(10, QLatin1Char('T')); + text.insert(13, QLatin1Char(':')); + text.insert(16, QLatin1Char(':')); + text.replace(QLatin1Char('\''), QLatin1Char(':')); + if (text.endsWith(QLatin1Char(':'))) + text.chop(1); + + return QDateTime::fromString(text, Qt::ISODate); + } + + return QVariant(); +} + QPdfDocument::Error QPdfDocument::error() const { return d->lastError; diff --git a/src/pdf/qpdfdocument.h b/src/pdf/qpdfdocument.h index 1f024b328..68893de05 100644 --- a/src/pdf/qpdfdocument.h +++ b/src/pdf/qpdfdocument.h @@ -49,6 +49,19 @@ public: IncorrectPasswordError, UnsupportedSecuritySchemeError }; + Q_ENUM(Error) + + enum MetaDataField { + Title, + Subject, + Author, + Keywords, + Producer, + Creator, + CreationDate, + ModificationDate + }; + Q_ENUM(MetaDataField) explicit QPdfDocument(QObject *parent = Q_NULLPTR); ~QPdfDocument(); @@ -61,6 +74,8 @@ public: void setPassword(const QString &password); QString password() const; + QVariant metaData(MetaDataField field) const; + Error error() const; void close(); diff --git a/tests/auto/pdf/qpdfdocument/pdf-sample.metadata.pdf b/tests/auto/pdf/qpdfdocument/pdf-sample.metadata.pdf Binary files differnew file mode 100644 index 000000000..c3350ba5f --- /dev/null +++ b/tests/auto/pdf/qpdfdocument/pdf-sample.metadata.pdf diff --git a/tests/auto/pdf/qpdfdocument/tst_qpdfdocument.cpp b/tests/auto/pdf/qpdfdocument/tst_qpdfdocument.cpp index 41b34ff17..b4e989801 100644 --- a/tests/auto/pdf/qpdfdocument/tst_qpdfdocument.cpp +++ b/tests/auto/pdf/qpdfdocument/tst_qpdfdocument.cpp @@ -23,6 +23,7 @@ private slots: void loadAfterClose(); void closeOnDestroy(); void passwordClearedOnClose(); + void metaData(); }; struct TemporaryPdf: public QTemporaryFile @@ -202,6 +203,33 @@ void tst_QPdfDocument::passwordClearedOnClose() QCOMPARE(passwordChangedSpy.count(), 0); } +void tst_QPdfDocument::metaData() +{ + QPdfDocument doc; + + // a closed document does not return any meta data + QCOMPARE(doc.metaData(QPdfDocument::Title).toString(), QString()); + QCOMPARE(doc.metaData(QPdfDocument::Subject).toString(), QString()); + QCOMPARE(doc.metaData(QPdfDocument::Author).toString(), QString()); + QCOMPARE(doc.metaData(QPdfDocument::Keywords).toString(), QString()); + QCOMPARE(doc.metaData(QPdfDocument::Producer).toString(), QString()); + QCOMPARE(doc.metaData(QPdfDocument::Creator).toString(), QString()); + QCOMPARE(doc.metaData(QPdfDocument::CreationDate).toDateTime(), QDateTime()); + QCOMPARE(doc.metaData(QPdfDocument::ModificationDate).toDateTime(), QDateTime()); + + QCOMPARE(doc.load(QFINDTESTDATA("pdf-sample.metadata.pdf")), QPdfDocument::NoError); + + // check for proper meta data from sample document + QCOMPARE(doc.metaData(QPdfDocument::Title).toString(), QString::fromLatin1("Qt PDF Unit Test Document")); + QCOMPARE(doc.metaData(QPdfDocument::Subject).toString(), QString::fromLatin1("A test for meta data access")); + QCOMPARE(doc.metaData(QPdfDocument::Author).toString(), QString::fromLatin1("John Doe")); + QCOMPARE(doc.metaData(QPdfDocument::Keywords).toString(), QString::fromLatin1("meta data keywords")); + QCOMPARE(doc.metaData(QPdfDocument::Producer).toString(), QString::fromLatin1("LibreOffice 5.1")); + QCOMPARE(doc.metaData(QPdfDocument::Creator).toString(), QString::fromLatin1("Writer")); + QCOMPARE(doc.metaData(QPdfDocument::CreationDate).toDateTime(), QDateTime(QDate(2016, 8, 7), QTime(7, 3, 6), Qt::UTC)); + QCOMPARE(doc.metaData(QPdfDocument::ModificationDate).toDateTime(), QDateTime(QDate(2016, 8, 8), QTime(8, 3, 6), Qt::UTC)); +} + QTEST_MAIN(tst_QPdfDocument) #include "tst_qpdfdocument.moc" |