Corrected the web browser printing code. eric7

Thu, 12 Oct 2023 17:05:08 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Thu, 12 Oct 2023 17:05:08 +0200
branch
eric7
changeset 10240
cbd566d49a88
parent 10239
63fe209a1e71
child 10241
d52fb33b72e9

Corrected the web browser printing code.

src/eric7/APIs/Python3/eric7.api file | annotate | diff | comparison | revisions
src/eric7/Documentation/Help/source.qch file | annotate | diff | comparison | revisions
src/eric7/Documentation/Help/source.qhp file | annotate | diff | comparison | revisions
src/eric7/Documentation/Source/eric7.WebBrowser.Tools.PrintToPdfDialog.html file | annotate | diff | comparison | revisions
src/eric7/Documentation/Source/eric7.WebBrowser.WebBrowserPage.html file | annotate | diff | comparison | revisions
src/eric7/Documentation/Source/eric7.WebBrowser.WebBrowserTabWidget.html file | annotate | diff | comparison | revisions
src/eric7/Documentation/Source/eric7.WebBrowser.WebBrowserView.html file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Tools/PrintToPdfDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/WebBrowserPage.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/WebBrowserTabWidget.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/WebBrowserView.py file | annotate | diff | comparison | revisions
--- a/src/eric7/APIs/Python3/eric7.api	Thu Oct 12 17:03:41 2023 +0200
+++ b/src/eric7/APIs/Python3/eric7.api	Thu Oct 12 17:05:08 2023 +0200
@@ -12672,7 +12672,7 @@
 eric7.WebBrowser.Tools.DelayedFileWatcher.DelayedFileWatcher?1(paths=None, parent=None)
 eric7.WebBrowser.Tools.PrintToPdfDialog.PrintToPdfDialog.getData?4()
 eric7.WebBrowser.Tools.PrintToPdfDialog.PrintToPdfDialog.on_pageLayoutButton_clicked?4()
-eric7.WebBrowser.Tools.PrintToPdfDialog.PrintToPdfDialog?1(filePath, parent=None)
+eric7.WebBrowser.Tools.PrintToPdfDialog.PrintToPdfDialog?1(printer, parent=None)
 eric7.WebBrowser.Tools.Scripts.completeFormData?4(data)
 eric7.WebBrowser.Tools.Scripts.getAllImages?4()
 eric7.WebBrowser.Tools.Scripts.getAllMetaAttributes?4()
@@ -12849,7 +12849,6 @@
 eric7.WebBrowser.WebBrowserPage.WebBrowserPage.certificateError?4(error)
 eric7.WebBrowser.WebBrowserPage.WebBrowserPage.clearSslConfiguration?4()
 eric7.WebBrowser.WebBrowserPage.WebBrowserPage.execJavaScript?4(script, worldId=QWebEngineScript.ScriptWorldId.MainWorld, timeout=500)
-eric7.WebBrowser.WebBrowserPage.WebBrowserPage.execPrintPage?4(printer, timeout=1000)
 eric7.WebBrowser.WebBrowserPage.WebBrowserPage.getSafeBrowsingStatus?4()
 eric7.WebBrowser.WebBrowserPage.WebBrowserPage.getSslCertificate?4()
 eric7.WebBrowser.WebBrowserPage.WebBrowserPage.getSslCertificateChain?4()
@@ -12860,7 +12859,6 @@
 eric7.WebBrowser.WebBrowserPage.WebBrowserPage.javaScriptConsoleMessage?4(level, message, lineNumber, sourceId)
 eric7.WebBrowser.WebBrowserPage.WebBrowserPage.mapToViewport?4(pos)
 eric7.WebBrowser.WebBrowserPage.WebBrowserPage.navigationRequestAccepted?7
-eric7.WebBrowser.WebBrowserPage.WebBrowserPage.printCallback?4(resDict=resultDict)
 eric7.WebBrowser.WebBrowserPage.WebBrowserPage.printPageRequested?7
 eric7.WebBrowser.WebBrowserPage.WebBrowserPage.resultCallback?4(resDict=resultDict)
 eric7.WebBrowser.WebBrowserPage.WebBrowserPage.runJavaScript?4(script, worldId=-1, callback=None)
@@ -12930,7 +12928,6 @@
 eric7.WebBrowser.WebBrowserTabWidget.WebBrowserTabWidget.titleChanged?7
 eric7.WebBrowser.WebBrowserTabWidget.WebBrowserTabWidget.urlBarForView?4(view)
 eric7.WebBrowser.WebBrowserTabWidget.WebBrowserTabWidget?1(parent)
-eric7.WebBrowser.WebBrowserTabWidget.isCupsAvailable?4()
 eric7.WebBrowser.WebBrowserView.WebBrowserView.ZoomLevelDefault?7
 eric7.WebBrowser.WebBrowserView.WebBrowserView.ZoomLevels?7
 eric7.WebBrowser.WebBrowserView.WebBrowserView._gestureEvent?5(evt)
@@ -12981,6 +12978,9 @@
 eric7.WebBrowser.WebBrowserView.WebBrowserView.mapToViewport?4(pos)
 eric7.WebBrowser.WebBrowserView.WebBrowserView.paste?4()
 eric7.WebBrowser.WebBrowserView.WebBrowserView.preferencesChanged?4()
+eric7.WebBrowser.WebBrowserView.WebBrowserView.printPage?4()
+eric7.WebBrowser.WebBrowserView.WebBrowserView.printPageToPdf?4()
+eric7.WebBrowser.WebBrowserView.WebBrowserView.printPreviewPage?4()
 eric7.WebBrowser.WebBrowserView.WebBrowserView.progress?4()
 eric7.WebBrowser.WebBrowserView.WebBrowserView.redo?4()
 eric7.WebBrowser.WebBrowserView.WebBrowserView.reload?4()
@@ -13008,6 +13008,7 @@
 eric7.WebBrowser.WebBrowserView.WebBrowserView.zoomValue?4()
 eric7.WebBrowser.WebBrowserView.WebBrowserView.zoomValueChanged?7
 eric7.WebBrowser.WebBrowserView.WebBrowserView?1(mainWindow, parent=None, name="")
+eric7.WebBrowser.WebBrowserView.isCupsAvailable?4()
 eric7.WebBrowser.WebBrowserWebSearchWidget.WebBrowserWebSearchWidget.clear?4()
 eric7.WebBrowser.WebBrowserWebSearchWidget.WebBrowserWebSearchWidget.mousePressEvent?4(evt)
 eric7.WebBrowser.WebBrowserWebSearchWidget.WebBrowserWebSearchWidget.openSearchManager?4()
Binary file src/eric7/Documentation/Help/source.qch has changed
--- a/src/eric7/Documentation/Help/source.qhp	Thu Oct 12 17:03:41 2023 +0200
+++ b/src/eric7/Documentation/Help/source.qhp	Thu Oct 12 17:05:08 2023 +0200
@@ -18594,7 +18594,6 @@
       <keyword name="WebBrowserPage.certificateError" id="WebBrowserPage.certificateError" ref="eric7.WebBrowser.WebBrowserPage.html#WebBrowserPage.certificateError" />
       <keyword name="WebBrowserPage.clearSslConfiguration" id="WebBrowserPage.clearSslConfiguration" ref="eric7.WebBrowser.WebBrowserPage.html#WebBrowserPage.clearSslConfiguration" />
       <keyword name="WebBrowserPage.execJavaScript" id="WebBrowserPage.execJavaScript" ref="eric7.WebBrowser.WebBrowserPage.html#WebBrowserPage.execJavaScript" />
