Статьи

Как создавать штрих-коды в ваших PDF с Python

Библиотека Reportlab — отличный способ создания PDF-файлов на Python. Недавно я заметил, что в нем есть возможность делать штрих-коды. Я слышал о том, что он может генерировать QR-коды, но я действительно не копался под одеялом, чтобы посмотреть, что еще он мог сделать. В этом руководстве мы рассмотрим некоторые штрих-коды, которые может генерировать Reportlab. Если у вас еще нет Reportlab, зайдите на их сайт  и получите его, прежде чем перейти к  статье.

Библиотека штрихкодов Reportlab

Reportlab предоставляет несколько различных типов штрих-кодов: code39 (т.е. код 3 из 9), code93, код 128, EANBC, QR и USPS. Я также видел одно под названием «четыре состояния», но я не мог понять, как заставить его работать. Под некоторыми из этих типов есть подтипы, такие как Стандарт, Расширенный или Мультиширина. Мне не очень повезло заставить MultiWidth работать с штрих-кодом code128, поскольку он постоянно выдавал мне ошибку атрибута, поэтому мы просто проигнорируем это. Если вы знаете, как это сделать, напишите мне в комментариях или через мою контактную форму и дайте мне знать. Я обновлю статью, если кто-нибудь может показать мне, как добавить этот или четырехсторонний штрих-код.

В любом случае, лучший способ научиться — это просто написать код. Вот довольно простой пример:

from reportlab.graphics.barcode import code39, code128, code93
from reportlab.graphics.barcode import eanbc, qr, usps
from reportlab.graphics.shapes import Drawing 
from reportlab.lib.pagesizes import letter
from reportlab.lib.units import mm
from reportlab.pdfgen import canvas
from reportlab.graphics import renderPDF
 
#----------------------------------------------------------------------
def createBarCodes():
    """
    Create barcode examples and embed in a PDF
    """
    c = canvas.Canvas("barcodes.pdf", pagesize=letter)
 
    barcode_value = "1234567890"
 
    barcode39 = code39.Extended39(barcode_value)
    barcode39Std = code39.Standard39(barcode_value, barHeight=20, stop=1)
 
    # code93 also has an Extended and MultiWidth version
    barcode93 = code93.Standard93(barcode_value)
 
    barcode128 = code128.Code128(barcode_value)
    # the multiwidth barcode appears to be broken 
    #barcode128Multi = code128.MultiWidthBarcode(barcode_value)
 
    barcode_usps = usps.POSTNET("50158-9999")
 
    codes = [barcode39, barcode39Std, barcode93, barcode128, barcode_usps]
 
    x = 1 * mm
    y = 285 * mm
    x1 = 6.4 * mm
 
    for code in codes:
        code.drawOn(c, x, y)
        y = y - 15 * mm
 
    # draw the eanbc8 code
    barcode_eanbc8 = eanbc.Ean8BarcodeWidget(barcode_value)
    bounds = barcode_eanbc8.getBounds()
    width = bounds[2] - bounds[0]
    height = bounds[3] - bounds[1]
    d = Drawing(50, 10)
    d.add(barcode_eanbc8)
    renderPDF.draw(d, c, 15, 555)
 
    # draw the eanbc13 code
    barcode_eanbc13 = eanbc.Ean13BarcodeWidget(barcode_value)
    bounds = barcode_eanbc13.getBounds()
    width = bounds[2] - bounds[0]
    height = bounds[3] - bounds[1]
    d = Drawing(50, 10)
    d.add(barcode_eanbc13)
    renderPDF.draw(d, c, 15, 465)
 
    # draw a QR code
    qr_code = qr.QrCodeWidget('www.mousevspython.com')
    bounds = qr_code.getBounds()
    width = bounds[2] - bounds[0]
    height = bounds[3] - bounds[1]
    d = Drawing(45, 45, transform=[45./width,0,0,45./height,0,0])
    d.add(qr_code)
    renderPDF.draw(d, c, 15, 405)
 
    c.save()
 
if __name__ == "__main__":
    createBarCodes()

Давайте разберемся с этим немного. Код39.Extended39 на самом деле не принимает ничего, кроме самого значения. С другой стороны, code39.Standard39, code93.Standard93 и code128.Code128 имеют в основном один и тот же API. Вы можете изменить barWidth, barHeight, включить символы запуска / остановки и добавить «тихие» зоны. Модуль штрих-кода usps предоставляет два типа штрих-кода: FIM и POSTNET. FIM или Faceing ID Marks кодируют только одну букву (AD), которая лично мне не показалась очень интересной. Поэтому я просто показываю версию POSTNET, которая должна быть довольно знакома людям в Соединенных Штатах, так как она отображается внизу большинства конвертов. POSTNET кодирует почтовый индекс!

Следующие три штрих-кода используют другой API для рисования их в PDF, который я обнаружил через StackOverflow . По сути, вы создаете   объект Drawing определенного размера, а затем добавляете штрих-код к чертежу. Наконец, вы используете   модуль renderPDF для размещения чертежа в PDF. Это довольно запутанно, но работает довольно хорошо. Коды EANBC — это коды, которые вы можете увидеть на некоторых промышленных изделиях, таких как салфетки.

Если вы хотите увидеть результат кода выше, вы можете скачать PDF  здесь .

Завершение

На этом этапе вы сможете создавать собственные штрих-коды в своих PDF-файлах. Reportlab довольно удобен, и я надеюсь, что этот дополнительный инструмент окажется полезным в ваших начинаниях.

Дополнительное Чтение

Получить источник!