Ein PDF wird angezeigt.
This commit is contained in:
+2
-1
@@ -6,6 +6,7 @@ readme = "README.md"
|
|||||||
requires-python = ">=3.13"
|
requires-python = ">=3.13"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"pyside6>=6.9.0",
|
"pyside6>=6.9.0",
|
||||||
|
"pymupdf>=1.24.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[tool.ruff]
|
[tool.ruff]
|
||||||
@@ -13,4 +14,4 @@ dependencies = [
|
|||||||
# extend = "../pyproject.toml"
|
# extend = "../pyproject.toml"
|
||||||
|
|
||||||
# ...but use a different line length.
|
# ...but use a different line length.
|
||||||
line-length = 120
|
line-length = 120
|
||||||
|
|||||||
+49
-31
@@ -1,8 +1,9 @@
|
|||||||
import glob
|
import glob
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
import pymupdf # PyMuPDF
|
||||||
from PySide6.QtCore import Qt
|
from PySide6.QtCore import Qt
|
||||||
from PySide6.QtGui import QCursor, QPixmap
|
from PySide6.QtGui import QCursor, QPixmap, QImage
|
||||||
from PySide6.QtWidgets import QLabel, QMainWindow
|
from PySide6.QtWidgets import QLabel, QMainWindow
|
||||||
|
|
||||||
from ui.MainWinddow_ui import Ui_MainWindow
|
from ui.MainWinddow_ui import Ui_MainWindow
|
||||||
@@ -38,7 +39,7 @@ class MainWindow(QMainWindow):
|
|||||||
self._connect_signals()
|
self._connect_signals()
|
||||||
|
|
||||||
def _load_images(self):
|
def _load_images(self):
|
||||||
"""Lädt alle GIF-Dateien aus dem Ressourcen-Verzeichnis."""
|
"""Lädt PDF-Seiten aus der Ntbackup.pdf-Datei."""
|
||||||
# Entferne bestehende Widgets aus den Layouts
|
# Entferne bestehende Widgets aus den Layouts
|
||||||
self._clear_layout(self.ui.verticalLayout_2)
|
self._clear_layout(self.ui.verticalLayout_2)
|
||||||
self._clear_layout(self.ui.verticalLayout_3)
|
self._clear_layout(self.ui.verticalLayout_3)
|
||||||
@@ -47,44 +48,61 @@ class MainWindow(QMainWindow):
|
|||||||
self.thumbnail_to_full_image = {}
|
self.thumbnail_to_full_image = {}
|
||||||
self.original_pixmaps = {}
|
self.original_pixmaps = {}
|
||||||
|
|
||||||
# Pfad zum Ressourcen-Ordner
|
# Pfad zur PDF-Datei
|
||||||
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||||
res_dir = os.path.join(base_dir, "src", "ui", "res")
|
pdf_path = os.path.join(base_dir, "src", "ui", "res", "pdf", "Ntbackup.pdf")
|
||||||
|
|
||||||
# Alle GIF-Dateien finden
|
if not os.path.exists(pdf_path):
|
||||||
gif_files = glob.glob(os.path.join(res_dir, "*.gif"))
|
print(f"PDF-Datei nicht gefunden: {pdf_path}")
|
||||||
gif_files.sort() # Dateien alphabetisch sortieren
|
return
|
||||||
|
|
||||||
print(f"Gefundene GIF-Dateien: {gif_files}")
|
try:
|
||||||
|
# PDF-Datei öffnen
|
||||||
|
pdf_document = pymupdf.open(pdf_path)
|
||||||
|
print(f"PDF geladen: {pdf_path} mit {len(pdf_document)} Seiten")
|
||||||
|
|
||||||
# Für jede GIF-Datei:
|
# Für jede Seite der PDF:
|
||||||
for gif_file in gif_files:
|
for page_num in range(len(pdf_document)):
|
||||||
filename = os.path.basename(gif_file)
|
page = pdf_document[page_num]
|
||||||
|
|
||||||
|
# Seite in hoher Auflösung rendern
|
||||||
|
matrix = pymupdf.Matrix(2.0, 2.0) # 2x Vergrößerung für bessere Qualität
|
||||||
|
pix = page.get_pixmap(matrix=matrix)
|
||||||
|
|
||||||
|
# PyMuPDF Pixmap zu QImage konvertieren
|
||||||
|
img_data = pix.tobytes("png")
|
||||||
|
qimg = QImage.fromData(img_data)
|
||||||
|
|
||||||
|
# QImage zu QPixmap konvertieren
|
||||||
|
original_pixmap = QPixmap.fromImage(qimg)
|
||||||
|
|
||||||
# Original-Pixmap laden und speichern
|
# Thumbnail erstellen und zur linken Spalte hinzufügen
|
||||||
original_pixmap = QPixmap(gif_file)
|
thumbnail = QLabel()
|
||||||
|
thumbnail.setObjectName(f"thumbnail_page_{page_num + 1}")
|
||||||
|
thumbnail.setPixmap(original_pixmap.scaledToWidth(200, Qt.TransformationMode.SmoothTransformation))
|
||||||
|
thumbnail.setCursor(QCursor(Qt.CursorShape.PointingHandCursor))
|
||||||
|
thumbnail.setMouseTracking(True)
|
||||||
|
self.ui.verticalLayout_2.addWidget(thumbnail)
|
||||||
|
|
||||||
# Thumbnail erstellen und zur linken Spalte hinzufügen
|
# Vollbild-Version erstellen und zur rechten Spalte hinzufügen
|
||||||
thumbnail = QLabel()
|
fullsize = QLabel()
|
||||||
thumbnail.setObjectName(f"thumbnail_{filename}")
|
fullsize.setObjectName(f"fullsize_page_{page_num + 1}")
|
||||||
thumbnail.setPixmap(original_pixmap.scaledToWidth(200))
|
fullsize.setPixmap(original_pixmap)
|
||||||
thumbnail.setCursor(QCursor(Qt.CursorShape.PointingHandCursor))
|
fullsize.setAlignment(Qt.AlignmentFlag.AlignHCenter) # Horizontale Zentrierung
|
||||||
thumbnail.setMouseTracking(True)
|
self.ui.verticalLayout_3.addWidget(fullsize)
|
||||||
self.ui.verticalLayout_2.addWidget(thumbnail)
|
|
||||||
|
|
||||||
# Vollbild-Version erstellen und zur rechten Spalte hinzufügen
|
# Beziehungen speichern
|
||||||
fullsize = QLabel()
|
self.thumbnail_to_full_image[thumbnail] = fullsize
|
||||||
fullsize.setObjectName(f"fullsize_{filename}")
|
self.original_pixmaps[fullsize] = original_pixmap
|
||||||
fullsize.setPixmap(original_pixmap)
|
|
||||||
fullsize.setAlignment(Qt.AlignmentFlag.AlignHCenter) # Horizontale Zentrierung
|
|
||||||
self.ui.verticalLayout_3.addWidget(fullsize)
|
|
||||||
|
|
||||||
# Beziehungen speichern
|
# Click-Event für das Thumbnail einrichten
|
||||||
self.thumbnail_to_full_image[thumbnail] = fullsize
|
thumbnail.mousePressEvent = lambda event, t=thumbnail: self.on_thumbnail_clicked(event, t)
|
||||||
self.original_pixmaps[fullsize] = original_pixmap
|
|
||||||
|
|
||||||
# Click-Event für das Thumbnail einrichten
|
# PDF-Dokument schließen
|
||||||
thumbnail.mousePressEvent = lambda event, t=thumbnail: self.on_thumbnail_clicked(event, t)
|
pdf_document.close()
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Fehler beim Laden der PDF: {e}")
|
||||||
|
|
||||||
def _clear_layout(self, layout):
|
def _clear_layout(self, layout):
|
||||||
"""Entfernt alle Widgets aus einem Layout."""
|
"""Entfernt alle Widgets aus einem Layout."""
|
||||||
|
|||||||
@@ -2,6 +2,21 @@ version = 1
|
|||||||
revision = 2
|
revision = 2
|
||||||
requires-python = ">=3.13"
|
requires-python = ">=3.13"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pymupdf"
|
||||||
|
version = "1.26.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/99/13/d9f3b67b98111e79307e2a3cf6d5f73daaca002144cc6d236c4a0adbc386/pymupdf-1.26.0.tar.gz", hash = "sha256:ffe023f820379c84a0ddae38b0d07ea4016e1de84929491c34415520c629bcce", size = 74590906, upload-time = "2025-05-22T16:11:17.305Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b0/c8/e43b872d807ade267699b383d04927e4a1cca05268a43aa9ae0382b6f66a/pymupdf-1.26.0-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:86195673a5f2b3fbf0f75c73c40975a893fc42bf3d5c2a7cce9fb160704d9997", size = 23240576, upload-time = "2025-05-22T16:07:55.406Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ed/bb/2c39c2016b5be35372c5df08b44fa9a4778ccf03f9532b59e9d22f05921c/pymupdf-1.26.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:26c5df128a0ed7c38b80a1e7ddd792dd4d8b264839b6b8b6b6b768b13c0bb60e", size = 22409814, upload-time = "2025-05-22T16:08:15.673Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/90/e1/847d93fecbc975978cb2c6c38dbfbd09dde48c1bc97f9298f2b719880230/pymupdf-1.26.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:84a4dc96144a6bdf13f7d78c21500b3d1bef14d658156afd479acb3995f650c3", size = 23447163, upload-time = "2025-05-22T22:30:38.708Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/bb/86/959057f3cbbff4a7a00a8214f9f1787f6f708bd3c63091b47a95f1ae4053/pymupdf-1.26.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a3f6a45fcf8177763a2629a2ab2cad326e8950a0d120b174b56369365355a2a7", size = 24052460, upload-time = "2025-05-22T16:08:46.304Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e1/80/9cca07bf9c5dfa273781d3559266dcce2001ed111f068b80cad950584c01/pymupdf-1.26.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b5d4751696ba888ab1a91c6a0208c5d31724ee0bebe406f7a83067a08214f88b", size = 25300434, upload-time = "2025-05-22T16:09:13.839Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/59/c7/2e3e3d9419415e3c479fd9cb23067d33cc17db89e64c9167551a4acb66f2/pymupdf-1.26.0-cp39-abi3-win32.whl", hash = "sha256:eeb04a439355e2077f7675b8ad9377263d81990fc507748f2254a87d771d682b", size = 16925774, upload-time = "2025-05-22T16:09:34.814Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e9/d7/a6ce6629b66921529543c899830104f40dde45d98534d945970ea61ca8c9/pymupdf-1.26.0-cp39-abi3-win_amd64.whl", hash = "sha256:e39cc74ff030d773c4e76b9e5c5919cc4683895b73bd63bfd7a349a53ab5e8d7", size = 18525321, upload-time = "2025-05-22T16:10:01.426Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pyside6"
|
name = "pyside6"
|
||||||
version = "6.9.0"
|
version = "6.9.0"
|
||||||
@@ -67,8 +82,12 @@ name = "xsl-validator"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = { virtual = "." }
|
source = { virtual = "." }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
{ name = "pymupdf" },
|
||||||
{ name = "pyside6" },
|
{ name = "pyside6" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.metadata]
|
[package.metadata]
|
||||||
requires-dist = [{ name = "pyside6", specifier = ">=6.9.0" }]
|
requires-dist = [
|
||||||
|
{ name = "pymupdf", specifier = ">=1.24.0" },
|
||||||
|
{ name = "pyside6", specifier = ">=6.9.0" },
|
||||||
|
]
|
||||||
|
|||||||
Reference in New Issue
Block a user