summaryrefslogtreecommitdiffstats
path: root/src/core/printing/printer_worker.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/printing/printer_worker.cpp')
-rw-r--r--src/core/printing/printer_worker.cpp87
1 files changed, 87 insertions, 0 deletions
diff --git a/src/core/printing/printer_worker.cpp b/src/core/printing/printer_worker.cpp
new file mode 100644
index 000000000..6032f2211
--- /dev/null
+++ b/src/core/printing/printer_worker.cpp
@@ -0,0 +1,87 @@
+// Copyright (C) 2018 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "printer_worker.h"
+
+#include "printing/pdfium_document_wrapper_qt.h"
+
+#include <QPainter>
+#include <QPagedPaintDevice>
+
+namespace QtWebEngineCore {
+
+PrinterWorker::PrinterWorker(QSharedPointer<QByteArray> data, QPagedPaintDevice *device)
+ : m_data(data), m_device(device)
+{
+}
+
+PrinterWorker::~PrinterWorker() { }
+
+void PrinterWorker::print()
+{
+ if (!m_data->size()) {
+ qWarning("Failed to print: Print result data is empty.");
+ Q_EMIT resultReady(false);
+ return;
+ }
+
+ PdfiumDocumentWrapperQt pdfiumWrapper(m_data->constData(), m_data->size());
+
+ const int fromPage = m_firstPageFirst ? 0 : pdfiumWrapper.pageCount() - 1;
+ const int toPage = m_firstPageFirst ? pdfiumWrapper.pageCount() : -1;
+
+ int pageCopies = 1;
+ if (m_collateCopies) {
+ pageCopies = m_documentCopies;
+ m_documentCopies = 1;
+ }
+
+ qreal resolution = m_deviceResolution / 72.0; // pdfium uses points so 1/72 inch
+
+ QPainter painter;
+
+ for (int printedDocuments = 0; printedDocuments < m_documentCopies; printedDocuments++) {
+ if (printedDocuments > 0)
+ m_device->newPage();
+
+ for (int i = fromPage; i != toPage; m_firstPageFirst ? i++ : i--) {
+ QSizeF documentSize = (pdfiumWrapper.pageSize(i) * resolution);
+ bool isLandscape = documentSize.width() > documentSize.height();
+ m_device->setPageOrientation(isLandscape ? QPageLayout::Landscape
+ : QPageLayout::Portrait);
+ QRectF paintRect = m_device->pageLayout().paintRectPixels(m_deviceResolution);
+ documentSize = documentSize.scaled(paintRect.size(), Qt::KeepAspectRatio);
+
+ // setPageOrientation has to be called before qpainter.begin() or before
+ // qprinter.newPage() so correct metrics is used, therefore call begin now for only
+ // first page
+ if (!painter.isActive() && !painter.begin(m_device)) {
+ qWarning("Failure to print on device: Could not open printer for painting.");
+ Q_EMIT resultReady(false);
+ return;
+ }
+
+ if (i != fromPage)
+ m_device->newPage();
+
+ for (int printedPages = 0; printedPages < pageCopies; printedPages++) {
+ if (printedPages > 0)
+ m_device->newPage();
+
+ QImage currentImage =
+ pdfiumWrapper.pageAsQImage(i, documentSize.width(), documentSize.height());
+ if (currentImage.isNull()) {
+ Q_EMIT resultReady(false);
+ return;
+ }
+ painter.drawImage(0, 0, currentImage);
+ }
+ }
+ }
+ painter.end();
+
+ Q_EMIT resultReady(true);
+ return;
+}
+
+} // namespace QtWebEngineCore