-      <keyword name="WebBrowserPage.execPrintPage" id="WebBrowserPage.execPrintPage" ref="eric7.WebBrowser.WebBrowserPage.html#WebBrowserPage.execPrintPage" />
       <keyword name="WebBrowserPage.getSafeBrowsingStatus" id="WebBrowserPage.getSafeBrowsingStatus" ref="eric7.WebBrowser.WebBrowserPage.html#WebBrowserPage.getSafeBrowsingStatus" />
       <keyword name="WebBrowserPage.getSslCertificate" id="WebBrowserPage.getSslCertificate" ref="eric7.WebBrowser.WebBrowserPage.html#WebBrowserPage.getSslCertificate" />
       <keyword name="WebBrowserPage.getSslCertificateChain" id="WebBrowserPage.getSslCertificateChain" ref="eric7.WebBrowser.WebBrowserPage.html#WebBrowserPage.getSslCertificateChain" />
@@ -18609,7 +18608,6 @@
       <keyword name="WebBrowserPage.on_setCurrentPageButton_clicked" id="WebBrowserPage.on_setCurrentPageButton_clicked" ref="eric7.Preferences.ConfigurationPages.WebBrowserPage.html#WebBrowserPage.on_setCurrentPageButton_clicked" />
       <keyword name="WebBrowserPage.on_setSpeedDialPageButton_clicked" id="WebBrowserPage.on_setSpeedDialPageButton_clicked" ref="eric7.Preferences.ConfigurationPages.WebBrowserPage.html#WebBrowserPage.on_setSpeedDialPageButton_clicked" />
       <keyword name="WebBrowserPage.on_startupCombo_currentIndexChanged" id="WebBrowserPage.on_startupCombo_currentIndexChanged" ref="eric7.Preferences.ConfigurationPages.WebBrowserPage.html#WebBrowserPage.on_startupCombo_currentIndexChanged" />
-      <keyword name="WebBrowserPage.printCallback" id="WebBrowserPage.printCallback" ref="eric7.WebBrowser.WebBrowserPage.html#WebBrowserPage.printCallback" />
       <keyword name="WebBrowserPage.resultCallback" id="WebBrowserPage.resultCallback" ref="eric7.WebBrowser.WebBrowserPage.html#WebBrowserPage.resultCallback" />
       <keyword name="WebBrowserPage.runJavaScript" id="WebBrowserPage.runJavaScript" ref="eric7.WebBrowser.WebBrowserPage.html#WebBrowserPage.runJavaScript" />
       <keyword name="WebBrowserPage.save" id="WebBrowserPage.save" ref="eric7.Preferences.ConfigurationPages.WebBrowserPage.html#WebBrowserPage.save" />
@@ -18671,8 +18669,6 @@
       <keyword name="WebBrowserTabWidget.__navigationMenuTriggered" id="WebBrowserTabWidget.__navigationMenuTriggered" ref="eric7.WebBrowser.WebBrowserTabWidget.html#WebBrowserTabWidget.__navigationMenuTriggered" />
       <keyword name="WebBrowserTabWidget.__newBrowser" id="WebBrowserTabWidget.__newBrowser" ref="eric7.WebBrowser.WebBrowserTabWidget.html#WebBrowserTabWidget.__newBrowser" />
       <keyword name="WebBrowserTabWidget.__pathSelected" id="WebBrowserTabWidget.__pathSelected" ref="eric7.WebBrowser.WebBrowserTabWidget.html#WebBrowserTabWidget.__pathSelected" />
-      <keyword name="WebBrowserTabWidget.__pdfGeneratedForSave" id="WebBrowserTabWidget.__pdfGeneratedForSave" ref="eric7.WebBrowser.WebBrowserTabWidget.html#WebBrowserTabWidget.__pdfGeneratedForSave" />
-      <keyword name="WebBrowserTabWidget.__printPreviewRequested" id="WebBrowserTabWidget.__printPreviewRequested" ref="eric7.WebBrowser.WebBrowserTabWidget.html#WebBrowserTabWidget.__printPreviewRequested" />
       <keyword name="WebBrowserTabWidget.__recentlyAudibleChanged" id="WebBrowserTabWidget.__recentlyAudibleChanged" ref="eric7.WebBrowser.WebBrowserTabWidget.html#WebBrowserTabWidget.__recentlyAudibleChanged" />
       <keyword name="WebBrowserTabWidget.__showContextMenu" id="WebBrowserTabWidget.__showContextMenu" ref="eric7.WebBrowser.WebBrowserTabWidget.html#WebBrowserTabWidget.__showContextMenu" />
       <keyword name="WebBrowserTabWidget.__showNavigationMenu" id="WebBrowserTabWidget.__showNavigationMenu" ref="eric7.WebBrowser.WebBrowserTabWidget.html#WebBrowserTabWidget.__showNavigationMenu" />
@@ -18756,7 +18752,9 @@
       <keyword name="WebBrowserView.__openLinkInNewTab" id="WebBrowserView.__openLinkInNewTab" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.__openLinkInNewTab" />
       <keyword name="WebBrowserView.__openLinkInNewWindow" id="WebBrowserView.__openLinkInNewWindow" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.__openLinkInNewWindow" />
       <keyword name="WebBrowserView.__pauseMedia" id="WebBrowserView.__pauseMedia" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.__pauseMedia" />
-      <keyword name="WebBrowserView.__printPage" id="WebBrowserView.__printPage" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.__printPage" />
+      <keyword name="WebBrowserView.__printPageFinished" id="WebBrowserView.__printPageFinished" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.__printPageFinished" />
+      <keyword name="WebBrowserView.__printPageToPdfFinished" id="WebBrowserView.__printPageToPdfFinished" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.__printPageToPdfFinished" />
+      <keyword name="WebBrowserView.__printPreviewRequested" id="WebBrowserView.__printPreviewRequested" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.__printPreviewRequested" />
       <keyword name="WebBrowserView.__quotaRequested" id="WebBrowserView.__quotaRequested" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.__quotaRequested" />
       <keyword name="WebBrowserView.__reloadAllSpeedDials" id="WebBrowserView.__reloadAllSpeedDials" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.__reloadAllSpeedDials" />
       <keyword name="WebBrowserView.__renderPreview" id="WebBrowserView.__renderPreview" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.__renderPreview" />
@@ -18769,6 +18767,7 @@
       <keyword name="WebBrowserView.__selectClientCertificate" id="WebBrowserView.__selectClientCertificate" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.__selectClientCertificate" />
       <keyword name="WebBrowserView.__sendLink" id="WebBrowserView.__sendLink" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.__sendLink" />
       <keyword name="WebBrowserView.__setRwhvqt" id="WebBrowserView.__setRwhvqt" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.__setRwhvqt" />
