[FEATURE]: Embed custom fonts into vector exports (no system install)
Avaliação
Esta issue ainda não foi avaliada.
Descrição
Problem
Plotly's SVG output references fonts by name only (e.g. font-family: 'My Font'); it never embeds the font bytes. When Kaleido renders that SVG to a raster or vector format, the font name is resolved against fonts available to the headless browser/OS. If the requested font is not installed system-wide, it silently falls back to a default (e.g. Times New Roman).
For PDF/EPS this is unavoidable today even with workarounds, because Kaleido loads the SVG into an <img> element and prints the page — an <img>-loaded SVG is an isolated document, so it can't see any @font-face defined on the host page.
The practical consequence: a chart authored with a brand/custom font renders correctly on the author's machine (where the font happens to be installed) but differently on CI, in containers, or on a colleague's machine.
Reproduction (current behavior)
Pick any font file (.ttf/.otf/.woff) whose family is not installed system-wide on your machine and set the two variables below. A distinctive display font such as Pacifico is a safe default on most systems:
curl -L -o font.ttf \
https://github.com/google/fonts/raw/main/ofl/pacifico/Pacifico-Regular.ttf
import asyncio
import kaleido
import plotly.graph_objects as go
FONT_PATH = "font.ttf" # a font NOT installed on your system
FAMILY = "Pacifico" # its family name
fig = go.Figure(go.Scatter(y=[1, 4, 2, 7, 5], mode="lines+markers"))
fig.update_layout(width=700, height=500, font_family=FAMILY,
title_text=f"{FAMILY} test")
async def main():
async with kaleido.Kaleido(n=1, timeout=90) as k:
await k.write_fig(fig, path="chart.pdf", opts={"format": "pdf"})
asyncio.run(main())
Inspect which font the PDF actually embedded:
from pypdf import PdfReader
fonts = set()
def visit(t, cm, tm, fd, sz):
if fd and "/BaseFont" in fd: fonts.add(str(fd["/BaseFont"]))
for p in PdfReader("chart.pdf").pages:
p.extract_text(visitor_text=visit)
print(fonts)
Observed: the embedded font is a system fallback (e.g. a Times/serif face), not FAMILY. The same chart looks different on a machine where FAMILY is installed — output is not reproducible across environments. (If you instead see FAMILY embedded, that font is installed on your machine — pick a different one.)
Desired behavior
A way to tell Kaleido to embed specific font files into the output so figures render with the intended typeface everywhere, without requiring a system font install — e.g.:
await k.write_fig(fig, path="chart.pdf",
opts={"format": "pdf", "fonts": [FONT_PATH]})
After which the PDF embeds the actual FAMILY glyphs (a subset such as AAAAAA+Pacifico-Regular) and the SVG carries an inlined base64 @font-face, making vector output self-contained.
A draft implementation is in #463.
- Linguagem predominante
- Python
- Estrelas
- 504
- Forks
- 65
- Merge médio
- 6d 9h
- PRs com merge (30d)
- 2
Preparar o ambiente
Este projeto não oferece contêiner de desenvolvimento, Dockerfile nem guia de contribuição, então a configuração fica por sua conta: comece pelo README e veja nosso guia da primeira contribuição para os passos gerais.
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de plotly/kaleido
-
Writing to an existing directory whose name has a dot fails with "Invalid format"Talvez já em andamento @RaphaelFakhri assumiu há 13 dias. Abertabug P3 size: 1
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 35/100
-
Deterministic Rendering ChallengesTalvez livre de novo @camdecoster assumiu há 68 dias e não há nenhum pull request aberto. Abertaenhancement feature P2 size: 5
-
enhancement feature P3 size: 5
Dificuldade 5/5 Mais de uma semana Facilidade para iniciantes 25/100
-
GlobalKaleidoServer is not thread-safeTalvez já em andamento @talleibman assumiu há 250 dias. Aberta
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 48/100
-
[BUG]: to_image gets stuck very rarelyTalvez já em andamento @AndrushaUt assumiu há 217 dias. Abertabug
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 48/100
Todas as issues de plotly/kaleido
Issues semelhantes
-
bug module:nodes tests
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
rocketride-org/rocketride-server#3020 ·
Mantenedores costumam responder em até 2 dias
-
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 90/100
bretterer/home-assistant-rivian#335 ·
Mantenedores costumam responder em até 1 dia
-
bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
mampfes/hacs_waste_collection_schedule#8114 ·
Mantenedores costumam responder em até 1 dia
-
bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
TIGER-AI-Lab/ClawBench#475 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 84/100
UKGovernmentBEIS/inspect_ai#6322 ·
Mantenedores costumam responder em até 1 dia