src/eric7/PdfViewer/PdfInfoWidget.py

branch
pdf_viewer
changeset 9702
7c973954919d
child 9704
6e1650b9b3b5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/eric7/PdfViewer/PdfInfoWidget.py	Mon Jan 16 11:56:23 2023 +0100
@@ -0,0 +1,176 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2023 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing an info widget showing data of a PDF document.
+"""
+
+from PyQt6.QtCore import Qt, pyqtSlot, QFileInfo
+from PyQt6.QtPdf import QPdfDocument
+from PyQt6.QtWidgets import QWidget, QFormLayout, QLabel
+
+from eric7.Globals import dataString
+
+
+class PdfInfoWidget(QWidget):
+    """
+    Class implementing an info widget showing data of a PDF document.
+    """
+
+    def __init__(self, document, parent=None):
+        """
+        Constructor
+
+        @param document reference to the PDF document object
+        @type QPdfDocument
+        @param parent reference to the parent widget (defaults to None)
+        @type QWidget (optional)
+        """
+        super().__init__(parent)
+
+        self.__document = document
+
+        self.__layout = QFormLayout(self)
+        self.__layout.setRowWrapPolicy(QFormLayout.RowWrapPolicy.WrapLongRows)
+        self.__layout.setFieldGrowthPolicy(
+            QFormLayout.FieldGrowthPolicy.AllNonFixedFieldsGrow
+        )
+        self.__layout.setFormAlignment(
+            Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignTop
+        )
+        self.__layout.setLabelAlignment(Qt.AlignmentFlag.AlignRight)
+
+        self.__infoLabels = {
+            "filePath": QLabel(),
+            "fileSize": QLabel(),
+            "title": QLabel(),
+            "subject": QLabel(),
+            "author": QLabel(),
+            "creator": QLabel(),
+            "producer": QLabel(),
+            "pages": QLabel(),
+            "creationDate": QLabel(),
+            "modificationDate": QLabel(),
+            "keywords": QLabel(),
+            "security": QLabel(),
+        }
+        for label in self.__infoLabels.values():
+            label.setWordWrap(True)
+        self.__layout.addRow(self.tr("File Path:"), self.__infoLabels["filePath"])
+        self.__layout.addRow(self.tr("File Size:"), self.__infoLabels["fileSize"])
+        self.__layout.addRow(self.tr("Title:"), self.__infoLabels["title"])
+        self.__layout.addRow(self.tr("Subject:"), self.__infoLabels["subject"])
+        self.__layout.addRow(self.tr("Author:"), self.__infoLabels["author"])
+        self.__layout.addRow(self.tr("Created with:"), self.__infoLabels["creator"])
+        self.__layout.addRow(self.tr("Creator:"), self.__infoLabels["producer"])
+        self.__layout.addRow(self.tr("Pages:"), self.__infoLabels["pages"])
+        self.__layout.addRow(self.tr("Created at:"), self.__infoLabels["creationDate"])
+        self.__layout.addRow(
+            self.tr("Last Modified at:"), self.__infoLabels["modificationDate"]
+        )
+        self.__layout.addRow(self.tr("Keywords:"), self.__infoLabels["keywords"])
+        self.__layout.addRow(self.tr("Security:"), self.__infoLabels["security"])
+        #self.__layout.addRow(self.tr(""), self.__infoLabels[""])
+        # TODO: add more info labels
+
+        self.setLayout(self.__layout)
+
+        self.__document.statusChanged.connect(self.__populateInfoLabels)
+        self.__document.pageCountChanged.connect(self.__handlePageCountChanged)
+        self.__document.passwordChanged.connect(self.__handlePasswordChanged)
+
+    @pyqtSlot(QPdfDocument.Status)
+    def __populateInfoLabels(self, status):
+        """
+        Private slot to populate the info labels upon a change of the document status.
+
+        @param status document status
+        @type QPdfDocument.Status
+        """
+        ready = status == QPdfDocument.Status.Ready
+
+        self.__infoLabels["title"].setText(
+            self.__document.metaData(QPdfDocument.MetaDataField.Title) if ready else ""
+        )
+        self.__infoLabels["subject"].setText(
+            self.__document.metaData(QPdfDocument.MetaDataField.Subject)
+            if ready
+            else ""
+        )
+        self.__infoLabels["author"].setText(
+            self.__document.metaData(QPdfDocument.MetaDataField.Author) if ready else ""
+        )
+        self.__infoLabels["creator"].setText(
+            self.__document.metaData(QPdfDocument.MetaDataField.Creator)
+            if ready
+            else ""
+        )
+        self.__infoLabels["producer"].setText(
+            self.__document.metaData(QPdfDocument.MetaDataField.Producer)
+            if ready
+            else ""
+        )
+        self.__infoLabels["pages"].setText(
+            str(self.__document.pageCount()) if ready else ""
+        )
+        self.__infoLabels["creationDate"].setText(
+            self.__document.metaData(QPdfDocument.MetaDataField.CreationDate).toString(
+                "yyyy-MM-dd hh:mm:ss t"
+            ) if ready
+            else ""
+        )
+        self.__infoLabels["modificationDate"].setText(
+            self.__document.metaData(
+                QPdfDocument.MetaDataField.ModificationDate
+            ).toString("yyyy-MM-dd hh:mm:ss t")
+            if ready
+            else ""
+        )
+        self.__infoLabels["keywords"].setText(
+            self.__document.metaData(QPdfDocument.MetaDataField.Keywords)
+            if ready
+            else ""
+        )
+
+        if ready:
+            self.__handlePasswordChanged()
+        else:
+            self.__infoLabels["security"].setText("")
+
+    @pyqtSlot(int)
+    def __handlePageCountChanged(self, pageCount):
+        """
+        Private slot to handle a change of the page count.
+
+        @param pageCount changed page count
+        @type int
+        """
+        self.__infoLabels["pages"].setText(str(pageCount))
+
+    @pyqtSlot()
+    def __handlePasswordChanged(self):
+        """
+        Private slot to handle a change of the password.
+        """
+        self.__infoLabels["security"].setText(
+            self.tr("Encrypted")
+            if self.__document.password()
+            else self.tr("Not Encrypted")
+        )
+
+    def setFileName(self, filename):
+        """
+        Public method to set the file name info.
+
+        @param filename DESCRIPTION
+        @type TYPE
+        """
+        self.__infoLabels["filePath"].setText(filename)
+        if filename:
+            fi = QFileInfo(filename)
+            fileSize = fi.size()
+            self.__infoLabels["fileSize"].setText(dataString(fileSize))
+        else:
+            self.__infoLabels["fileSize"].setText("")

eric ide

mercurial