+      <keyword name="WebBrowserView.__setupPrinter" id="WebBrowserView.__setupPrinter" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.__setupPrinter" />
       <keyword name="WebBrowserView.__showContextMenu" id="WebBrowserView.__showContextMenu" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.__showContextMenu" />
       <keyword name="WebBrowserView.__showEventSlot" id="WebBrowserView.__showEventSlot" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.__showEventSlot" />
       <keyword name="WebBrowserView.__showTabCrashPage" id="WebBrowserView.__showTabCrashPage" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.__showTabCrashPage" />
@@ -18819,6 +18818,9 @@
       <keyword name="WebBrowserView.mapToViewport" id="WebBrowserView.mapToViewport" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.mapToViewport" />
       <keyword name="WebBrowserView.paste" id="WebBrowserView.paste" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.paste" />
       <keyword name="WebBrowserView.preferencesChanged" id="WebBrowserView.preferencesChanged" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.preferencesChanged" />
+      <keyword name="WebBrowserView.printPage" id="WebBrowserView.printPage" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.printPage" />
+      <keyword name="WebBrowserView.printPageToPdf" id="WebBrowserView.printPageToPdf" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.printPageToPdf" />
+      <keyword name="WebBrowserView.printPreviewPage" id="WebBrowserView.printPreviewPage" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.printPreviewPage" />
       <keyword name="WebBrowserView.progress" id="WebBrowserView.progress" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.progress" />
       <keyword name="WebBrowserView.redo" id="WebBrowserView.redo" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.redo" />
       <keyword name="WebBrowserView.reload" id="WebBrowserView.reload" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.reload" />
@@ -20151,7 +20153,7 @@
       <keyword name="isClientSecretFileAvailable" id="isClientSecretFileAvailable" ref="eric7.EricNetwork.EricGoogleMailHelpers.html#isClientSecretFileAvailable" />
       <keyword name="isCondaAvailable" id="isCondaAvailable" ref="eric7.CondaInterface.__init__.html#isCondaAvailable" />
       <keyword name="isConfigured" id="isConfigured" ref="eric7.Preferences.__init__.html#isConfigured" />
-      <keyword name="isCupsAvailable" id="isCupsAvailable" ref="eric7.WebBrowser.WebBrowserTabWidget.html#isCupsAvailable" />
+      <keyword name="isCupsAvailable" id="isCupsAvailable" ref="eric7.WebBrowser.WebBrowserView.html#isCupsAvailable" />
       <keyword name="isDrive" id="isDrive" ref="eric7.SystemUtilities.FileSystemUtilities.html#isDrive" />
       <keyword name="isEllipsis" id="isEllipsis" ref="eric7.Plugins.CheckerPlugins.CodeStyleChecker.AstUtilities.html#isEllipsis" />
       <keyword name="isExecutable" id="isExecutable" ref="eric7.DebugClients.Python.DebugUtilities.html#isExecutable" />
--- a/src/eric7/Documentation/Source/eric7.WebBrowser.Tools.PrintToPdfDialog.html	Thu Oct 12 17:03:41 2023 +0200
+++ b/src/eric7/Documentation/Source/eric7.WebBrowser.Tools.PrintToPdfDialog.html	Thu Oct 12 17:05:08 2023 +0200
@@ -80,16 +80,16 @@
 
 <a NAME="PrintToPdfDialog.__init__" ID="PrintToPdfDialog.__init__"></a>
 <h4>PrintToPdfDialog (Constructor)</h4>
-<b>PrintToPdfDialog</b>(<i>filePath, parent=None</i>)
+<b>PrintToPdfDialog</b>(<i>printer, parent=None</i>)
 
 <p>
         Constructor
 </p>
 <dl>
 
-<dt><i>filePath</i> (str)</dt>
+<dt><i>printer</i> (QPrinter)</dt>
 <dd>
-path of the file to write into
+reference to an initialized QPrinter object
 </dd>
 <dt><i>parent</i> (QWidget)</dt>
 <dd>
--- a/src/eric7/Documentation/Source/eric7.WebBrowser.WebBrowserPage.html	Thu Oct 12 17:03:41 2023 +0200
+++ b/src/eric7/Documentation/Source/eric7.WebBrowser.WebBrowserPage.html	Thu Oct 12 17:05:08 2023 +0200
@@ -144,10 +144,6 @@
 <td>Public method to execute a JavaScript function synchroneously.</td>
 </tr>
 <tr>
-<td><a href="#WebBrowserPage.execPrintPage">execPrintPage</a></td>
-<td>Public method to execute a synchronous print.</td>
-</tr>
-<tr>
 <td><a href="#WebBrowserPage.getSafeBrowsingStatus">getSafeBrowsingStatus</a></td>
 <td>Public method to get the safe browsing status of the current page.</td>
 </tr>
@@ -184,10 +180,6 @@
 <td>Public method to map a position to the viewport.</td>
 </tr>
 <tr>
-<td><a href="#WebBrowserPage.printCallback">printCallback</a></td>
-<td></td>
-</tr>
-<tr>
 <td><a href="#WebBrowserPage.resultCallback">resultCallback</a></td>
 <td></td>
 </tr>
@@ -483,36 +475,6 @@
 depending upon script result
 </dd>
 </dl>
-<a NAME="WebBrowserPage.execPrintPage" ID="WebBrowserPage.execPrintPage"></a>
-<h4>WebBrowserPage.execPrintPage</h4>
-<b>execPrintPage</b>(<i>printer, timeout=1000</i>)
-
-<p>
-        Public method to execute a synchronous print.
-</p>
-<dl>
-
-<dt><i>printer</i> (QPrinter)</dt>
-<dd>
-reference to the printer object
-</dd>
-<dt><i>timeout</i> (int)</dt>
-<dd>
-timeout value in milliseconds
-</dd>
-</dl>
-<dl>
-<dt>Return:</dt>
-<dd>
-flag indicating a successful print job
-</dd>
-</dl>
-<dl>
-<dt>Return Type:</dt>
-<dd>
-bool
-</dd>
-</dl>
 <a NAME="WebBrowserPage.getSafeBrowsingStatus" ID="WebBrowserPage.getSafeBrowsingStatus"></a>
 <h4>WebBrowserPage.getSafeBrowsingStatus</h4>
 <b>getSafeBrowsingStatus</b>(<i></i>)
@@ -705,10 +667,6 @@
 QPoint
 </dd>
 </dl>
-<a NAME="WebBrowserPage.printCallback" ID="WebBrowserPage.printCallback"></a>
-<h4>WebBrowserPage.printCallback</h4>
-<b>printCallback</b>(<i>resDict=resultDict</i>)
-
 <a NAME="WebBrowserPage.resultCallback" ID="WebBrowserPage.resultCallback"></a>
 <h4>WebBrowserPage.resultCallback</h4>
 <b>resultCallback</b>(<i>resDict=resultDict</i>)
--- a/src/eric7/Documentation/Source/eric7.WebBrowser.WebBrowserTabWidget.html	Thu Oct 12 17:03:41 2023 +0200
+++ b/src/eric7/Documentation/Source/eric7.WebBrowser.WebBrowserTabWidget.html	Thu Oct 12 17:05:08 2023 +0200
@@ -28,11 +28,7 @@
 <h3>Functions</h3>
 
 <table>
