TypeError: требуется байтоподобный объект, а не 'Drawing' - PullRequest
3 голосов
/ 16 марта 2020

Я пытаюсь преобразовать альфа-нумери c значение в PNG, а затем в формат ZPL. У них обоих разные библиотеки, и при самостоятельном использовании они работают нормально. Посмотрите на код:

from base64 import b64encode
from reportlab.lib import units
from reportlab.graphics import renderPM
from reportlab.graphics.barcode import createBarcodeDrawing
from reportlab.graphics.shapes import Drawing
import os

def get_barcode(value, width, barWidth = 0.05 * units.inch, fontSize = 30, humanReadable = True):

    barcode = createBarcodeDrawing('Code128', value = value, barWidth = barWidth, fontSize = fontSize)

    drawing_width = width
    barcode_scale = drawing_width / barcode.width
    drawing_height = barcode.height * barcode_scale
    drawing = Drawing(drawing_width, drawing_height)
    drawing.scale(barcode_scale, barcode_scale)
    drawing.add(barcode, name='barcode')

    return drawing

sku = []      #rough data
path = r'C:\Users\Rahul\Desktop\Barcodes'
for i in range(0,10):
    sku.append('A10{}'.format(i)) 

for i in sku:
    barcode = get_barcode(value = i, width = 600)
    barcode.save(formats=['PNG'],outDir=path,fnRoot=i)

Это генерирует штрих-коды в формате PNG, и теперь преобразование в ZPL выглядит следующим образом:

from zplgrf import GRF
with open(r'C:\Users\Rahul\Desktop\Barcodes\A100.png','rb') as image:
    grf = GRF.from_image(image.read(), 'DEMO')
grf.optimise_barcodes()
print(grf.to_zpl())

Вывод:

~DGR:DEMO.GRF,5400,75,:Z64:eJztlrENxSAMRI8qJSMwCpv9hM0YhRFSUnxxQelSfn0jEXQuaECW3/kMAHdsTBUfwNWQEQhEeDbEtmVHJhZXEVn2b1+ZydI8j36whr6HR3i7VIZV/ZPqXB3QsIPnsKomARznKwEKUIACFOAkWgnwdYCGFl3+JyPAtwMaVqVnQreoZnAqX60HOE6r9QANO6gZ/F2rCxESD8A=:4C36^XA^MMC,Y^PON^MNY^FO0,0^XGR:DEMO.GRF,1,1^FS^PQ1,0,0,N^XZ^XA^IDR:DEMO.GRF^FS^XZ

Что я хочу сделать, это исключить процесс сохранения файла, а затем снова прочитать его для преобразования, поэтому я сделал это:

for i in sku:
    barcode = get_barcode(value = i, width = 600)
    barcode.save(formats=['PNG'],fnRoot=i)
    print(barcode)
    grf = GRF.from_image(barcode, 'DEMO')
    grf.optimise_barcodes()
    print(grf.to_zpl())

, но я получаю следующую ошибку:

TypeError: требуется байтоподобный объект, а не 'Drawing'

Как преобразовать следующий объект в "байтовоподобный" объект ??

<reportlab.graphics.shapes.Drawing object at 0x000001BF2C59DF28>

Ошибка :

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-14-2b88439d6661> in <module>
      3     barcode.save(formats=['PNG'],fnRoot=i)
      4     print(barcode)
----> 5     grf = GRF.from_image(barcode, 'DEMO')
      6     grf.optimise_barcodes()
      7     print(grf.to_zpl())

~\Anaconda3\lib\site-packages\zplgrf\__init__.py in from_image(cls, image, filename)
    354         """
    355 
--> 356         source = Image.open(BytesIO(image))
    357         source = source.convert('1')
    358         width = int(math.ceil(source.size[0] / 8.0))

TypeError: a bytes-like object is required, not 'Drawing'

1 Ответ

3 голосов
/ 16 марта 2020

Чтобы вызвать GRF.from_image, вам нужно передать байтовый объект. В настоящее время вы сохранили Drawing в виде png-файла, а затем передали эту функцию. Вместо этого вы должны открыть сохраненный png-файл и передать прочитанный объект в from_image, например:

with open(barcode_file, "rb") as image:
    grf = GRF.from_image(image.read(), "DEMO")
os.remove(barcode_file)

, где barcode_file - это путь, по которому был сохранен ваш Drawing. os.remove можно использовать для удаления временного файла после его прочтения.

Чтобы избежать создания временного файла, подобного этому, вы можете использовать метод asString класса Drawing и передать результат до from_image:

grf = GRF.from_image(barcode.asString("png"), "DEMO")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...