Forum
>>
Programmazione Python
>>
Files e Directory
>>
Individuare files dei fonts
Pagina: 1
Esegui il login per scrivere una risposta.
Pagina: 1
Scritto da nuzzopippo |
2024-02-15 11:38:29 - Individuare files dei fonts
|
I miei saluti.
A scopo meramente ludico mi sto studiando la libreria fpdf2, finalizzando alla produzione di moduli tabellari con font e stili scelti dall'utente, la scelta dei fonts avviene per "famiglie" di font selezionate in ambiente tkinter. Nell'approccio con fpdf2 ho constatato che, necessariamente, deve essere fornito "il file" da utilizzare per la composizione dei testi, specifico per lo stile di testo applicato, essendo la libreria non in grado di operare con la generica fornitura di font-family e style. Ho, pertanto, iniziato a studiarmi una metodologia per identificare files di font soddisfacenti le scelte utente tra quelli registrati nel sistema, correntemente nel solo linux ma che spero, in seguito, di ampliare anche al mondo windows. Al momento provvedo ad estrarre l'intero set di font rilevati nel sistema tramite fc-list (ho trovato scoraggianti fc-match e fcpatterformat non conoscendo i parametri da applicare di volta in volta) in un subprocess e, quindi, utilizzando il modulo python "fontmeta" per estrarne i metadati e selezionare i file tramite i campi "font_family" e "subfamily" ... certamente l'utilizzo di "fontmeta" non è il massimo, limitando i caratteri gestibili ai soli TrueType ed OpenType ma bene o male può andare, in genere i caratteri di altra codifica (p.e. i Type1) hanno corrispondenze in una delle due tipologie, anche se alcuni, tipo il "Gargi" in esempio sotto ... font_family : गार्गी subfamily : गार्गी unique_font_identifier : FontForge : Gargi_1.10v : 12-3-2012 full_font_name : Gargi version : Version 2.0 postscript_name : Gargi ...non so proprio come intercettarli, dato i caratteri "esotici" utilizzati nel compilare a detti campi. Comunque, pur ritenendo tutto sommato veniali le problematiche sopra esposte, mi sono imbattuto in alcune casistiche che mi lasciano perplesso circa le metodologie che sto implementando. La prima : le "famiglie" di font solitamente sono definite con file specifici per i caratteri "normale", "grassetto", "corsivo" e "grassetto-corsivo", detti stili son definiti nel campo "subfamily" MA NON HANNO una indicazione uniforme, tanto meno mi è riuscito di trovare una specifica delle definizioni. Al momento, ho definito un insieme di variabili globali NORMAL = ['Regular', 'Normal', 'Roman', 'Book'] BOLD = ['Bold','Gras'] ITALIC = ['Italic', 'Italique', 'Oblique']di appoggio che però non sono esaustive, alcune delle definizioni trovate non ho neanche saputo ove porle. Qui viene la prima domanda: qualcuno di Voi conosce e saprebbe indicarmi una specifica esaustiva per gli stili di testo? ... o almeno suggerire delle integrazioni? Altra problematica è data dai file stessi, sul mio sistema (ubuntu con aggiornamenti dalla versione 16 alla 22) coesistono versioni multiple di file con della stessa "famiglia" e stile, sparsi in varie directory, di sistema o locali all'user, rispondenti ad una ricerca ... certo, posso applicare il primo trovato od anche utilizzare le directory di sistema, anche se in esse sono presenti più file soddisfacenti contemporaneamente i requisiti (tipo i fonts Microsoft) La seconda domanda è : qualcuno conosce l'argomento e saprebbe indicarmi la documentaione da consultare (sperando non sia troppo "laboriosa") e/o suggerimenti? Per eventuali interessati, il modulo di lavoro sviluppato al momento (work.py) è il seguente: # -*- coding: utf-8 -*- import subprocess from fontmeta import FontMeta NORMAL = ['Regular', 'Normal', 'Roman', 'Book'] BOLD = ['Bold','Gras'] ITALIC = ['Italic', 'Italique', 'Oblique'] def get_fonts_linux_system() -> list: ''' Estrae i fonts registrati in un sistema linux ''' p = subprocess.check_output('fc-list', stderr=subprocess.STDOUT) fonts_data = p.decode('UTF-8').splitlines() fonts = [] for f in fonts_data: f_name = f.split(':')[0] fonts.append(f_name) fonts.sort() return fonts def get_data_file(fname: str) -> dict: ''' Estrae i metadati di un file TrueType o OpenType ''' data = None try: fm_i = FontMeta(fname) data = fm_i.get_data() except: pass return data def get_from_family(fam: str, style: bool=False, bold: bool=False, italic: bool=False) -> list: ''' Estrae i font registrati con famiglia e stile selezionati ''' fonts = get_fonts_linux_system() founds = [] for f in fonts: fname = f.rstrip('\n') try: fm_i = FontMeta(fname) data = fm_i.get_data() if data['font_family'] == fam: passed = False if style: stl = data['subfamily'] if not bold and not italic: if stl in NORMAL: passed = True elif bold and italic: st = stl.split() if (len(st) == 2 and (st[0] in BOLD or st[0] in ITALIC) and (st[1] in BOLD or st[1] in ITALIC)): passed = True else: if bold: if stl in BOLD: passed = True elif italic: if stl in ITALIC: passed = True else: passed = True if passed: founds.append(f) except: pass return foundse funziona con la funzione "get_from_family" che richiede l'elenco dei file a "get_fonts_linux_system" per poi processarli singolarmente richiedendo, per ciascuno di essi, i metadati a "get_data_file" per poi valutarne i metadati in base alle opzioni passate quali parametri. ... se qualcuno è interessato alla finestra (tkinter) di test lo faccia sapere che la posto, sono circa 280 righe di codice e non ho ritenuto fosse al momento necessaria. Grazie dell'attenzione Fatti non foste a viver come bruti... |
|
Scritto da Daniele aka Palmux |
2024-02-15 13:01:23 - Re: Individuare files dei fonts
|
Ciao caro, anche se non ne so niente, trovo tutto molto interessante.
Penserai perché ti ho risposto se non so nulla sull'argomento? Eh niente, solo per dirti del mio apprezzamento e per ricordarti che se non risponde nessuno ci sono comunque altri canali nella nostra comunità. Cya |
|
Scritto da nuzzopippo |
2024-02-15 19:06:12 - Re: Individuare files dei fonts
|
Sono lusingato dell'apprezzamento di un pythonista di lunga data quale Tu sei, riguardo gli altri canali, avevo già visto della mailing-list e del canale telegram. Non ne ho ancora approfittato.
Riguardo le mailing-list, che conosco bene avendo fatto parte di diverse linux verso la metà degli anni '90, un po' perché in genere l'utenza è di un livello medio più alto di quanto io possa aspirare, non tedierei con le mie misere problematiche, un po' perché impegnative e non ho, strutturalmente e fisicamente, mezzi adeguati per starci dietro. Riguardo ai canali telegram ... sono patologicamente (e probabilmente ingiustamente) ostile a tutti i "social", ambito in cui classifico telegram, frequento internet da quando e nata e non mi è piaciuta la sua "evoluzione" ... forse perché rimasto shoccato nell'antico "C6" della ora TIM, unica esperienza del genere avuta. ... Per ora, mi accontenterò dei Forum, se qualcuno saprà/vorrà intervenire bene, altrimenti mi accontenterò ugualmente. Ciao Fatti non foste a viver come bruti... |
Pagina: 1
Esegui il login per scrivere una risposta.