-
-<tr>
-<td><a href="#isCupsAvailable">isCupsAvailable</a></td>
-<td>Static method to test the availability of CUPS.</td>
-</tr>
+<tr><td>None</td></tr>
 </table>
 <hr />
 <hr />
@@ -152,14 +148,6 @@
 <td>Private slot called when a URL is selected from the completer.</td>
 </tr>
 <tr>
-<td><a href="#WebBrowserTabWidget.__pdfGeneratedForSave">__pdfGeneratedForSave</a></td>
-<td>Private slot to save the generated PDF data to a file.</td>
-</tr>
-<tr>
-<td><a href="#WebBrowserTabWidget.__printPreviewRequested">__printPreviewRequested</a></td>
-<td>Private slot to generate the print preview.</td>
-</tr>
-<tr>
 <td><a href="#WebBrowserTabWidget.__recentlyAudibleChanged">__recentlyAudibleChanged</a></td>
 <td>Private slot to react on the audible state of a page.</td>
 </tr>
@@ -523,42 +511,6 @@
 path to be shown (string)
 </dd>
 </dl>
-<a NAME="WebBrowserTabWidget.__pdfGeneratedForSave" ID="WebBrowserTabWidget.__pdfGeneratedForSave"></a>
-<h4>WebBrowserTabWidget.__pdfGeneratedForSave</h4>
-<b>__pdfGeneratedForSave</b>(<i>filePath, pdfData</i>)
-
-<p>
-        Private slot to save the generated PDF data to a file.
-</p>
-<dl>
-
-<dt><i>filePath</i> (str)</dt>
-<dd>
-path to save the PDF to
-</dd>
-<dt><i>pdfData</i> (QByteArray)</dt>
-<dd>
-generated PDF document
-</dd>
-</dl>
-<a NAME="WebBrowserTabWidget.__printPreviewRequested" ID="WebBrowserTabWidget.__printPreviewRequested"></a>
-<h4>WebBrowserTabWidget.__printPreviewRequested</h4>
-<b>__printPreviewRequested</b>(<i>printer, browser</i>)
-
-<p>
-        Private slot to generate the print preview.
-</p>
-<dl>
-
-<dt><i>printer</i> (QPrinter)</dt>
-<dd>
-reference to the printer object
-</dd>
-<dt><i>browser</i> (WebBrowserView)</dt>
-<dd>
-reference to the browser to be printed
-</dd>
-</dl>
 <a NAME="WebBrowserTabWidget.__recentlyAudibleChanged" ID="WebBrowserTabWidget.__recentlyAudibleChanged"></a>
 <h4>WebBrowserTabWidget.__recentlyAudibleChanged</h4>
 <b>__recentlyAudibleChanged</b>(<i>recentlyAudible, page</i>)
@@ -1114,26 +1066,4 @@
 </dl>
 <div align="right"><a href="#top">Up</a></div>
 <hr />
-<hr />
-<a NAME="isCupsAvailable" ID="isCupsAvailable"></a>
-<h2>isCupsAvailable</h2>
-<b>isCupsAvailable</b>(<i></i>)
-
-<p>
-    Static method to test the availability of CUPS.
-</p>
-<dl>
-<dt>Return:</dt>
-<dd>
-flag indicating the availability of CUPS
-</dd>
-</dl>
-<dl>
-<dt>Return Type:</dt>
-<dd>
-bool
-</dd>
-</dl>
-<div align="right"><a href="#top">Up</a></div>
-<hr />
 </body></html>
\ No newline at end of file
--- a/src/eric7/Documentation/Source/eric7.WebBrowser.WebBrowserView.html	Thu Oct 12 17:03:41 2023 +0200
+++ b/src/eric7/Documentation/Source/eric7.WebBrowser.WebBrowserView.html	Thu Oct 12 17:05:08 2023 +0200
@@ -28,7 +28,11 @@
 <h3>Functions</h3>
 
 <table>
-<tr><td>None</td></tr>
+
+<tr>
+<td><a href="#isCupsAvailable">isCupsAvailable</a></td>
+<td>Static method to test the availability of CUPS.</td>
+</tr>
 </table>
 <hr />
 <hr />
@@ -258,8 +262,16 @@
 <td>Private slot to pause or play the selected media.</td>
 </tr>
 <tr>
-<td><a href="#WebBrowserView.__printPage">__printPage</a></td>
-<td>Private slot to support printing from the web page.</td>
+<td><a href="#WebBrowserView.__printPageFinished">__printPageFinished</a></td>
+<td>Private slot to handle the finishing of a print job.</td>
+</tr>
+<tr>
+<td><a href="#WebBrowserView.__printPageToPdfFinished">__printPageToPdfFinished</a></td>
+<td>Private slot to handle the finishing of a PDF print job.</td>
+</tr>
+<tr>
+<td><a href="#WebBrowserView.__printPreviewRequested">__printPreviewRequested</a></td>
+<td>Private slot to generate the print preview.</td>
 </tr>
 <tr>
 <td><a href="#WebBrowserView.__quotaRequested">__quotaRequested</a></td>
@@ -310,6 +322,10 @@
 <td>Private slot to set widget that receives input events.</td>
 </tr>
 <tr>
+<td><a href="#WebBrowserView.__setupPrinter">__setupPrinter</a></td>
+<td>Private method to create and initialize a QPrinter object.</td>
+</tr>
+<tr>
 <td><a href="#WebBrowserView.__showContextMenu">__showContextMenu</a></td>
 <td>Private slot to show a context menu.</td>
 </tr>
@@ -510,6 +526,18 @@
 <td>Public method to indicate a change of the settings.</td>
 </tr>
 <tr>
+<td><a href="#WebBrowserView.printPage">printPage</a></td>
+<td>Public slot to print the current page.</td>
+</tr>
+<tr>
+<td><a href="#WebBrowserView.printPageToPdf">printPageToPdf</a></td>
+<td>Public slot to save the current page as a PDF file.</td>
+</tr>
+<tr>
+<td><a href="#WebBrowserView.printPreviewPage">printPreviewPage</a></td>
+<td>Public slot to create a print preview of the current page.</td>
+</tr>
+<tr>
 <td><a href="#WebBrowserView.progress">progress</a></td>
 <td>Public method to get the load progress.</td>
 </tr>
@@ -1103,13 +1131,52 @@
 <p>
         Private slot to pause or play the selected media.
 </p>
-<a NAME="WebBrowserView.__printPage" ID="WebBrowserView.__printPage"></a>
-<h4>WebBrowserView.__printPage</h4>
-<b>__printPage</b>(<i></i>)
+<a NAME="WebBrowserView.__printPageFinished" ID="WebBrowserView.__printPageFinished"></a>
+<h4>WebBrowserView.__printPageFinished</h4>
+<b>__printPageFinished</b>(<i>success</i>)
+
+<p>
+        Private slot to handle the finishing of a print job.
+</p>
+<dl>
+
+<dt><i>success</i> (bool)</dt>
+<dd>
+flag indicating success (not used)
+</dd>
+</dl>
+<a NAME="WebBrowserView.__printPageToPdfFinished" ID="WebBrowserView.__printPageToPdfFinished"></a>
+<h4>WebBrowserView.__printPageToPdfFinished</h4>
+<b>__printPageToPdfFinished</b>(<i>filepath, success</i>)
 
 <p>
