|
1 # -*- coding: utf-8 -*- |
|
2 |
|
3 # Copyright (c) 2023 Detlev Offenbach <detlev@die-offenbachs.de> |
|
4 # |
|
5 |
|
6 """ |
|
7 Module implementing an info widget showing data of a PDF document. |
|
8 """ |
|
9 |
|
10 from PyQt6.QtCore import Qt, pyqtSlot, QFileInfo |
|
11 from PyQt6.QtPdf import QPdfDocument |
|
12 from PyQt6.QtWidgets import QWidget, QFormLayout, QLabel |
|
13 |
|
14 from eric7.Globals import dataString |
|
15 |
|
16 |
|
17 class PdfInfoWidget(QWidget): |
|
18 """ |
|
19 Class implementing an info widget showing data of a PDF document. |
|
20 """ |
|
21 |
|
22 def __init__(self, document, parent=None): |
|
23 """ |
|
24 Constructor |
|
25 |
|
26 @param document reference to the PDF document object |
|
27 @type QPdfDocument |
|
28 @param parent reference to the parent widget (defaults to None) |
|
29 @type QWidget (optional) |
|
30 """ |
|
31 super().__init__(parent) |
|
32 |
|
33 self.__document = document |
|
34 |
|
35 self.__layout = QFormLayout(self) |
|
36 self.__layout.setRowWrapPolicy(QFormLayout.RowWrapPolicy.WrapLongRows) |
|
37 self.__layout.setFieldGrowthPolicy( |
|
38 QFormLayout.FieldGrowthPolicy.AllNonFixedFieldsGrow |
|
39 ) |
|
40 self.__layout.setFormAlignment( |
|
41 Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignTop |
|
42 ) |
|
43 self.__layout.setLabelAlignment(Qt.AlignmentFlag.AlignRight) |
|
44 |
|
45 self.__infoLabels = { |
|
46 "filePath": QLabel(), |
|
47 "fileSize": QLabel(), |
|
48 "title": QLabel(), |
|
49 "subject": QLabel(), |
|
50 "author": QLabel(), |
|
51 "creator": QLabel(), |
|
52 "producer": QLabel(), |
|
53 "pages": QLabel(), |
|
54 "creationDate": QLabel(), |
|
55 "modificationDate": QLabel(), |
|
56 "keywords": QLabel(), |
|
57 "security": QLabel(), |
|
58 } |
|
59 for label in self.__infoLabels.values(): |
|
60 label.setWordWrap(True) |
|
61 self.__layout.addRow(self.tr("File Path:"), self.__infoLabels["filePath"]) |
|
62 self.__layout.addRow(self.tr("File Size:"), self.__infoLabels["fileSize"]) |
|
63 self.__layout.addRow(self.tr("Title:"), self.__infoLabels["title"]) |
|
64 self.__layout.addRow(self.tr("Subject:"), self.__infoLabels["subject"]) |
|
65 self.__layout.addRow(self.tr("Author:"), self.__infoLabels["author"]) |
|
66 self.__layout.addRow(self.tr("Created with:"), self.__infoLabels["creator"]) |
|
67 self.__layout.addRow(self.tr("Creator:"), self.__infoLabels["producer"]) |
|
68 self.__layout.addRow(self.tr("Pages:"), self.__infoLabels["pages"]) |
|
69 self.__layout.addRow(self.tr("Created at:"), self.__infoLabels["creationDate"]) |
|
70 self.__layout.addRow( |
|
71 self.tr("Last Modified at:"), self.__infoLabels["modificationDate"] |
|
72 ) |
|
73 self.__layout.addRow(self.tr("Keywords:"), self.__infoLabels["keywords"]) |
|
74 self.__layout.addRow(self.tr("Security:"), self.__infoLabels["security"]) |
|
75 #self.__layout.addRow(self.tr(""), self.__infoLabels[""]) |
|
76 # TODO: add more info labels |
|
77 |
|
78 self.setLayout(self.__layout) |
|
79 |
|
80 self.__document.statusChanged.connect(self.__populateInfoLabels) |
|
81 self.__document.pageCountChanged.connect(self.__handlePageCountChanged) |
|
82 self.__document.passwordChanged.connect(self.__handlePasswordChanged) |
|
83 |
|
84 @pyqtSlot(QPdfDocument.Status) |
|
85 def __populateInfoLabels(self, status): |
|
86 """ |
|
87 Private slot to populate the info labels upon a change of the document status. |
|
88 |
|
89 @param status document status |
|
90 @type QPdfDocument.Status |
|
91 """ |
|
92 ready = status == QPdfDocument.Status.Ready |
|
93 |
|
94 self.__infoLabels["title"].setText( |
|
95 self.__document.metaData(QPdfDocument.MetaDataField.Title) if ready else "" |
|
96 ) |
|
97 self.__infoLabels["subject"].setText( |
|
98 self.__document.metaData(QPdfDocument.MetaDataField.Subject) |
|
99 if ready |
|
100 else "" |
|
101 ) |
|
102 self.__infoLabels["author"].setText( |
|
103 self.__document.metaData(QPdfDocument.MetaDataField.Author) if ready else "" |
|
104 ) |
|
105 self.__infoLabels["creator"].setText( |
|
106 self.__document.metaData(QPdfDocument.MetaDataField.Creator) |
|
107 if ready |
|
108 else "" |
|
109 ) |
|
110 self.__infoLabels["producer"].setText( |
|
111 self.__document.metaData(QPdfDocument.MetaDataField.Producer) |
|
112 if ready |
|
113 else "" |
|
114 ) |
|
115 self.__infoLabels["pages"].setText( |
|
116 str(self.__document.pageCount()) if ready else "" |
|
117 ) |
|
118 self.__infoLabels["creationDate"].setText( |
|
119 self.__document.metaData(QPdfDocument.MetaDataField.CreationDate).toString( |
|
120 "yyyy-MM-dd hh:mm:ss t" |
|
121 ) if ready |
|
122 else "" |
|
123 ) |
|
124 self.__infoLabels["modificationDate"].setText( |
|
125 self.__document.metaData( |
|
126 QPdfDocument.MetaDataField.ModificationDate |
|
127 ).toString("yyyy-MM-dd hh:mm:ss t") |
|
128 if ready |
|
129 else "" |
|
130 ) |
|
131 self.__infoLabels["keywords"].setText( |
|
132 self.__document.metaData(QPdfDocument.MetaDataField.Keywords) |
|
133 if ready |
|
134 else "" |
|
135 ) |
|
136 |
|
137 if ready: |
|
138 self.__handlePasswordChanged() |
|
139 else: |
|
140 self.__infoLabels["security"].setText("") |
|
141 |
|
142 @pyqtSlot(int) |
|
143 def __handlePageCountChanged(self, pageCount): |
|
144 """ |
|
145 Private slot to handle a change of the page count. |
|
146 |
|
147 @param pageCount changed page count |
|
148 @type int |
|
149 """ |
|
150 self.__infoLabels["pages"].setText(str(pageCount)) |
|
151 |
|
152 @pyqtSlot() |
|
153 def __handlePasswordChanged(self): |
|
154 """ |
|
155 Private slot to handle a change of the password. |
|
156 """ |
|
157 self.__infoLabels["security"].setText( |
|
158 self.tr("Encrypted") |
|
159 if self.__document.password() |
|
160 else self.tr("Not Encrypted") |
|
161 ) |
|
162 |
|
163 def setFileName(self, filename): |
|
164 """ |
|
165 Public method to set the file name info. |
|
166 |
|
167 @param filename DESCRIPTION |
|
168 @type TYPE |
|
169 """ |
|
170 self.__infoLabels["filePath"].setText(filename) |
|
171 if filename: |
|
172 fi = QFileInfo(filename) |
|
173 fileSize = fi.size() |
|
174 self.__infoLabels["fileSize"].setText(dataString(fileSize)) |
|
175 else: |
|
176 self.__infoLabels["fileSize"].setText("") |