Проблема размера страницы PDF создание штрих-кодов с помощью reportlab

Хорошо, сегодня я создал скрипт, который принимает номер элемента или любой номер для этой цели, чтобы сгенерировать штрих-код. Теперь я хотел напечатать 60 одинаковых штрих-кодов в 4 столбцах, что сделало бы его матрицей (15 X 4), что облегчило бы понимание. Теперь я успешно добился этого со страницей нестандартного размера (900 * 850) и уместил 15 строк и 4 столбца штрих-кодов, сгенерированных reportlab code128.

Вот код:

from reportlab.graphics.barcode import code128
from reportlab.lib.units import mm
from reportlab.pdfgen import canvas

#----------------------------------------------------------------------#
def createBarCodes():
    codeName = "NOT_C17"

    c = canvas.Canvas(codeName+".pdf")
    c.setPageSize((900, 850))

    barcode_value = codeName
    barcode128 = code128.Code128(
                            barcode_value,
                            barHeight=20,
                            barWidth=1.05,
                            fontSize=15,
                            humanReadable = True
                        )

    x = 15 * mm
    for i in range(4):
        y = 275 * mm
        i=0
        while i < 15:
            barcode128.drawOn(c, x, y)
            y = y - 18 * mm
            i+=1
        x=x+(70*mm)
    c.save()

if __name__ == "__main__":
    createBarCodes()

Файл, сгенерированный этим скриптом

Проблема в том, что теперь я могу использовать только размер US Letter и никакие другие нестандартные размеры. Я пробовал несколько вариантов, но ни один не работал.

Пытается:

from reportlab.lib.pagesizes import letter
c = canvas.Canvas(codeName+".pdf", pagesize=letter)

barcode_value = codeName
barcode128 = code128.Code128(
                          barcode_value,
                          barHeight=16.7564*mm,
                          barWidth=44.45*mm,
                          fontSize=15,
                          humanReadable = True
                     )

x = 7.526 * mm
for i in range(4):
    y = 265.524 * mm
    i=0
    while i < 15:
        barcode128.drawOn(c, x, y)
        y = y - 18 * mm
        i+=1
        break
    x=x+(70*mm)
    break
c.save()

и здесь — требуемый формат, в который он должен вписываться. Было бы неплохо помочь.


person R0SENAM    schedule 23.06.2017    source источник


Ответы (1)


Ваш код требует много улучшений

  1. Используйте размер букв from reportlab.lib.pagesizes import letter
  2. Установите поля и другие переменные, как указано в документе:

    margin_x        =  7.526
    margin_y        =  13.876
    padding_x       =  7.526
    font_size       =  15
    width, height   =  letter
    
  3. Рассчитать общий размер сгенерированной кодовой строки

    bars_width   = (float(width-margin_x*2)-3*padding_x)/4
    bars_height  = float(height-margin_y*2)/15
    
  4. Значение ширины, передаваемое функции Code128, представляет собой ширину одной полосы в кодовой строке, а не всей кодовой строки, вы должны держать это значение ниже 1,1.

    bar_height   = bars_height - font_size
    bar_width    = 1
    
  5. ваши петли были бы лучше так:

    for i in range(0,4):
        for j in range(0,15):
            x = margin_x + i * (bars_width+padding_x)
            y = margin_y + j * bars_height
            barcode128.drawOn(c, x , y)
    
  6. это окончательный сценарий:

    from reportlab.graphics.barcode import code128
    from reportlab.lib.units import mm
    from reportlab.pdfgen import canvas
    from reportlab.lib.pagesizes import letter
    
    #----------------------------------------------------------------------#
    def createBarCodes():
        codeName = "NOT_C17"
    
        c = canvas.Canvas(codeName+".pdf",pagesize=letter)
    
        margin_x        =  7.526
        margin_y        =  13.876
        padding_x       =  7.526
        font_size       =  15
        width, height   =  letter
        extra_padding   =  20
    
        bars_width   = (float(width-margin_x*2)-3*padding_x)/4
        bars_height  = float(height-margin_y*2)/15
    
        bar_height   = bars_height - font_size
        #For alphanumeric values, the total number of bars is calculated as:
        #total = (11*string_length+35)
        bar_width    = (bars_width-extra_padding)/(len(codeName)*11+35)
    
    
        barcode_value = codeName
        barcode128 = code128.Code128(
                                barcode_value,
                                barHeight=bar_height,
                                barWidth=bar_width,
                                humanReadable = True
                            )
    
        for i in range(0,4):
            for j in range(0,15):
                x = margin_x + i * (bars_width+padding_x)
                y = margin_y + j * bars_height
                barcode128.drawOn(c, x , y)
    
        c.save()
    
    if __name__ == "__main__":
        createBarCodes()
    
person SEDaradji    schedule 23.06.2017
comment
Ваш код идеален, но только с codeName=NOT_C17. Я устал с несколькими другими, и результат был испорчен, не могли бы вы сообщить мне, что нужно сделать, чтобы ограничить штрих-код, чтобы он соответствовал заданному размеру блока. Пожалуйста, попробуйте с NOT_C17 или HDW_32-0.125. Этот последний довольно испорчен, когда я попробовал его. Благодарность - person R0SENAM; 24.06.2017