-        Private slot to support printing from the web page.
+        Private slot to handle the finishing of a PDF print job.
 </p>
+<dl>
+
+<dt><i>filepath</i> (str)</dt>
+<dd>
+path of the output PDF file
+</dd>
+<dt><i>success</i> (bool)</dt>
+<dd>
+flag indicating success
+</dd>
+</dl>
+<a NAME="WebBrowserView.__printPreviewRequested" ID="WebBrowserView.__printPreviewRequested"></a>
+<h4>WebBrowserView.__printPreviewRequested</h4>
+<b>__printPreviewRequested</b>(<i>printer</i>)
+
+<p>
+        Private slot to generate the print preview.
+</p>
+<dl>
+
+<dt><i>printer</i> (QPrinter)</dt>
+<dd>
+reference to the printer object
+</dd>
+</dl>
 <a NAME="WebBrowserView.__quotaRequested" ID="WebBrowserView.__quotaRequested"></a>
 <h4>WebBrowserView.__quotaRequested</h4>
 <b>__quotaRequested</b>(<i>quotaRequest</i>)
@@ -1234,6 +1301,32 @@
 <p>
         Private slot to set widget that receives input events.
 </p>
+<a NAME="WebBrowserView.__setupPrinter" ID="WebBrowserView.__setupPrinter"></a>
+<h4>WebBrowserView.__setupPrinter</h4>
+<b>__setupPrinter</b>(<i>filePath=None</i>)
+
+<p>
+        Private method to create and initialize a QPrinter object.
+</p>
+<dl>
+
+<dt><i>filePath</i> (str (optional))</dt>
+<dd>
+name of the output file for the printer (defaults to None)
+</dd>
+</dl>
+<dl>
+<dt>Return:</dt>
+<dd>
+initialized QPrinter object
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+QPrinter
+</dd>
+</dl>
 <a NAME="WebBrowserView.__showContextMenu" ID="WebBrowserView.__showContextMenu"></a>
 <h4>WebBrowserView.__showContextMenu</h4>
 <b>__showContextMenu</b>(<i>pos</i>)
@@ -1939,6 +2032,27 @@
 <p>
         Public method to indicate a change of the settings.
 </p>
+<a NAME="WebBrowserView.printPage" ID="WebBrowserView.printPage"></a>
+<h4>WebBrowserView.printPage</h4>
+<b>printPage</b>(<i></i>)
+
+<p>
+        Public slot to print the current page.
+</p>
+<a NAME="WebBrowserView.printPageToPdf" ID="WebBrowserView.printPageToPdf"></a>
+<h4>WebBrowserView.printPageToPdf</h4>
+<b>printPageToPdf</b>(<i></i>)
+
+<p>
+        Public slot to save the current page as a PDF file.
+</p>
+<a NAME="WebBrowserView.printPreviewPage" ID="WebBrowserView.printPreviewPage"></a>
+<h4>WebBrowserView.printPreviewPage</h4>
+<b>printPreviewPage</b>(<i></i>)
+
+<p>
+        Public slot to create a print preview of the current page.
+</p>
 <a NAME="WebBrowserView.progress" ID="WebBrowserView.progress"></a>
 <h4>WebBrowserView.progress</h4>
 <b>progress</b>(<i></i>)
@@ -2168,4 +2282,26 @@
 </dl>
 <div align="right"><a href="#top">Up</a></div>
 <hr />
+<hr />
+<a NAME="isCupsAvailable" ID="isCupsAvailable"></a>
+<h2>isCupsAvailable</h2>
+<b>isCupsAvailable</b>(<i></i>)
+
+<p>
+    Static method to test the availability of CUPS.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+flag indicating the availability of CUPS
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+bool
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
 </body></html>
\ No newline at end of file
--- a/src/eric7/WebBrowser/Tools/PrintToPdfDialog.py	Thu Oct 12 17:03:41 2023 +0200
+++ b/src/eric7/WebBrowser/Tools/PrintToPdfDialog.py	Thu Oct 12 17:05:08 2023 +0200
@@ -7,11 +7,9 @@
 Module implementing a dialog to enter the data for printing a web page to PDF.
 """
 
-import os
-
-from PyQt6.QtCore import QMarginsF, QStandardPaths, pyqtSlot
-from PyQt6.QtGui import QPageLayout, QPageSize
-from PyQt6.QtPrintSupport import QPageSetupDialog, QPrinter
+from PyQt6.QtCore import pyqtSlot
+from PyQt6.QtGui import QPageLayout
+from PyQt6.QtPrintSupport import QPageSetupDialog
 from PyQt6.QtWidgets import QDialog
 
 from eric7.EricWidgets.EricPathPicker import EricPathPickerModes
@@ -25,35 +23,23 @@
     PDF.
     """
 
-    def __init__(self, filePath, parent=None):
+    def __init__(self, printer, parent=None):
         """
         Constructor
 
-        @param filePath path of the file to write into
-        @type str
+        @param printer reference to an initialized QPrinter object
+        @type QPrinter
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(parent)
         self.setupUi(self)
 
+        self.__printer = printer
+
         self.pdfFilePicker.setMode(EricPathPickerModes.SAVE_FILE_OVERWRITE_MODE)
         self.pdfFilePicker.setFilters(self.tr("PDF Files (*.pdf);;All Files (*)"))
-        if not os.path.isabs(filePath):
-            documentsPath = QStandardPaths.writableLocation(
-                QStandardPaths.StandardLocation.DocumentsLocation
-            )
-            if documentsPath:
-                filePath = os.path.join(documentsPath, filePath)
-            else:
-                filePath = os.path.abspath(filePath)
-        self.pdfFilePicker.setText(filePath, toNative=True)
-
-        self.__currentPageLayout = QPageLayout(
-            QPageSize(QPageSize.PageSizeId.A4),
-            QPageLayout.Orientation.Portrait,
-            QMarginsF(0.0, 0.0, 0.0, 0.0),
-        )
+        self.pdfFilePicker.setText(self.__printer.outputFileName(), toNative=True)
 
         self.__updatePageLayoutLabel()
 
@@ -62,12 +48,8 @@
         """
         Private slot to define the page layout.
         """
-        printer = QPrinter()
-        printer.setPageLayout(self.__currentPageLayout)
-
-        dlg = QPageSetupDialog(printer, self)
+        dlg = QPageSetupDialog(self.__printer, self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
-            self.__currentPageLayout = printer.pageLayout()
             self.__updatePageLayoutLabel()
 
     def __updatePageLayoutLabel(self):
@@ -77,14 +59,14 @@
         orientation = (
             self.tr("Portrait")
             if (
-                self.__currentPageLayout.orientation()
+                self.__printer.pageLayout().orientation()
                 == QPageLayout.Orientation.Portrait
             )
             else self.tr("Landscape")
         )
         self.pageLayoutLabel.setText(
             self.tr("{0}, {1}", "page size, page orientation").format(
-                self.__currentPageLayout.pageSize().name(), orientation
+                self.__printer.pageLayout().pageSize().name(), orientation
             )
         )
 
@@ -97,5 +79,5 @@
         """
         return (
             self.pdfFilePicker.text(toNative=True),
-            self.__currentPageLayout,
+            self.__printer.pageLayout(),
         )
