Расположите номер под штрих-кодом, используя pyBarcode - PullRequest
5 голосов
/ 07 июля 2011

Я использую pyBarcode для генерации PNG, а число под штрих-кодом обрезается справа. Как мне подтолкнуть оставленные несколько пикселей?

the number is getting cut off

Согласно документации мне нужно сделать что-то вроде этого:

barcode.writer.BaseWriter(paint_text=my_callback)

И определить обратный вызов следующим образом:

my_callback(xpos, ypos)

и

use self.text as text

Как именно я могу применить все это к моему представлению Django (ниже)?

def barcode(request):
    import barcode
    from barcode.writer import ImageWriter
    from cStringIO import StringIO

    def mm2px(mm, dpi=300):
        return (mm * dpi) / 25.4

    class MyImageWriter(ImageWriter):
        def calculate_size(self, modules_per_line, number_of_lines, dpi=300):
            width = 2 * self.quiet_zone + modules_per_line * self.module_width
            height = 1.0 + self.module_height * number_of_lines
            if self.text:
                height += (self.font_size + self.text_distance) / 3

            return int(mm2px(width, dpi)), int(mm2px(height, dpi))

    f = BarcodeForm(request.GET)
    if f.is_valid():
        try:
            i = StringIO()
            bc_factory = barcode.get_barcode_class(f.PYBARCODE_TYPE[f.cleaned_data['barcode_type']])
            bc_factory.default_writer_options['quiet_zone'] = 1.0
            bc_factory.default_writer_options['text_distance'] = 1.0
            bc_factory.default_writer_options['module_height'] = 15.0
            bc_factory.default_writer_options['module_width'] = 0.3
            bc_factory.default_writer_options['font_size'] = 46

            bc = bc_factory(f.cleaned_data['text'], writer=MyImageWriter())
            bc.write(i)
            return HttpResponse(i.getvalue(), mimetype='image/png')
        except Exception, e:
            return HttpResponseBadRequest(str(e))
    else:
        return HttpResponseBadRequest('Missing text or unsupported barcode type: %s' % f.errors)

1 Ответ

1 голос
/ 07 июля 2011

Изменить: После ответа я заметил, что у вас есть завод, который устанавливает quiet_zone на 1.0. Измените это обратно на 6.5, и я думаю, что это будет хорошо выглядеть.

Edit2: я неправильно понял, с какой именно проблемой вы столкнулись.

По какой-либо причине автор pyBarcode помещает текст по центру штрих-кода. Когда метод рендеринга вызывает _paint_text(), он переходит в xpos/2, что устанавливает его в середине штрих-кода. Я думаю, что это нормально с шрифтом по умолчанию, который он использует, но когда вы увеличили шрифт, он больше не подходит.

Вместо этого я смог разместить его на левой стороне, переопределив метод _paint_text(). В последней строке ниже переменная pos - это просто кортеж, содержащий координаты (x, y), которые сообщают PIL, где рисовать текст на штрих-коде. Итак, я убедился, что х выровнен со штрих-кодом. Если вам нужно, чтобы он был выровнен по правому краю, вы можете поиграть с переменной xpos, чтобы получить ее там, где вам нужно.

Дайте этому шанс:

class MyImageWriter(ImageWriter):
    def calculate_size(self, modules_per_line, number_of_lines, dpi=300):
        width = 2 * self.quiet_zone + modules_per_line * self.module_width
        height = 1.0 + self.module_height * number_of_lines
        if self.text:
            height += (self.font_size + self.text_distance) / 3

        return int(mm2px(width, dpi)), int(mm2px(height, dpi))

    def _paint_text(self, xpos, ypos):
        # this should align your font to the left side of the bar code:
        xpos = self.quiet_zone
        pos = (mm2px(xpos, self.dpi), mm2px(ypos, self.dpi))
        font = ImageFont.truetype(FONT, self.font_size)
        self._draw.text(pos, self.text, font=font, fill=self.foreground)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...