summaryrefslogtreecommitdiffstats
path: root/src/core/print_view_manager_qt.cpp
diff options
context:
space:
mode:
authorMichael Bruning <michael.bruning@qt.io>2016-08-10 17:22:05 +0200
committerMichal Klocek <michal.klocek@qt.io>2016-08-24 16:19:28 +0000
commitaf2535018b1553e351198f3d9c21538de1c328a1 (patch)
treedc66a94a925477f60aa155b0ba979fadfc560a80 /src/core/print_view_manager_qt.cpp
parenteeac120ec135e2ab0bd02f399afb50b684d00298 (diff)
Add widgets API for printing on a QPrinter
Renders the content to a PDF document and then renders this on a QPrinter-backed QPainter using the PDFium library. PDFium bitmap to QImage conversion based on work by Paulo Pinheiro <paulvap.os@gmail.com>. [ChangeLog][QtWebEngineWidgets][Printing] Enables printing QWebPage content on a QPrinter. Currently does not support previewing the document. Widgets only for the moment. Change-Id: I9a5264433093379aee90f5e4f69bf2aee8814f2b Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'src/core/print_view_manager_qt.cpp')
-rw-r--r--src/core/print_view_manager_qt.cpp89
1 files changed, 53 insertions, 36 deletions
diff --git a/src/core/print_view_manager_qt.cpp b/src/core/print_view_manager_qt.cpp
index 4cb0e06eb..bb01f531c 100644
--- a/src/core/print_view_manager_qt.cpp
+++ b/src/core/print_view_manager_qt.cpp
@@ -43,8 +43,8 @@
#include "type_conversion.h"
#include "web_engine_context.h"
-#include <QtGui/QPageLayout>
-#include <QtGui/QPageSize>
+#include <QtGui/qpagelayout.h>
+#include <QtGui/qpagesize.h>
#include "base/values.h"
#include "chrome/browser/printing/print_job_manager.h"
@@ -101,43 +101,58 @@ static void SavePdfFile(scoped_refptr<base::RefCountedBytes> data,
metafile.SaveTo(&file);
}
-static void applyQPageLayoutSettingsToDictionary(const QPageLayout& pageLayout, base::DictionaryValue& print_settings)
+static base::DictionaryValue *createPrintSettings()
{
+ base::DictionaryValue *printSettings = new base::DictionaryValue();
// TO DO: Check if we can use the request ID from Qt here somehow.
static int internalRequestId = 0;
- print_settings.SetBoolean(printing::kIsFirstRequest, internalRequestId++ == 0);
- print_settings.SetInteger(printing::kPreviewRequestID, internalRequestId);
+ printSettings->SetBoolean(printing::kIsFirstRequest, internalRequestId++ == 0);
+ printSettings->SetInteger(printing::kPreviewRequestID, internalRequestId);
+
+ // The following are standard settings that Chromium expects to be set.
+ printSettings->SetBoolean(printing::kSettingPrintToPDF, true);
+ printSettings->SetBoolean(printing::kSettingCloudPrintDialog, false);
+ printSettings->SetBoolean(printing::kSettingPrintWithPrivet, false);
+ printSettings->SetBoolean(printing::kSettingPrintWithExtension, false);
+
+ printSettings->SetBoolean(printing::kSettingGenerateDraftData, false);
+ printSettings->SetBoolean(printing::kSettingPreviewModifiable, false);
+ printSettings->SetInteger(printing::kSettingDuplexMode, printing::SIMPLEX);
+ printSettings->SetInteger(printing::kSettingCopies, 1);
+ printSettings->SetBoolean(printing::kSettingCollate, false);
+ printSettings->SetBoolean(printing::kSettingGenerateDraftData, false);
+ printSettings->SetBoolean(printing::kSettingPreviewModifiable, false);
+
+ printSettings->SetBoolean(printing::kSettingShouldPrintSelectionOnly, false);
+ printSettings->SetBoolean(printing::kSettingShouldPrintBackgrounds, false);
+ printSettings->SetBoolean(printing::kSettingHeaderFooterEnabled, false);
+ printSettings->SetString(printing::kSettingDeviceName, "");
+ printSettings->SetInteger(printing::kPreviewUIID, 12345678);
+
+ return printSettings;
+}
+
+static void applyQPageLayoutSettingsToDictionary(const QPageLayout &pageLayout, base::DictionaryValue &printSettings)
+{
//Set page size attributes, chromium expects these in micrometers
QSizeF pageSizeInMilimeter = pageLayout.pageSize().size(QPageSize::Millimeter);
scoped_ptr<base::DictionaryValue> sizeDict(new base::DictionaryValue);
sizeDict->SetInteger(printing::kSettingMediaSizeWidthMicrons, pageSizeInMilimeter.width() * kMicronsToMillimeter);
sizeDict->SetInteger(printing::kSettingMediaSizeHeightMicrons, pageSizeInMilimeter.height() * kMicronsToMillimeter);
- print_settings.Set(printing::kSettingMediaSize, std::move(sizeDict));
-
- print_settings.SetBoolean(printing::kSettingLandscape, pageLayout.orientation() == QPageLayout::Landscape);
-
- // The following are standard settings that Chromium expects to be set.
- print_settings.SetBoolean(printing::kSettingPrintToPDF, true);
- print_settings.SetBoolean(printing::kSettingCloudPrintDialog, false);
- print_settings.SetBoolean(printing::kSettingPrintWithPrivet, false);
- print_settings.SetBoolean(printing::kSettingPrintWithExtension, false);
-
- print_settings.SetBoolean(printing::kSettingGenerateDraftData, false);
- print_settings.SetBoolean(printing::kSettingPreviewModifiable, false);
- print_settings.SetInteger(printing::kSettingColor, printing::COLOR);
- print_settings.SetInteger(printing::kSettingDuplexMode, printing::SIMPLEX);
- print_settings.SetInteger(printing::kSettingDuplexMode, printing::UNKNOWN_DUPLEX_MODE);
- print_settings.SetInteger(printing::kSettingCopies, 1);
- print_settings.SetBoolean(printing::kSettingCollate, false);
- print_settings.SetBoolean(printing::kSettingGenerateDraftData, false);
- print_settings.SetBoolean(printing::kSettingPreviewModifiable, false);
-
- print_settings.SetBoolean(printing::kSettingShouldPrintSelectionOnly, false);
- print_settings.SetBoolean(printing::kSettingShouldPrintBackgrounds, false);
- print_settings.SetBoolean(printing::kSettingHeaderFooterEnabled, false);
- print_settings.SetString(printing::kSettingDeviceName, "");
- print_settings.SetInteger(printing::kPreviewUIID, 12345678);
+ printSettings.Set(printing::kSettingMediaSize, std::move(sizeDict));
+
+ // Apply page margins
+ QMargins pageMarginsInPoints = pageLayout.marginsPoints();
+ scoped_ptr<base::DictionaryValue> marginsDict(new base::DictionaryValue);
+ marginsDict->SetInteger(printing::kSettingMarginTop, pageMarginsInPoints.top());
+ marginsDict->SetInteger(printing::kSettingMarginBottom, pageMarginsInPoints.bottom());
+ marginsDict->SetInteger(printing::kSettingMarginLeft, pageMarginsInPoints.left());
+ marginsDict->SetInteger(printing::kSettingMarginRight, pageMarginsInPoints.right());
+ printSettings.Set(printing::kSettingMarginsCustom, std::move(marginsDict));
+ printSettings.SetInteger(printing::kSettingMarginsType, printing::CUSTOM_MARGINS);
+
+ printSettings.SetBoolean(printing::kSettingLandscape, pageLayout.orientation() == QPageLayout::Landscape);
}
} // namespace
@@ -149,20 +164,20 @@ PrintViewManagerQt::~PrintViewManagerQt()
}
#if defined(ENABLE_BASIC_PRINTING)
-bool PrintViewManagerQt::PrintToPDF(const QPageLayout &pageLayout, const QString &filePath)
+bool PrintViewManagerQt::PrintToPDF(const QPageLayout &pageLayout, bool printInColor, const QString &filePath)
{
if (m_printSettings || !filePath.length())
return false;
m_pdfOutputPath = toFilePath(filePath);
- if (!PrintToPDFInternal(pageLayout)) {
+ if (!PrintToPDFInternal(pageLayout, printInColor)) {
resetPdfState();
return false;
}
return true;
}
-bool PrintViewManagerQt::PrintToPDFWithCallback(const QPageLayout &pageLayout, const PrintToPDFCallback& callback)
+bool PrintViewManagerQt::PrintToPDFWithCallback(const QPageLayout &pageLayout, bool printInColor, const PrintToPDFCallback& callback)
{
if (callback.is_null())
return false;
@@ -176,7 +191,7 @@ bool PrintViewManagerQt::PrintToPDFWithCallback(const QPageLayout &pageLayout, c
}
m_pdfPrintCallback = callback;
- if (!PrintToPDFInternal(pageLayout)) {
+ if (!PrintToPDFInternal(pageLayout, printInColor)) {
content::BrowserThread::PostTask(content::BrowserThread::UI,
FROM_HERE,
base::Bind(callback, std::vector<char>()));
@@ -187,11 +202,13 @@ bool PrintViewManagerQt::PrintToPDFWithCallback(const QPageLayout &pageLayout, c
return true;
}
-bool PrintViewManagerQt::PrintToPDFInternal(const QPageLayout &pageLayout)
+bool PrintViewManagerQt::PrintToPDFInternal(const QPageLayout &pageLayout, bool printInColor)
{
if (!pageLayout.isValid())
return false;
- m_printSettings.reset(new base::DictionaryValue());
+ m_printSettings.reset(createPrintSettings());
+
+ m_printSettings->SetInteger(printing::kSettingColor, printInColor ? printing::COLOR : printing::GRAYSCALE);
applyQPageLayoutSettingsToDictionary(pageLayout, *m_printSettings);
return Send(new PrintMsg_InitiatePrintPreview(routing_id(), false));
}