Skip to content

Commit fe65aa1

Browse files
committed
qtvcp: port PDFViewer to PyQt6, replace popplerqt5 with QPdfDocument
Drop the optional popplerqt5/python3-poppler-qt5 dependency and the associated LIB_BAD guard. Use QPdfDocument from PyQt6.QtPdf instead, which ships as part of PyQt6 itself. Rendering now uses QPdfDocumentRenderOptions with Antialiasing and TextAntialiasing flags set, preserving the render quality of the original poppler-based code. Other PyQt6 migration changes: - app.exec_() replaced with app.exec() - pageCount()/pagePointSize()/render() replace numPages()/page()/renderToImage()
1 parent 4fd0453 commit fe65aa1

6 files changed

Lines changed: 42 additions & 36 deletions

File tree

configs/sim/woodpecker/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ sudo apt-get install python3-scipy
1515
sudo apt-get install python3-matplotlib
1616

1717
#### To view PDF files
18-
sudo apt-get install python3-poppler-qt5
18+
sudo apt-get install python3-pyqt6.qtpdf
1919

2020
### To numstr.py
2121
File line_number.txt to the /home/name/line-number.txt according to the address in numstr.py.

debian/configure

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ PYTHON_GST=python3-gst-1.0,gstreamer1.0-plugins-base
134134
TCLTK_VERSION=8.6
135135
PYTHON_IMAGING=python3-pil
136136
PYTHON_IMAGING_TK=python3-pil.imagetk
137-
QTVCP_DEPENDS="python3-pyqt5,\n python3-pyqt5.qsci,\n python3-pyqt5.qtsvg,\n python3-pyqt5.qtopengl,\n python3-opencv,\n python3-dbus,\n python3-espeak,\n python3-dbus.mainloop.pyqt5,\n python3-pyqt5.qtwebengine,\n espeak-ng,\n pyqt5-dev-tools,\n gstreamer1.0-tools,\n espeak,\n sound-theme-freedesktop,\n python3-poppler-qt5"
137+
QTVCP_DEPENDS="python3-pyqt5,\n python3-pyqt5.qsci,\n python3-pyqt5.qtsvg,\n python3-pyqt5.qtopengl,\n python3-opencv,\n python3-dbus,\n python3-espeak,\n python3-dbus.mainloop.pyqt5,\n python3-pyqt5.qtwebengine,\n espeak-ng,\n pyqt5-dev-tools,\n gstreamer1.0-tools,\n espeak,\n sound-theme-freedesktop,\n python3-pyqt6.qtpdf"
138138
YAPPS_RUNTIME="python3-yapps"
139139
DEBHELPER="debhelper (>= 12)"
140140
COMPAT="12"

lib/python/qtvcp/designer/README.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ python3-xlib
2121
python3-numpy
2222
python3-cairo
2323
python3-gi-cairo
24-
python3-poppler-qt5
24+
python3-pyqt6.qtpdf
2525
pyqt5-dev-tools
2626

2727
-------------------------------------------------------------------------------

lib/python/qtvcp/designer/install_script

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ echo -e '\ninstalling common base packages'
55
sudo apt-get install -y gstreamer1.0-tools espeak espeak-ng sound-theme-freedesktop
66

77
echo -e '\ninstalling base packages for python3'
8-
sudo apt-get install -y python3-opengl python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtsvg python3-pyqt5.qtopengl python3-opencv python3-dbus python3-dbus.mainloop.pyqt5 python3-espeak python3-pyqt5.qtwebengine python3-xlib python3-numpy python3-cairo python3-gi-cairo python3-poppler-qt5
8+
sudo apt-get install -y python3-opengl python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtsvg python3-pyqt5.qtopengl python3-opencv python3-dbus python3-dbus.mainloop.pyqt5 python3-espeak python3-pyqt5.qtwebengine python3-xlib python3-numpy python3-cairo python3-gi-cairo python3-pyqt6.qtpdf
99

1010
echo -e '\ninstalling python3 tools'
1111
sudo apt-get install -y pyqt5-dev-tools
Lines changed: 37 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,13 @@
11
import sys
22
import os
3-
from PyQt5 import QtGui, QtWidgets
4-
from PyQt5.QtCore import Qt
3+
from PyQt6 import QtGui, QtWidgets
4+
from PyQt6.QtCore import Qt, QSize
5+
from PyQt6.QtPdf import QPdfDocument, QPdfDocumentRenderOptions
56

67
# Set up logging
78
from qtvcp import logger
89
LOG = logger.getLogger(__name__)
910

10-
try:
11-
import popplerqt5
12-
LIB_BAD = False
13-
except:
14-
LIB_BAD = True
15-
LOG.warning('PDFViwer - Is python3-poppler-qt5 installed?')
16-
1711
class PDFView(QtWidgets.QScrollArea):
1812
def __init__(self, parent=None):
1913
super(PDFView, self).__init__(parent)
@@ -24,10 +18,12 @@ def __init__(self, parent=None):
2418
self.vbox = QtWidgets.QVBoxLayout()
2519
self.widget.setLayout(self.vbox)
2620
self._zoom = 1.0
27-
28-
if LIB_BAD:
29-
label = QtWidgets.QLabel('<b>Missing python3-poppler-qt5 module</b>')
30-
self.vbox.addWidget(label)
21+
self.doc = None
22+
self._render_opts = QPdfDocumentRenderOptions()
23+
self._render_opts.setRenderFlags(
24+
QPdfDocumentRenderOptions.RenderFlag.Antialiasing |
25+
QPdfDocumentRenderOptions.RenderFlag.TextAntialiasing
26+
)
3127

