Проблема с объединением файлов .png в .pdf через подушку 6.0.0 в Odoo 12 (CE) - PullRequest
0 голосов
/ 29 июня 2019

В пользовательском модуле для Odoo 12 CE я расширил класс sale.order.line и добавил функцию, которая объединяет отдельные изображения .png в один файл .pdf. Для этой задачи я использую библиотеку Pillow 6.0.0.

image_files = [<PIL.Image.Image image mode=RGB size=800x1400 at 0x118295908>, <PIL.Image.Image image mode=RGB size=800x1400 at 0x118295B38>]
filename = "test.pdf"
image_files[0].save(filename, "PDF", resolution=100.0, save_all=True, append_images=image_files[1:])

Я добавил этот метод к кнопке в order_line_form, но когда я нажал на нее, я получил сообщение об ошибке:

 File ".../models/sale_order_line.py", line 261, in generateLabel
    image_files[0].save(filename, "PDF", resolution=100.0, save_all=True, append_images=image_files[1:])
  File "/...virt/lib/python3.7/site-packages/PIL/Image.py", line 1994, in save
    save_handler = SAVE_ALL[format.upper()]
KeyError: 'PDF'

Устранение неполадок: я создал тестовый .py проект за пределами Odoo, где я протестировал эту функцию, используя ту же виртуальную среду с теми же пакетами, и она работает, как и ожидалось: все файлы png объединены в один файл PDF.

почему он не работает, когда я запускаю его из модуля Odoo?

1 Ответ

1 голос
/ 05 июля 2019

Я не имею понятия использовать для подушки, но я использовал FPDF, который должен преобразовать в png в pdf.

import os
from odoo.tools import pdf
from fpdf import FPDF
import base64
from odoo import models, fields, api, _
from odoo.exceptions import Warning, ValidationError


@api.multi
def download_labels(self):
    self.ensure_one()
    try:
        file_path = "/tmp/waves/"
        directory = os.path.dirname(file_path)
        os.stat(directory)
        os.system("mkdir %s" % (file_path))
        # "P" indiacte Portal page for pdf , mm indicate
        pdf_info = FPDF('P', 'mm', (297, 210))
        pdf_datas = []
        for line in self.order_line:
            # Create Directory -
            file_name = line.name
            file_name = file_name.replace('/', '_')
            attachment_id = self.env['ir.attachment'].search([('res_id', '=', line.id), ('res_model', '=', line._name)], limit=1)
            file_extension = attachment_id.name.split('.')[1] if attachment_id.name.split('.')[1] else "pdf"
            if attachment_id:
                if file_extension in ['pdf', 'PDF']:
                    pdf_datas.append(base64.decodestring(attachment_id.datas))
                    continue
                with open("%s%s.%s" % (file_path, file_name, file_extension), "wb") as f:
                    f.write(base64.decodestring(attachment_id.datas))
                pdf_info.add_page()
                pdf_info.image("%s%s.%s" % (file_path, file_name, file_extension), 1, 1, 296, 209)

        if pdf_datas:
            message_ept = (_("All shipment label combined!"))
            message = self.message_post(body=message_ept, attachments=[('Label-%s.%s' % (self.id, 'PDF'), pdf.merge_pdf(pdf_datas))])
            return {
                'type': 'ir.actions.act_url',
                'url': '/web/binary/download_document?model=ir.attachment&field=datas&id=%s&filename=%s.pdf' % ( message.attachment_ids[0].id, self.name.replace('/', '_')),
                'target': 'self',
            }

        pdf_info.output("%s%s.pdf" % (file_path, self.name.replace('/', '_')), "F")

        binary_package = open("%s%s.pdf" % (file_path, self.name.replace('/', '_')), 'rb').read()
        os.system("rm -R %s" % (directory))
        message_ept = (_("label combined!"))
        message = self.message_post(body=message_ept, attachments=[("%s.pdf" % (self.name.replace('/', '_')), binary_package)])
        return {
            'type': 'ir.actions.act_url',
            'url': '/web/binary/download_document?model=ir.attachment&field=datas&id=%s&filename=%s.pdf' % ( message.attachment_ids[0].id, self.name.replace('/', '_')),
            'target': 'self',
        }
    except Exception as e:
        raise ValidationError(e)
...