--- a/src/eric7/WebBrowser/WebBrowserPage.py	Thu Oct 12 17:03:41 2023 +0200
+++ b/src/eric7/WebBrowser/WebBrowserPage.py	Thu Oct 12 17:05:08 2023 +0200
@@ -463,32 +463,6 @@
         else:
             request.reject()
 
-    def execPrintPage(self, printer, timeout=1000):
-        """
-        Public method to execute a synchronous print.
-
-        @param printer reference to the printer object
-        @type QPrinter
-        @param timeout timeout value in milliseconds
-        @type int
-        @return flag indicating a successful print job
-        @rtype bool
-        """
-        # FIXME: replace this logic with QWebEngineView.print(printer)
-        loop = QEventLoop()
-        resultDict = {"res": None}
-        QTimer.singleShot(timeout, loop.quit)
-
-        def printCallback(res, resDict=resultDict):
-            if loop and loop.isRunning():
-                resDict["res"] = res
-                loop.quit()
-
-        self.print(printer, printCallback)
-
-        loop.exec()
-        return resultDict["res"]
-
     def __contentsSizeChanged(self, size):  # noqa: U100
         """
         Private slot to work around QWebEnginePage not scrolling to anchors
--- a/src/eric7/WebBrowser/WebBrowserTabWidget.py	Thu Oct 12 17:03:41 2023 +0200
+++ b/src/eric7/WebBrowser/WebBrowserTabWidget.py	Thu Oct 12 17:05:08 2023 +0200
@@ -7,53 +7,26 @@
 Module implementing the central widget showing the web pages.
 """
 
-import os
-
-from PyQt6.QtCore import QMarginsF, Qt, QUrl, pyqtSignal, pyqtSlot
-from PyQt6.QtGui import QIcon, QPageLayout, QPainter, QPixmap
-from PyQt6.QtPrintSupport import (
-    QAbstractPrintDialog,
-    QPrintDialog,
-    QPrinter,
-    QPrintPreviewDialog,
-)
-from PyQt6.QtWidgets import QDialog, QHBoxLayout, QMenu, QToolButton, QWidget
+from PyQt6.QtCore import Qt, QUrl, pyqtSignal, pyqtSlot
+from PyQt6.QtGui import QIcon, QPainter, QPixmap
+from PyQt6.QtWidgets import QHBoxLayout, QMenu, QToolButton, QWidget
 
 from eric7 import Preferences
 from eric7.EricGui import EricPixmapCache
-from eric7.EricGui.EricOverrideCursor import EricOverrideCursor
 from eric7.EricWidgets import EricMessageBox
 from eric7.EricWidgets.EricApplication import ericApp
 from eric7.EricWidgets.EricTabWidget import EricTabWidget
-from eric7.SystemUtilities import FileSystemUtilities, OSUtilities
+from eric7.SystemUtilities import FileSystemUtilities
 from eric7.WebBrowser.WebBrowserWindow import WebBrowserWindow
 
 from . import WebInspector
 from .ClosedTabsManager import ClosedTabsManager
-from .Tools import WebBrowserTools
 from .UrlBar.StackedUrlBar import StackedUrlBar
 from .WebBrowserPage import WebBrowserPage
 from .WebBrowserTabBar import WebBrowserTabBar
 from .WebBrowserView import WebBrowserView
 
 
-def isCupsAvailable():
-    """
-    Static method to test the availability of CUPS.
-
-    @return flag indicating the availability of CUPS
-    @rtype bool
-    """
-    if OSUtilities.isMacPlatform():
-        # OS X/MacOS always have CUPS
-        return True
-    elif OSUtilities.isLinuxPlatform():
-        testPrinter = QPrinter()
-        return testPrinter.supportsMultipleCopies()
-    else:
-        return False
-
-
 class WebBrowserTabWidget(EricTabWidget):
     """
     Class implementing the central widget showing the web pages.
@@ -650,44 +623,8 @@
         if browser is None:
             browser = self.currentBrowser()
 
-        printer = QPrinter(mode=QPrinter.PrinterMode.HighResolution)
-        if Preferences.getPrinter("ColorMode"):
-            printer.setColorMode(QPrinter.ColorMode.Color)
-        else:
-            printer.setColorMode(QPrinter.ColorMode.GrayScale)
-        if Preferences.getPrinter("FirstPageFirst"):
-            printer.setPageOrder(QPrinter.PageOrder.FirstPageFirst)
-        else:
-            printer.setPageOrder(QPrinter.PageOrder.LastPageFirst)
-        printer.setPageMargins(
-            QMarginsF(
-                Preferences.getPrinter("LeftMargin") * 10,
-                Preferences.getPrinter("TopMargin") * 10,
-                Preferences.getPrinter("RightMargin") * 10,
-                Preferences.getPrinter("BottomMargin") * 10,
-            ),
-            QPageLayout.Unit.Millimeter,
-        )
-        printerName = Preferences.getPrinter("PrinterName")
-        if printerName:
-            printer.setPrinterName(printerName)
-        printer.setResolution(Preferences.getPrinter("Resolution"))
-        documentName = WebBrowserTools.getFileNameFromUrl(browser.url())
-        printer.setDocName(documentName)
-
-        printDialog = QPrintDialog(printer, self)
-        printDialog.setOptions(
-            QAbstractPrintDialog.PrintDialogOption.PrintToFile
-            | QAbstractPrintDialog.PrintDialogOption.PrintShowPageSize
-        )
-        if not OSUtilities.isWindowsPlatform():
-            if isCupsAvailable():
-                printDialog.setOption(
-                    QAbstractPrintDialog.PrintDialogOption.PrintCollateCopies
-                )
-            printDialog.setOption(QAbstractPrintDialog.PrintDialogOption.PrintPageRange)
-        if printDialog.exec() == QDialog.DialogCode.Accepted:
-            browser.page().execPrintPage(printer, 10 * 1000)
+        if browser is not None:
+            browser.printPage()
 
     @pyqtSlot()
     def printBrowserPdf(self, browser=None):
@@ -696,83 +633,11 @@
 
         @param browser reference to the browser to be printed (HelpBrowser)
         """
-        from .Tools.PrintToPdfDialog import PrintToPdfDialog
-
         if browser is None:
             browser = self.currentBrowser()
 