3228
def loadSample(self, name):
3329
n = os.path.join(os.path.dirname(__file__),name+'.pdf')
@@ -39,28 +35,32 @@ def loadSample(self, name):
3935
def loadView(self, path):
4036
filename = os.path.expanduser(path)
4137
if not os.path.exists(filename):
42-
print('No path:',filename)
43-
44-
if LIB_BAD:
38+
print('No path:', filename)
4539
return
4640

47-
self.doc = doc = popplerqt5.Poppler.Document.load(filename)
48-
doc.setRenderHint(popplerqt5.Poppler.Document.Antialiasing)
49-
doc.setRenderHint(popplerqt5.Poppler.Document.TextAntialiasing)
41+
self.doc = QPdfDocument(self)
42+
self.doc.load(filename)
5043
self.refreshPages()
5144

5245
def refreshPages(self):
46+
if self.doc is None:
47+
return
48+
5349
# clear layout of pages
54-
for i in reversed(range(self.vbox.count())):
50+
for i in reversed(range(self.vbox.count())):
5551
self.vbox.itemAt(i).widget().setParent(None)
5652

5753
# convert pages to images in a label
58-
for i in range(0,self.doc.numPages()):
54+
for i in range(self.doc.pageCount()):
5955
label = QtWidgets.QLabel()
6056
label.setScaledContents(True)
6157

62-
page = self.doc.page(i)
63-
image = page.renderToImage(72.0*self._zoom, 72.0*self._zoom)
58+
page_size = self.doc.pagePointSize(i)
59+
image_size = QSize(
60+
int(page_size.width() * self._zoom),
61+
int(page_size.height() * self._zoom)
62+
)
63+
image = self.doc.render(i, image_size, self._render_opts)
6464

6565
label.setPixmap(QtGui.QPixmap.fromImage(image))
6666
self.vbox.addWidget(label)
@@ -78,23 +78,29 @@ def pdf_view(filename):
7878
"""Return a Scrollarea showing the pages of the specified PDF file."""
7979
filename = os.path.expanduser(filename)
8080
if not os.path.exists(filename):
81-
print('No path:',filename)
81+
print('No path:', filename)
82+
return None
8283

83-
doc = popplerqt5.Poppler.Document.load(filename)
84-
doc.setRenderHint(popplerqt5.Poppler.Document.Antialiasing)
85-
doc.setRenderHint(popplerqt5.Poppler.Document.TextAntialiasing)
84+
doc = QPdfDocument()
85+
doc.load(filename)
8686

8787
area = QtWidgets.QScrollArea()
8888
area.setWidgetResizable(True)
8989
widget = QtWidgets.QWidget()
9090
vbox = QtWidgets.QVBoxLayout()
9191

92-
for i in range(0,doc.numPages()):
92+
for i in range(doc.pageCount()):
9393
label = QtWidgets.QLabel()
9494
label.setScaledContents(True)
9595

96-
page = doc.page(i)
97-
image = page.renderToImage()
96+
page_size = doc.pagePointSize(i)
97+
image_size = QSize(int(page_size.width()), int(page_size.height()))
98+
render_opts = QPdfDocumentRenderOptions()
99+
render_opts.setRenderFlags(
100+
QPdfDocumentRenderOptions.RenderFlag.Antialiasing |
101+
QPdfDocumentRenderOptions.RenderFlag.TextAntialiasing
102+
)
103+
image = doc.render(i, image_size, render_opts)
98104

99105
label.setPixmap(QtGui.QPixmap.fromImage(image))
100106
vbox.addWidget(label)
@@ -112,7 +118,7 @@ def main():
112118
filename = argv[-1]
113119
view = pdf_view(filename)
114120
view.show()
115-
sys.exit(app.exec_())
121+
sys.exit(app.exec())
116122

117123
if __name__ == '__main__':
118124
main()

scripts/setup_designer.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ echo -e '\ninstalling common base packages'
55
sudo apt-get install -y gstreamer1.0-tools espeak espeak-ng sound-theme-freedesktop
66

77
echo -e '\ninstalling base packages for python3'
8-
sudo apt-get install -y python3-opengl python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtsvg python3-pyqt5.qtopengl python3-opencv python3-dbus python3-dbus.mainloop.pyqt5 python3-espeak python3-pyqt5.qtwebkit python3-xlib python3-numpy python3-cairo python3-gi-cairo python3-poppler-qt5
8+
sudo apt-get install -y python3-opengl python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtsvg python3-pyqt5.qtopengl python3-opencv python3-dbus python3-dbus.mainloop.pyqt5 python3-espeak python3-pyqt5.qtwebkit python3-xlib python3-numpy python3-cairo python3-gi-cairo python3-pyqt6.qtpdf
99

1010
echo -e '\ninstalling python3 tools'
1111
sudo apt-get install -y pyqt5-dev-tools

0 commit comments

Comments
 (0)