akmi-utilities/widget.py
Argiris Deligiannidis e1d238c321
All checks were successful
continuous-integration/drone/tag Build is passing
continuous-integration/drone/push Build is passing
open with utf-8 encoding
2024-07-12 01:47:41 +03:00

142 lines
5.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# This Python file uses the following encoding: utf-8
import os
import io
import sys
import csv
import shutil
from PyPDF2 import PdfReader, PdfWriter
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from PySide6.QtWidgets import QApplication, QWidget, QFileDialog
from PySide6.QtCore import QFile, QIODevice
# Important:
# You need to run the following command to generate the ui_form.py file
# pyside6-uic form.ui -o ui_form.py, or
# pyside2-uic form.ui -o ui_form.py
from ui_form import Ui_Widget
import rc_resources
class Widget(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.ui = Ui_Widget()
self.ui.setupUi(self)
self.setWindowTitle("AKMI Utilities")
self.ui.file_selector.clicked.connect(self.file_selector)
self.ui.file_template.clicked.connect(self.file_template)
self.ui.create_button.clicked.connect(self.create_button)
self.selected_file = False
self.selected_template = False
self.filepath_template = ""
self.filepath = ""
self.img_dir = os.path.join(os.path.dirname(__file__), "images")
self.font_dir = os.path.join(os.path.dirname(__file__), "FONTS")
def qrc_to_bytes(self, filename):
file = QFile(filename)
if not file.open(QIODevice.ReadOnly):
raise RuntimeError(file.errorString())
return
f = io.BytesIO(file.readAll().data())
return f
def enable_create(self):
if self.selected_file and self.selected_template:
self.ui.create_button.setEnabled(True)
def file_selector(self):
self.filepath = QFileDialog.getOpenFileName(self, "Επιλογή Αρχείου")
if self.filepath[0]:
ext = os.path.splitext(self.filepath[0])[-1].lower()
if ext != ".csv":
self.ui.label_3.setText("Το αρχείο πρέπει να είναι της μορφής .csv")
self.selected_file = False
else:
self.ui.label_3.setText("{}".format(self.filepath[0]))
self.selected_file = True
self.in_file = self.filepath[0]
self.file_path = os.path.dirname(self.filepath[0])
self.enable_create()
def file_template(self):
self.filepath_template = QFileDialog.getOpenFileName(self, "Επιλογή Αρχείου")
if self.filepath_template[0]:
ext = os.path.splitext(self.filepath_template[0])[-1].lower()
if ext != ".pdf":
self.ui.label_4.setText("Το αρχείο πρέπει να είναι της μορφής .pdf")
self.selected_template = False
else:
self.ui.label_4.setText("{}".format(self.filepath_template[0]))
self.selected_template = True
self.in_template = self.filepath_template[0]
self.template_path = os.path.dirname(self.filepath_template[0])
self.enable_create()
def create_button(self):
with open(self.in_file, encoding='utf-8') as fin:
csvin = csv.DictReader(fin)
self.create_certificates(csvin)
def create_certificates(self, csv_dict):
count = 0
shutil.copyfile(
"{}".format(self.filepath_template[0]),
"{}/RESULT.pdf".format(self.file_path),
)
for in_row in csv_dict:
count += 1
packet = io.BytesIO()
pdfmetrics.registerFont(
TTFont("NotoMedium", self.qrc_to_bytes(":/FONTS/NotoSans-Medium.ttf"))
)
pdfmetrics.registerFont(
TTFont(
"NotoSemiMedium",
self.qrc_to_bytes(":/FONTS/NotoSans-SemiCondensedMedium.ttf"),
)
)
# pdfmetrics.registerFont(TTFont('NotoRegular', '{}/NotoSans-Regular.ttf'.format(self.font_dir)))
# pdfmetrics.registerFont(TTFont('NotoBold', '{}/NotoSans-Bold.ttf'.format(self.font_dir)))
# pdfmetrics.registerFont(TTFont('NotoSemi', '{}/NotoSans-SemiCondensed.ttf'.format(self.font_dir)))
# pdfmetrics.registerFont(TTFont('NotoSemiMedium', '{}/NotoSans-SemiCondensedMedium.ttf'.format(self.font_dir)))
can = canvas.Canvas(packet, pagesize=A4)
can.setFont("NotoMedium", 22)
x = can._pagesize[0] / 2
can.drawString(x, 315, "{} {}".format(in_row["SURNAME"], in_row["NAME"]))
can.setFont("NotoSemiMedium", 18)
can.drawString(x, 250, "{}".format(in_row["DEPARTMENT"]))
can.save()
packet.seek(0)
new_pdf = PdfReader(packet)
existing_pdf = PdfReader(open("{}/RESULT.pdf".format(self.file_path), "rb"))
output = PdfWriter()
for page in existing_pdf.pages:
output.add_page(page)
page = existing_pdf.pages[0]
page.merge_page(new_pdf.pages[0])
output.add_page(page)
outputStream = open("{}/RESULT.pdf".format(self.file_path), "wb")
output.write(outputStream)
outputStream.close()
self.ui.label_4.setText(
"Το αρχείο PDF δημιουργήθηκε εντός του φακέλου του .csv"
)
self.ui.create_button.setEnabled(False)
if __name__ == "__main__":
app = QApplication(sys.argv)
widget = Widget()
widget.show()
sys.exit(app.exec())