-        name = WebBrowserTools.getFileNameFromUrl(browser.url())
-        if name:
-            name = name.rsplit(".", 1)[0]
-            name += ".pdf"
-        if hasattr(browser.page(), "printToPdf"):
-            if not name:
-                name = "printout.pdf"
-            dlg = PrintToPdfDialog(name, self)
-            if dlg.exec() == QDialog.DialogCode.Accepted:
-                filePath, pageLayout = dlg.getData()
-                if filePath:
-                    if os.path.exists(filePath):
-                        res = EricMessageBox.warning(
-                            self,
-                            self.tr("Print to PDF"),
-                            self.tr(
-                                """<p>The file <b>{0}</b> exists"""
-                                """ already. Shall it be"""
-                                """ overwritten?</p>"""
-                            ).format(filePath),
-                            EricMessageBox.No | EricMessageBox.Yes,
-                            EricMessageBox.No,
-                        )
-                        if res == EricMessageBox.No:
-                            return
-                    browser.page().printToPdf(
-                        lambda pdf: self.__pdfGeneratedForSave(filePath, pdf),
-                        pageLayout,
-                    )
-        elif OSUtilities.isLinuxPlatform():
-            printer = QPrinter(mode=QPrinter.PrinterMode.HighResolution)
-            if Preferences.getPrinter("ColorMode"):
-                printer.setColorMode(QPrinter.ColorMode.Color)
-            else:
-                printer.setColorMode(QPrinter.ColorMode.GrayScale)
-            printerName = Preferences.getPrinter("PrinterName")
-            if printerName:
-                printer.setPrinterName(printerName)
-            printer.setOutputFormat(QPrinter.OutputFormat.PdfFormat)
-            if name:
-                printer.setOutputFileName(name)
-            printer.setResolution(Preferences.getPrinter("Resolution"))
-
-            printDialog = QPrintDialog(printer, self)
-            if printDialog.exec() == QDialog.DialogCode.Accepted:
-                browser.render(printer)
-
-    def __pdfGeneratedForSave(self, filePath, pdfData):
-        """
-        Private slot to save the generated PDF data to a file.
-
-        @param filePath path to save the PDF to
-        @type str
-        @param pdfData generated PDF document
-        @type QByteArray
-        """
-        if pdfData.size() == 0:
-            return
-
-        try:
-            with open(filePath, "wb") as f:
-                f.write(pdfData)
-        except OSError as err:
-            EricMessageBox.critical(
-                self,
-                self.tr("Print to PDF"),
-                self.tr(
-                    """<p>The PDF could not be written to file <b>{0}"""
-                    """</b>.</p><p><b>Error:</b> {1}</p>"""
-                ).format(filePath, str(err)),
-                EricMessageBox.Ok,
-            )
+        if browser is not None:
+            browser.printPageToPdf()
 
     @pyqtSlot()
     def printPreviewBrowser(self, browser=None):
@@ -784,47 +649,8 @@
         if browser is None:
             browser = self.currentBrowser()
 
-        printer = QPrinter(mode=QPrinter.PrinterMode.HighResolution)
-        if Preferences.getPrinter("ColorMode"):
-            printer.setColorMode(QPrinter.ColorMode.Color)
-        else:
-            printer.setColorMode(QPrinter.ColorMode.GrayScale)
-        if Preferences.getPrinter("FirstPageFirst"):
-            printer.setPageOrder(QPrinter.PageOrder.FirstPageFirst)
-        else:
-            printer.setPageOrder(QPrinter.PageOrder.LastPageFirst)
-        printer.setPageMargins(
-            QMarginsF(
-                Preferences.getPrinter("LeftMargin") * 10,
-                Preferences.getPrinter("TopMargin") * 10,
-                Preferences.getPrinter("RightMargin") * 10,
-                Preferences.getPrinter("BottomMargin") * 10,
-            ),
-            QPageLayout.Unit.Millimeter,
-        )
-        printerName = Preferences.getPrinter("PrinterName")
-        if printerName:
-            printer.setPrinterName(printerName)
-        printer.setResolution(Preferences.getPrinter("Resolution"))
-
-        preview = QPrintPreviewDialog(printer, self)
-        preview.resize(800, 750)
-        preview.paintRequested.connect(
-            lambda p: self.__printPreviewRequested(p, browser)
-        )
-        preview.exec()
-
-    def __printPreviewRequested(self, printer, browser):
-        """
-        Private slot to generate the print preview.
-
-        @param printer reference to the printer object
-        @type QPrinter
-        @param browser reference to the browser to be printed
-        @type WebBrowserView
-        """
-        with EricOverrideCursor():
-            browser.page().execPrintPage(printer, 10 * 1000)
+        if browser is not None:
+            browser.printPreviewPage()
 
     def __sourceChanged(self, url, browser):
         """
--- a/src/eric7/WebBrowser/WebBrowserView.py	Thu Oct 12 17:03:41 2023 +0200
+++ b/src/eric7/WebBrowser/WebBrowserView.py	Thu Oct 12 17:05:08 2023 +0200
@@ -18,7 +18,9 @@
     QDataStream,
     QDateTime,
     QEvent,
+    QEventLoop,
     QIODevice,
+    QMarginsF,
     QPoint,
     QPointF,
     QStandardPaths,
@@ -28,7 +30,20 @@
     pyqtSignal,
     pyqtSlot,
 )
-from PyQt6.QtGui import QClipboard, QCursor, QDesktopServices, QIcon, QPixmap
+from PyQt6.QtGui import (
+    QClipboard,
+    QCursor,
+    QDesktopServices,
+    QIcon,
+    QPageLayout,
+    QPixmap,
+)
+from PyQt6.QtPrintSupport import (
+    QAbstractPrintDialog,
+    QPrintDialog,
+    QPrinter,
+    QPrintPreviewDialog,
+)
 from PyQt6.QtWebEngineCore import QWebEngineDownloadRequest, QWebEnginePage
 from PyQt6.QtWebEngineWidgets import QWebEngineView
 from PyQt6.QtWidgets import QApplication, QDialog, QMenu, QStyle
@@ -38,16 +53,34 @@
 from eric7.EricWidgets import EricFileDialog, EricMessageBox
 from eric7.EricWidgets.EricApplication import ericApp
 from eric7.SystemUtilities import FileSystemUtilities, OSUtilities
+from eric7.UI.Info import Homepage, VersionOnly
 from eric7.WebBrowser.WebBrowserWindow import WebBrowserWindow
 from eric7.WebBrowser.ZoomManager import ZoomManager
 
 from . import WebInspector
-from .Tools import Scripts
+from .Tools import Scripts, WebBrowserTools
 from .Tools.WebBrowserTools import getHtmlPage, pixmapToDataUrl
 from .Tools.WebIconLoader import WebIconLoader
 from .WebBrowserPage import WebBrowserPage
 
 
+def isCupsAvailable():
+    """
+    Static method to test the availability of CUPS.
+
+    @return flag indicating the availability of CUPS
+    @rtype bool
+    """
+    if OSUtilities.isMacPlatform():
+        # OS X/MacOS always have CUPS
+        return True
+    elif OSUtilities.isLinuxPlatform():
+        testPrinter = QPrinter()
+        return testPrinter.supportsMultipleCopies()
+    else:
+        return False
+
+
 class WebBrowserView(QWebEngineView):
     """
     Class implementing the web browser view widget.
@@ -130,6 +163,8 @@
         self.__clickedPos = QPoint()
         self.__firstLoad = False
         self.__preview = QPixmap()
+        self.__currentPrinter = None
+        self.__printPreviewLoop = None
 
         self.__currentZoom = 100
         self.__zoomLevels = WebBrowserView.ZoomLevels[:]
@@ -146,6 +181,10 @@
         self.loadFinished.connect(self.__loadFinished)
         self.renderProcessTerminated.connect(self.__renderProcessTerminated)
 
+        self.printRequested.connect(self.printPage)
+        self.printFinished.connect(self.__printPageFinished)
+        self.pdfPrintingFinished.connect(self.__printPageToPdfFinished)
+
         self.__mw.openSearchManager().currentEngineChanged.connect(
             self.__currentEngineChanged
         )
