Google Chrome 156 byl prohlášen za stabilní. Přehled novinek v poznámkách k vydání. Opraveno bylo 353 bezpečnostních chyb. Vylepšeny byly také nástroje pro vývojáře.
Indická společnost eMudhra po bezpečnostním incidentu, tj. kompromitaci soukromých klíčů osmi mezilehlých certifikátů své certifikační autority, opouští globální byznys s SSL/TLS certifikáty.
Dle Phoronixu zveřejnila společnost Trend Micro prostřednictvím programu Zero Day Initiative (ZDI) několik hlášení bezpečnostních zranitelností přímo na veřejném mailing listu LKML, přestože některé chyby dosud nemají opravu začleněnou do hlavní větve jádra. Mezi hlášenými problémy jsou dvě zranitelnosti s hodnocením CVSS 9.0, týkající se SMB Direct a KSMBD, které mohou umožnit vzdálené spuštění kódu. Další hlášení se týkají … více »
Správce hesel KeePassXC byl vydán ve verzi 2.8.0. Přechází na Qt 6, podporuje vkládání hesel s Waylandem, rychlé odemykání pomocí Polkitu nebo možnost nastavení klávesových zkratek (seznam změn).
Databáze DuckDB (Wikipedie) byla vydána ve verzi 2.0.0 LTS. S kódovým názvem Cinnamon Teal (čírka skořicová). S vyladěným protokolem Quack.
V implementaci Broadcom 802.11 byla zjištěna chyba ve zpracování WPS/EAP, týká se to SDK od roku 2010. Broadcom podle výzkumníka Quentina Kaisera odmítl CVE přidělit. Modemy Huawei a Technicolor jsou používány i v ČR, v LTE routerech, běžných domácích routerech a firemních přístupových bodech, jejich současný počet a zranitelnost konkrétních verzí však zatím neznáme. Více detailů a demo. GitHub / Broadcom 802.11 SDK Detection Toolkit.
Byla vydána nová verze 10.8 z Debianu vycházející linuxové distribuce DietPi pro (nejenom) jednodeskové počítače. Přehled novinek v poznámkách k vydání. Přibyl balíček DietPi WireGuard.
Oslavte vydání openSUSE Leap 16.1 s námi v Praze! Ve středu 4. listopadu 2026 (den po vydání Leapu 16.1) vás zveme na malou oslavu vydání openSUSE Leap 16.1 do pražské kanceláře SUSE. Připravili jsme pro vás dvě krátké přednášky: … více »
Dle plánu bylo PHP vydáno v nových verzích 8.5.12, 8.4.27, 8.3.36 a 8.2.35. Opraveny jsou kritické zranitelnosti CVE-2026-109618 a CVE-2026-109619 aneb PHP2Shell.
UBports, nadace a komunita kolem Ubuntu pro telefony a tablety Ubuntu Touch, vydala Ubuntu Touch 24.04-2.1 a 24.04-1.5. S opravou kritických zranitelností.
Po mém předchozím zápisku o webové aplikaci www.123stitky.cz pro tvorbu adresních štítků dnes rozeberu, jak jsou tyto štítky generovány v Pythonu s použitím knihovny Reportlab. Dostane se nejen na textové štítky, ale i na to, jak do nich vložit QR kód a EAN čárový kód.
Možností, jak programově generovat PDF je celá řada. Ale protože pro mě je Python jazyk, ve kterém píši již 13 let a o kterém jsem před těmi 13 roky psal, je volba jasná.
Reportlab je pythonovský balíček modulů pro programové generování PDF. Kromě odkazované open-source verze (dokumentace, jak jinak, než v PDF) je k dispozici i placená verze, kde se připlácí především za šablonovací systém a podporu.
V dnešní ukázce žádné pokročilé vlastnosti nevyužijeme, proto na Debianu nainstalujeme balíček python-reportlab a kód můžeme rovnou otestovat.
V této jednoduché ukázce si řekneme, jak za použití vlastního TTF fontu vykreslit text odpovídající jednotlivým řádkům štítku, štítku nastavit vlastní velikost a pak do definovaných míst vykreslíme QR kód a EAN čárový kód. Protože vykreslení čárových kódů o přesně daném rozměru není z mého pohledu tak průhledné, jak by mohlo být, ukáži jednoduchou funkci, jak čárový kód ztransformovat tak, aby se vykreslil přesně tam, kam potřebujeme. V následující ukázce následují jednotlivé fragmenty kódu, přičemž odpovídající importy (z) modulů jsou vždy na začátku fragmentu. Při psaní produkčního kódu by bylo dobré dát je na začátek zdrojového souboru.
out, instanci třídy Canvas, do kterého budeme kreslit obsah štítku. První parametr je jméno souboru, do kterého bude výstup uložen:
from reportlab.pdfgen import canvas
from reportlab.lib.units import mm, inch
PAGE_WIDTH = 100*mm
PAGE_HEIGHT = 50*mm
out = canvas.Canvas('out.pdf', pagesize=(PAGE_WIDTH, PAGE_HEIGHT))
Reportlab používá vtipný způsob pro práci s rozměry, z modulu units si můžete naimportovat milimetry (mm) nebo palce (inch) a rozměry zadávat jako jejich násobky (viz PAGE_WIDTH, PAGE_HEIGHT). Rozměry Canvasu jsou předány jako tuple o dvou hodnotách, pokud chcete použít standardní rozměr stránky, použijte:
from reportlab.lib.pagesizes import A4
out = canvas.Canvas('out.pdf', pagesize=A4)
Chceme kreslit vlastním TTF fontem. Pro ukázku použijeme DejaVu font z Debianího balíku ttf-dejavu-core. Font vytvoříme a zaregistrujeme pod vlastním názvem pomocí kódu:
from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont FONT_NAME = 'DejaVuSans' font = TTFont(FONT_NAME, '/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf') pdfmetrics.registerFont(font) FONT_SIZE = 10
Před kreslením nejprve nastavím náš načtený font a pak vykreslíme čtyři řádky. Reportlab měří vzdálenosti od levého dolního rohu, stejně tak text renderovaný pomocí drawString() má svůj levý dolní roh na pozici předané jako parametr:
out.setFont(FONT_NAME, FONT_SIZE) out.drawString(10*mm, 10*mm, u"Řádek 4") out.drawString(10*mm, 20*mm, u"Řádek 3") out.drawString(10*mm, 30*mm, u"Řádek 2") out.drawString(10*mm, 40*mm, u"Řádek 1")
transform je určen jasně nejasně a spíše tak, aby to fungovalo. Tento parametr určuje transformační matici a nechá se získat pomocí funkcí translate a scale z modulu reportlab.graphics.shapes. Já jsem se však inspiroval pohledem na
tento zdrojový kód, kde je vše nutné. Definujme tedy funkci, která dokáže vykreslit kód do Canvasu. Její parametry:
x, y jsou souřadnice, kam kód vykreslit (počátek vlevo dole)width, height je šířka, resp. výška kóduw_type je třída, která je použita pro vykreslení kódu (viz níže)text je řetězec, který je předán konstruktoru čárového kódu
from reportlab.graphics.shapes import Drawing
from reportlab.graphics import renderPDF
def draw_barcode(canvas, x, y, width, height, w_type, text):
code = w_type(value=text)
x1, y1, x2, y2 = code.getBounds()
w = float(x2 - x1)
h = float(y2 - y1)
sx = width/w
sy = height/h
w *= sx
h *= sy
drawing = Drawing(width=w,height=h,transform=[sx,0,0,sy,-sx*x1,-sy*y1])
drawing.add(code)
renderPDF.draw(drawing, canvas, x, y)
canvas.rect(x, y, width, height)
Nyní tuto funkci použijeme pro vykreslení QR kódu a EAN čárového kódu. Při tom použijeme třídy QrCodeWidget a Ean13BarcodeWidget, ale můžeme generovat celou řadu jiných kódů (viz dokumentace reportlab.graphics).
Nejprve tedy importy:
from reportlab.graphics.barcode.qr import QrCodeWidget from reportlab.graphics.barcode.eanbc import Ean13BarcodeWidgetVykreslení QR kódu do pravého horního rohu štítku:
W = 24*mm
H = 24*mm
draw_barcode(out, PAGE_WIDTH-W, PAGE_HEIGHT-H, W, H,
QrCodeWidget, 'https://www.123stitky.cz')
A čárového EAN13 kódu do pravého dolního rohu štítku. Pro informace o rozměrech EAN kódu jsem použil tuto stránku:
W = 37.29*mm
H = 25.93*mm
draw_barcode(out, PAGE_WIDTH-W, 0, W, H,
Ean13BarcodeWidget, '79357367900')
save(). Po tomto volání již Canvas nemůžeme používat, zato se může podívat do souboru out.pdf (viz volání konstruktoru Canvas):
out.save()
Pokud budete chtít v PDF více stránek, pak zavolejte out.showPage() pro založení nové stránky.
Prostřednictvím modulu reportlab.graphics lze renderovat nejen PDF (renderPDF), ale i bitmapové formáty (renderPM) nebo SVG (renderSVG).
Pro generování náhledu štítků na první stránce www.123stitky.cz používám PNG, které konvertuji z PDF pomocí balíčku wand což je ctypes binding nad ImageMagickem a jeho použití vypadá následovně (v preview je string obsahující BLOB s PNG):
from wand.image import Image
with Image(filename="out.pdf[0]", resolution=150) as img:
preview = img.make_blob(format='png')
Tiskni
Sdílej: