1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
|
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QApplication>
#include <QCommandLineParser>
#include <QDebug>
#include <QDir>
#include <QEventLoop>
#include <QPrinter>
#include <QWebEngineSettings>
#include <QWebEngineView>
class PrintTester : public QObject
{
Q_OBJECT
public:
explicit PrintTester(const QString &outputDir, const QUrl &url);
int run();
void waitForResult();
private slots:
void loadFinished(bool ok);
void printingFinished(bool success);
void pdfPrintingFinished(const QString &filePath, bool success);
private:
QWebEngineView m_view;
QString m_outputDir;
QUrl m_url;
QEventLoop m_waitForResult;
QPrinter m_printer;
};
PrintTester::PrintTester(const QString &outputDir, const QUrl &url)
: m_outputDir(outputDir), m_url(url)
{
connect(&m_view, &QWebEngineView::loadFinished, this, &PrintTester::loadFinished);
connect(&m_view, &QWebEngineView::pdfPrintingFinished, this, &PrintTester::pdfPrintingFinished);
connect(&m_view, &QWebEngineView::printFinished, this, &PrintTester::printingFinished);
m_view.settings()->setAttribute(QWebEngineSettings::PrintHeaderAndFooter, false);
m_view.settings()->setAttribute(QWebEngineSettings::PreferCSSMarginsForPrinting, false);
}
int PrintTester::run()
{
m_view.load(m_url);
return QApplication::exec();
}
void PrintTester::waitForResult()
{
m_waitForResult.exec();
}
void PrintTester::loadFinished(bool ok)
{
if (!ok) {
qDebug() << "Page load was not successful.";
QApplication::exit();
}
// Expected to be ignored; page sizes are coming from CSS
const std::map<QString, QPageSize::PageSizeId> pageSizes = {
{ "a4", QPageSize::A4 },
{ "a5", QPageSize::A5 },
};
// Expected to be ignored; orientations are coming from CSS
const std::map<QString, QPageLayout::Orientation> orientations = {
{ "portrait", QPageLayout::Portrait },
{ "landscape", QPageLayout::Landscape },
};
// Should be ignored when PreferCSSMarginsForPrinting is enabled
const std::map<QString, QMargins> margins = {
{ "default", QMargins() },
{ "uniform", QMargins(20, 20, 20, 20) },
{ "topbottom", QMargins(5, 30, 5, 30) },
};
for (auto const &[pageSizeName, pageSize] : pageSizes) {
for (auto const &[orientationName, orientation] : orientations) {
for (auto const &[marginName, margin] : margins) {
const QString fileNameSuffix =
pageSizeName + "_" + orientationName + "_" + marginName + "margins.pdf";
QPageLayout layout(QPageSize(pageSize), orientation, margin);
m_view.printToPdf(m_outputDir + "/printToPdf_" + fileNameSuffix, layout);
waitForResult();
m_printer.setOutputFileName(m_outputDir + "/print_" + fileNameSuffix);
m_printer.setPageLayout(layout);
m_view.print(&m_printer);
waitForResult();
}
}
}
QApplication::quit();
}
void PrintTester::printingFinished(bool success)
{
if (!success)
QApplication::quit();
qDebug() << m_printer.outputFileName() << "done";
m_waitForResult.quit();
}
void PrintTester::pdfPrintingFinished(const QString &filePath, bool success)
{
if (!success)
QApplication::quit();
qDebug() << filePath << "done";
m_waitForResult.quit();
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QCoreApplication::setOrganizationName("QtExamples");
QCoreApplication::setApplicationName("printing");
QCommandLineParser parser;
parser.setApplicationDescription(QCoreApplication::translate(
"main", "Runs print() and printToPdf() API with various layouts."));
parser.addHelpOption();
parser.addPositionalArgument(
QCoreApplication::translate("main", "OUTPUT"),
QCoreApplication::translate("main",
"Output directory name for generated PDF files. The "
"directory must already exist."));
parser.addPositionalArgument(
QCoreApplication::translate("main", "INPUT"),
QCoreApplication::translate(
"main", "Input URL for testing. If not set, a sample HTML file will be used."));
parser.process(QCoreApplication::arguments());
const QStringList requiredArguments = parser.positionalArguments();
if (requiredArguments.size() < 1)
parser.showHelp(1);
if (!QDir(requiredArguments.at(0)).exists()) {
qWarning("Output directory does not exist.");
return 1;
}
PrintTester tester(requiredArguments.at(0),
requiredArguments.size() == 1
? QUrl("qrc:/printing_example.html")
: QUrl::fromUserInput(requiredArguments.at(1)));
return tester.run();
}
#include "main.moc"
|