@@ -177,7 +216,6 @@
 
         self.__page.safeBrowsingAbort.connect(self.safeBrowsingAbort)
         self.__page.safeBrowsingBad.connect(self.safeBrowsingBad)
-        self.__page.printPageRequested.connect(self.__printPage)
         with contextlib.suppress(AttributeError):
             # deprecated with Qt 6.5+
             self.__page.quotaRequested.connect(self.__quotaRequested)
@@ -2299,15 +2337,185 @@
             return True
 
     ###########################################################################
-    ## Methods below implement print support from the page
+    ## Methods below implement print support
     ###########################################################################
 
+    def __setupPrinter(self, filePath=None):
+        """
+        Private method to create and initialize a QPrinter object.
+
+        @param filePath name of the output file for the printer (defaults to None)
+        @type str (optional)
+        @return initialized QPrinter object
+        @rtype QPrinter
+        """
+        printer = QPrinter(mode=QPrinter.PrinterMode.HighResolution)
+        if Preferences.getPrinter("ColorMode"):
+            printer.setColorMode(QPrinter.ColorMode.Color)
+        else:
+            printer.setColorMode(QPrinter.ColorMode.GrayScale)
+        if Preferences.getPrinter("FirstPageFirst"):
+            printer.setPageOrder(QPrinter.PageOrder.FirstPageFirst)
+        else:
+            printer.setPageOrder(QPrinter.PageOrder.LastPageFirst)
+        printer.setPageMargins(
+            QMarginsF(
+                Preferences.getPrinter("LeftMargin") * 10,
+                Preferences.getPrinter("TopMargin") * 10,
+                Preferences.getPrinter("RightMargin") * 10,
+                Preferences.getPrinter("BottomMargin") * 10,
+            ),
+            QPageLayout.Unit.Millimeter,
+        )
+        printerName = Preferences.getPrinter("PrinterName")
+        if printerName:
+            printer.setPrinterName(printerName)
+        printer.setResolution(Preferences.getPrinter("Resolution"))
+        documentName = WebBrowserTools.getFileNameFromUrl(self.url())
+        printer.setDocName(documentName)
+        documentsPath = QStandardPaths.writableLocation(
+            QStandardPaths.StandardLocation.DocumentsLocation
+        )
+        if filePath is None:
+            filePath = "{0}.pdf".format(documentName)
+        filePath = (
+            os.path.join(documentsPath, filePath)
+            if documentsPath
+            else os.path.abspath(filePath)
+        )
+        printer.setOutputFileName(filePath)
+        printer.setCreator(self.tr("eric7 {0} ({1})").format(VersionOnly, Homepage))
+        return printer
+
+    @pyqtSlot()
+    def printPage(self):
+        """
+        Public slot to print the current page.
+        """
+        if self.__currentPrinter is not None:
+            EricMessageBox.warning(
+                self,
+                self.tr("Print Page"),
+                self.tr(
+                    "There is already a print job in progress. Printing is temporarily"
+                    " disabled until the current job is finished."
+                ),
+            )
+            return
+
+        printer = self.__setupPrinter()
+
+        printDialog = QPrintDialog(printer, self)
+        printDialog.setOptions(
+            QAbstractPrintDialog.PrintDialogOption.PrintToFile
+            | QAbstractPrintDialog.PrintDialogOption.PrintShowPageSize
+        )
+        if not OSUtilities.isWindowsPlatform():
+            if isCupsAvailable():
+                printDialog.setOption(
+                    QAbstractPrintDialog.PrintDialogOption.PrintCollateCopies
+                )
+            printDialog.setOption(QAbstractPrintDialog.PrintDialogOption.PrintPageRange)
+        if printDialog.exec() == QDialog.DialogCode.Accepted:
+            if printer.outputFormat() == QPrinter.OutputFormat.PdfFormat:
+                self.printToPdf(
+                    printer.outputFileName(), printer.pageLayout(), printer.pageRanges()
+                )
+            else:
+                self.__currentPrinter = printer
+                self.print(printer)
+
     @pyqtSlot()
-    def __printPage(self):
+    def printPageToPdf(self):
+        """
+        Public slot to save the current page as a PDF file.
+        """
+        from .Tools.PrintToPdfDialog import PrintToPdfDialog
+
+        name = WebBrowserTools.getFileNameFromUrl(self.url())
+        name = name.rsplit(".", 1)[0] + ".pdf" if name else "printout.pdf"
+        dlg = PrintToPdfDialog(self.__setupPrinter(filePath=name), self)
+        if dlg.exec() == QDialog.DialogCode.Accepted:
+            filePath, pageLayout = dlg.getData()
+            if filePath:
+                if os.path.exists(filePath):
+                    res = EricMessageBox.warning(
+                        self,
+                        self.tr("Print to PDF"),
+                        self.tr(
+                            """<p>The file <b>{0}</b> exists"""
+                            """ already. Shall it be"""
+                            """ overwritten?</p>"""
+                        ).format(filePath),
+                        EricMessageBox.No | EricMessageBox.Yes,
+                        EricMessageBox.No,
+                    )
+                    if res == EricMessageBox.No:
+                        return
+                self.printToPdf(filePath, pageLayout)
+
+    @pyqtSlot()
+    def printPreviewPage(self):
+        """
+        Public slot to create a print preview of the current page.
+        """
+        printer = self.__setupPrinter()
+        preview = QPrintPreviewDialog(printer, self)
+        preview.resize(800, 750)
+        preview.paintRequested.connect(self.__printPreviewRequested)
+        preview.exec()
+
+    @pyqtSlot(QPrinter)
+    def __printPreviewRequested(self, printer):
         """
-        Private slot to support printing from the web page.
+        Private slot to generate the print preview.
+
+        @param printer reference to the printer object
+        @type QPrinter
+        """
+        # This needs to run its own event loop to prevent a premature return from
+        # the method.
+        self.__printPreviewLoop = QEventLoop()
+
+        self.print(printer)
+
+        self.__printPreviewLoop.exec()
+        self.__printPreviewLoop = None
+
+    @pyqtSlot(bool)
+    def __printPageFinished(self, success):
+        """
+        Private slot to handle the finishing of a print job.
+
+        @param success flag indicating success (not used)
+        @type bool
         """
-        self.__mw.tabWidget.printBrowser(browser=self)
+        if self.__printPreviewLoop is not None:
+            # The print preview was created, now stop the print preview loop.
+            self.__printPreviewLoop.quit()
+            return
+
+        # we printed to a real printer
+        self.__currentPrinter = None
+
+    @pyqtSlot(str, bool)
+    def __printPageToPdfFinished(self, filepath, success):
+        """
+        Private slot to handle the finishing of a PDF print job.
+
+        @param filepath path of the output PDF file
+        @type str
+        @param success flag indicating success
+        @type bool
+        """
+        if not success:
+            EricMessageBox.critical(
+                self,
+                self.tr("Print to PDF"),
+                self.tr(
+                    """<p>The PDF file <b>{0}</b> could not be generated.</p>"""
+                ).format(filepath),
+            )
 
     ###########################################################################
     ## Methods below implement slots for Qt 6.0 to 6.4

eric ide

mercurial