Byl vydán Linux Mint 22.3 s kódovým jménem Zena. Podrobnosti v přehledu novinek a poznámkách k vydání. Vypíchnout lze, že nástroj Systémová hlášení (System Reports) získal mnoho nových funkcí a byl přejmenován na Informace o systému (System Information). Linux Mint 22.3 bude podporován do roku 2029.
Wine bylo po roce vývoje od vydání verze 10.0 vydáno v nové stabilní verzi 11.0. Přehled novinek na GitLabu. Vypíchnuta je podpora NTSYNC a dokončení architektury WoW64.
Byl vydán Mozilla Firefox 147.0. Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Firefox nově podporuje Freedesktop.org XDG Base Directory Specification. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 147 bude brzy k dispozici také na Flathubu a Snapcraftu.
Asociace repair.org udělila anticeny těm nejhorším produktům představeným na veletrhu CES 2026. Oceněnými jsou například šmírující kamery Amazon Ring AI, chytrý běžecký pás od společnosti Merach, která otevřeně přiznává, že nedokáže zabezpečit osobní data uživatelů, případně jednorázové lízátko, které rozvibrovává čelisti uživatele a tak přehrává hudbu. Absolutním vítězem je lednička od Samsungu, která zobrazuje reklamy a kterou lze otevřít pouze hlasovým příkazem přes cloudovou službu.
Íránští protirežimní aktivisté si všímají 30% až 80% ztráty packetů při komunikaci se satelity služby Starlink. Mohlo by se jednat o vedlejší důsledek rušení GPS, kterou pozemní přijímače Starlinku používají k výpočtu polohy satelitů a kterou se režim rovněž snaží blokovat, podle bezpečnostního experta a iranisty Amira Rashidiho je ale pravděpodobnější příčinou terestrické rušení přímo satelitní komunikace Starlinku podobnou
… více »Evropská komise (EK) zvažuje, že zařadí komunikační službu WhatsApp americké společnosti Meta mezi velké internetové platformy, které podléhají přísnější regulaci podle unijního nařízení o digitálních službách (DSA). Firmy s více než 45 miliony uživatelů jsou podle DSA považovány za velmi velké on-line platformy (Very Large Online Platforms; VLOP) a podléhají přísnějším pravidlům EU pro internetový obsah. Pravidla po
… více »Tržní hodnota technologické společnosti Alphabet poprvé v historii přesáhla čtyři biliony dolarů (83 bilionů Kč). Stalo se tak poté, co Apple oznámil, že bude na poli umělé inteligence (AI) spolupracovat s dceřinou firmou Alphabetu, společností Google.
Nové číslo časopisu Raspberry Pi zdarma ke čtení: Raspberry Pi Official Magazine 161 (pdf).
Po delší době vývoje vyšla nativní linuxová verze virtuálního bubeníka MT-PowerDrumKit 2 ve formátu VST3. Mezi testovanými hosty jsou Reaper, Ardour, Bitwig a Carla.
Desktopové prostředí Budgie bylo vydáno ve verzi 10.10. Dokončena byla migrace z X11 na Wayland. Budgie 10 vstupuje do režimu údržby. Vývoj se přesouvá k Budgie 11. Dlouho se řešilo, v čem bude nové Budgie napsáno. Budgie 10 je postaveno nad GTK 3. Přemýšlelo se také nad přepsáním z GTK do EFL. Budgie 11 bude nakonec postaveno nad Qt 6.
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: