Проблема с созданием pdf файла из сконвертированного в exe проекта python
Столкнулся со следующей проблемой. В проекте создаю pdf файлы. В главном модуле (main.py) есть функция (def otchet_kassira), которая собирает исходные данные и запускает другую функцию (def otchet_kassira), создающую pdf.
def otchet_kassira(self):
"""Формирование отчета кассира"""
logger.info("Inside the function def otchet_kassira")
path = "./otchet.pdf"
path = os.path.realpath(path)
"""Удаляем предыдущий файл"""
row_tab_1 = self.ui.tableWidget_3.rowCount()
row_tab_2 = self.ui.tableWidget_4.rowCount()
if row_tab_1 >= 1 and row_tab_2 >= 1:
os.system("TASKKILL /F /IM SumatraPDF.exe")
if os.path.exists(path):
os.remove(path)
dt1 = self.ui.dateEdit_2.date().toString("dd-MM-yyyy")
dt2 = self.ui.dateEdit.date().toString("dd-MM-yyyy")
# формируем данные
logger.info(self.ui.tableWidget_3.item(0, 0).text())
logger.info(System.pc_name)
if System.pc_name == self.ui.tableWidget_4.item(0, 0).text():
values = [self.ui.tableWidget_4.item(0, 1).text(),
self.ui.tableWidget_4.item(0, 2).text()]
else:
values = [self.ui.tableWidget_4.item(1, 1).text(),
self.ui.tableWidget_4.item(1, 2).text()]
logger.info(values)
otchet.otchet_kassira(values, dt1, dt2, System.user)
os.startfile(path)
def otchet_kassira(val, date1, date2, kassir):
"""Формирование отчета кассира"""
path = "./otchet.pdf"
values, dt1, dt2, user = val, date1, date2, kassir
print('values', values)
c = canvas.Canvas(path, pagesize=A4)
c.setLineWidth(.3)
pdfmetrics.registerFont(TTFont('DejaVuSerif', 'files/DejaVuSerif.ttf'))
c.setFont('DejaVuSerif', 12)
c.drawString(30, 800, 'Организация')
c.drawString(30, 785, 'АО "Рога и копыта"')
c.drawString(450, 800, "Приложение №1")
c.drawString(255, 685, 'Отчет кассира')
c.drawString(255, 670, 'по оказанным услугам')
if dt1 == dt2:
c.drawString(255, 655, f"за {dt1}")
else:
c.drawString(255, 655, f"за {dt1} - {dt2}")
# рисуем линию
c.setLineWidth(1)
c.line(275, 652, 430, 652)
# ФИО персонала
c.drawString(255, 623, f"{user[0]} {user[1]}")
c.setLineWidth(1)
c.line(100, 621, 500, 621)
c.setFont('DejaVuSerif', 8)
c.drawString(255, 610, 'ФИО кассира')
data = [['№ п/п', 'Тип\nпродажи', 'Сумма, руб.'],
['1', 'Банковская карта', values[0]],
['2', 'Наличные', values[1]],
['3', 'Итого', int(values[0]) + int(values[1])]]
t = Table(data, 4 * [1.2 * inch], 4 * [0.3 * inch])
t.setStyle(TableStyle([('FONT', (0, 0), (4, 4), 'DejaVuSerif', 8),
('INNERGRID', (0, 0), (-1, -1), 0.2, colors.black),
('BOX', (0, 0), (-1, -1), 0.2, colors.black)]))
# wrap the table to this width, height in case it spills
t.wrapOn(c, 100 * mm, 180 * mm)
# draw it on our pdf at x,y
t.drawOn(c, 20 * mm, 170 * mm)
# отчет сдал
c.drawString(30, 310, 'Отчет сдал:')
c.drawString(30, 290, 'Кассир')
c.setLineWidth(1)
c.line(150, 290, 240, 290)
c.setFont('DejaVuSerif', 8)
c.drawString(165, 282, 'Подпись')
c.line(300, 290, 390, 290)
c.setFont('DejaVuSerif', 8)
c.drawString(315, 282, 'Расшифровка')
# отчет принял
c.drawString(30, 210, 'Отчет принял:')
c.drawString(30, 190, 'Старший администратор')
c.setLineWidth(1)
c.line(150, 190, 240, 190)
c.setFont('DejaVuSerif', 8)
c.drawString(175, 182, 'Подпись')
c.line(300, 190, 390, 190)
c.setFont('DejaVuSerif', 8)
c.drawString(325, 182, 'Расшифровка')
c.showPage()
c.save()
Из отдельного .py файла otchet.pdf создается. Если сконвертировать .py в exe, то тоже все в порядке. Удаление файла (os.remove(path)) происходит корректно. Если закомментировать удаление отчета и запустить готовый файл otchet.pdf командой os.startfile(path), то он открывается корректно. Не пойму в чем может быть дело. Если же переименовать main.py в main.pyw, то все работает. Но хотелось бы оградить пользователя от файла с исходным кодом и не ставить python рабочую станцию. Конвертирую проект в exe при помощи auto-py-to-exe (это gui к pyinstaller). json файл с параметрами конвертации.
{
"version": "auto-py-to-exe-configuration_v1",
"pyinstallerOptions": [
{
"optionDest": "noconfirm",
"value": true
},
{
"optionDest": "filenames",
"value": "C:/Project/main.py"
},
{
"optionDest": "onefile",
"value": false
},
{
"optionDest": "console",
"value": false
},
{
"optionDest": "icon_file",
"value": "C:/Project/files/logo.ico"
},
{
"optionDest": "ascii",
"value": false
},
{
"optionDest": "clean_build",
"value": false
},
{
"optionDest": "strip",
"value": false
},
{
"optionDest": "noupx",
"value": false
},
{
"optionDest": "disable_windowed_traceback",
"value": false
},
{
"optionDest": "embed_manifest",
"value": true
},
{
"optionDest": "uac_admin",
"value": false
},
{
"optionDest": "uac_uiaccess",
"value": false
},
{
"optionDest": "win_private_assemblies",
"value": false
},
{
"optionDest": "win_no_prefer_redirects",
"value": false
},
{
"optionDest": "bootloader_ignore_signals",
"value": false
},
{
"optionDest": "datas",
"value": "C:/Project/files/model;model/"
},
{
"optionDest": "datas",
"value": "C:/Project/files/platforms;platforms/"
},
{
"optionDest": "datas",
"value": "C:/Project/config.ini;."
},
{
"optionDest": "datas",
"value": "C:/Project/debug.log;."
},
{
"optionDest": "datas",
"value": "C:/Project/print.cmd;."
},
{
"optionDest": "datas",
"value": "C:/Project/pylogo.png;."
},
{
"optionDest": "datas",
"value": "C:/Project/SumatraPDF.exe;."
},
{
"optionDest": "datas",
"value": "C:/Project/SumatraPDF-settings.txt;."
}
],
"nonPyinstallerOptions": {
"increaseRecursionLimit": true,
"manualArguments": ""
}
}
Вроде бы пустяковое дело - перегнать все в exe, но не могу понять в чем дело. Подскажите, пожалуйста, куда копать?
Ответы (1 шт):
Проблема заключалась в том, что не указал в pyinstaller`e каталог с файлом otchet.py, который генерирует pdf.