diff options
Diffstat (limited to 'src/gui/painting/qpdf.cpp')
-rw-r--r-- | src/gui/painting/qpdf.cpp | 70 |
1 files changed, 34 insertions, 36 deletions
diff --git a/src/gui/painting/qpdf.cpp b/src/gui/painting/qpdf.cpp index 38f2a9b803..716cf35ee6 100644 --- a/src/gui/painting/qpdf.cpp +++ b/src/gui/painting/qpdf.cpp @@ -20,8 +20,11 @@ #include <qimagewriter.h> #include <qnumeric.h> #include <qtemporaryfile.h> +#include <qtimezone.h> #include <quuid.h> +#include <map> + #ifndef QT_NO_COMPRESS #include <zlib.h> #endif @@ -1035,6 +1038,7 @@ void QPdfEngine::drawTextItem(const QPointF &p, const QTextItem &textItem) *d->currentPage << "Q\n"; } +// Used by QtWebKit void QPdfEngine::drawHyperlink(const QRectF &r, const QUrl &url) { Q_D(QPdfEngine); @@ -1564,7 +1568,7 @@ void QPdfEnginePrivate::writeHeader() int metaDataObj = -1; int outputIntentObj = -1; if (pdfVersion == QPdfEngine::Version_A1b || !xmpDocumentMetadata.isEmpty()) { - metaDataObj = writeXmpDcumentMetaData(); + metaDataObj = writeXmpDocumentMetaData(); } if (pdfVersion == QPdfEngine::Version_A1b) { outputIntentObj = writeOutputIntent(); @@ -1740,11 +1744,12 @@ void QPdfEnginePrivate::writeInfo() xprintf("+%02d'%02d')\n", hours , mins); else xprintf("Z)\n"); + xprintf("/Trapped /False\n"); xprintf(">>\n" "endobj\n"); } -int QPdfEnginePrivate::writeXmpDcumentMetaData() +int QPdfEnginePrivate::writeXmpDocumentMetaData() { const int metaDataObj = addXrefEntry(-1); QByteArray metaDataContent; @@ -1752,26 +1757,12 @@ int QPdfEnginePrivate::writeXmpDcumentMetaData() if (xmpDocumentMetadata.isEmpty()) { const QString producer(QString::fromLatin1("Qt " QT_VERSION_STR)); - const QDateTime now = QDateTime::currentDateTime(); - const QDate date = now.date(); - const QTime time = now.time(); - const QString timeStr = - QString::asprintf("%d-%02d-%02dT%02d:%02d:%02d", - date.year(), date.month(), date.day(), - time.hour(), time.minute(), time.second()); - - const int offset = now.offsetFromUtc(); - const int hours = (offset / 60) / 60; - const int mins = (offset / 60) % 60; - QString tzStr; - if (offset < 0) - tzStr = QString::asprintf("-%02d:%02d", -hours, -mins); - else if (offset > 0) - tzStr = QString::asprintf("+%02d:%02d", hours , mins); - else - tzStr = "Z"_L1; - - const QString metaDataDate = timeStr + tzStr; +#if QT_CONFIG(timezone) + const QDateTime now = QDateTime::currentDateTime(QTimeZone::systemTimeZone()); +#else + const QDateTime now = QDateTime::currentDateTimeUtc(); +#endif + const QString metaDataDate = now.toString(Qt::ISODate); QFile metaDataFile(":/qpdf/qpdfa_metadata.xml"_L1); bool ok = metaDataFile.open(QIODevice::ReadOnly); @@ -1813,7 +1804,8 @@ int QPdfEnginePrivate::writeOutputIntent() s << "/N 3\n"; s << "/Alternate /DeviceRGB\n"; s << "/Length " << length_object << "0 R\n"; - s << "/Filter /FlateDecode\n"; + if (do_compress) + s << "/Filter /FlateDecode\n"; s << ">>\n"; s << "stream\n"; write(data); @@ -1867,7 +1859,7 @@ void QPdfEnginePrivate::writeDestsRoot() if (destCache.isEmpty()) return; - QHash<QString, int> destObjects; + std::map<QString, int> destObjects; QByteArray xs, ys; for (const DestInfo &destInfo : std::as_const(destCache)) { int destObj = addXrefEntry(-1); @@ -1875,21 +1867,19 @@ void QPdfEnginePrivate::writeDestsRoot() ys.setNum(static_cast<double>(destInfo.coords.y()), 'f'); xprintf("[%d 0 R /XYZ %s %s 0]\n", destInfo.pageObj, xs.constData(), ys.constData()); xprintf("endobj\n"); - destObjects.insert(destInfo.anchor, destObj); + destObjects.insert_or_assign(destInfo.anchor, destObj); } // names destsRoot = addXrefEntry(-1); - QStringList anchors = destObjects.keys(); - anchors.sort(); xprintf("<<\n/Limits ["); - printString(anchors.constFirst()); + printString(destObjects.begin()->first); xprintf(" "); - printString(anchors.constLast()); + printString(destObjects.rbegin()->first); xprintf("]\n/Names [\n"); - for (const QString &anchor : std::as_const(anchors)) { + for (const auto &[anchor, destObject] : destObjects) { printString(anchor); - xprintf(" %d 0 R\n", destObjects[anchor]); + xprintf(" %d 0 R\n", destObject); } xprintf("]\n>>\n" "endobj\n"); @@ -1922,7 +1912,8 @@ void QPdfEnginePrivate::writeAttachmentRoot() attachments.push_back(addXrefEntry(-1)); xprintf("<<\n" - "/F (%s)", attachment.fileName.toLatin1().constData()); + "/F "); + printString(attachment.fileName); xprintf("\n/EF <</F %d 0 R>>\n" "/Type/Filespec\n" @@ -2135,17 +2126,24 @@ void QPdfEnginePrivate::writePage() qreal userUnit = calcUserUnit(); addXrefEntry(pages.constLast()); + + // make sure we use the pagesize from when we started the page, since the user may have changed it + const QByteArray formattedPageWidth = QByteArray::number(currentPage->pageSize.width() / userUnit, 'f'); + const QByteArray formattedPageHeight = QByteArray::number(currentPage->pageSize.height() / userUnit, 'f'); + xprintf("<<\n" "/Type /Page\n" "/Parent %d 0 R\n" "/Contents %d 0 R\n" "/Resources %d 0 R\n" "/Annots %d 0 R\n" - "/MediaBox [0 0 %s %s]\n", + "/MediaBox [0 0 %s %s]\n" + "/TrimBox [0 0 %s %s]\n", pageRoot, pageStream, resources, annots, - // make sure we use the pagesize from when we started the page, since the user may have changed it - QByteArray::number(currentPage->pageSize.width() / userUnit, 'f').constData(), - QByteArray::number(currentPage->pageSize.height() / userUnit, 'f').constData()); + formattedPageWidth.constData(), + formattedPageHeight.constData(), + formattedPageWidth.constData(), + formattedPageHeight.constData()); if (pdfVersion >= QPdfEngine::Version_1_6) xprintf("/UserUnit %s\n", QByteArray::number(userUnit, 'f').constData()); |