PDF-export breekt af op een gedachtestreepje in een grafiek- of diagramlabel #1942
Labels
No labels
accepted
bug
declined
docs
duplicate
enhancement
good first issue
in-progress
needs-info
privacy
security
triage
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
LibreKAT/Ocideck#1942
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Wat er misgaat
Een ingesloten SVG in de PDF-export (grafiek, mermaid-diagram, formule) laat de
hele export stuklopen zodra er ergens in de tekening één teken boven U+00FF
staat. Niet dat ene diagram: het hele document.
De lezer van
package:pdfkiest voor<text>in een SVG hardgecodeerd eenstandaardfont (
src/svg/painter.dart:117— Helvetica, Times of Courier naarfont-family), zonder terugvallijst. Die standaardfonts zijn Latin-1, enPdfFont.stringMetricswerpt op alles daarboven.Nagemeten met een kale
pw.SvgImage:Start—(em-streepje)ArgumentError’(krul-apostrof)ArgumentError…→ArgumentErrorłArgumentErrorDit is dus geen randgeval voor exotische schriften: een gedachtestreepje of een
typografische apostrof in een grafiektitel is genoeg. Dat zijn precies de tekens
die een tekstverwerker en onze eigen documentmodus vanzelf produceren.
Waarom de bestaande
tryhet niet vangtDocumentPdfWidgets._graphic(lib/services/pdf/document_pdf_widgets.dart)zet
pw.SvgImagein eentry, maar die dekt alleen de constructor. De worpkomt uit
SvgImage.paint, dus tijdensdocument.save()(
lib/services/pdf/document_pdf_renderer.dart:257) — ruim buiten dietry.Stack:
Reproductie
(
Omzet — per kwartaal), of een mermaid-diagram met een label met’.Verwacht: een PDF. Werkelijk: de export faalt.
Reikwijdte
Raakt alle drie de SVG-routes van de documentexport, want ze lopen alle drie
door
_resolveGraphicsnaarpw.SvgImage:_chartSvgzet de titel, reeksnamen en aslabels van de gebruikerin
<text>)<path>, dus die is minder gevoelig,maar
\text{…}niet)Voorgestelde oplossing
pw.SvgImageneemt eencustomFontLookup. Daarmee kunnen we per tekening hetgebundelde Unicode-font (Roboto, dat de export al als
fontFallbackmeekrijgt)opgeven zodra de tekst in de SVG niet volledig Latin-1 is, en anders bij de
standaardfonts blijven — die dragen een echte vette en cursieve snede, en dat is
precies waarom
document_pdf_fonts.dartze kiest.Regressietest
Een test die een document met een grafiektitel mét em-streepje door de
PDF-export haalt en bytes terugverwacht. Die staat nu rood.
Meegenomen: een tweede, cosmetische melding
In dezelfde run:
Die komt uit
vector_graphics_compileren is onze eigen opschoning:sanitizeMermaidSvghaalt<marker>en<style>uit<defs>weg, deXML-serializer schrijft het lege element als
<defs/>, en de parser handeltdefsalleen af als het níét zelfsluitend is (parser.dart:921). Er gaat nietsverloren — de
defswas al leeg — maar het is ruis in elke debug-run, en deopruiming is één regel in
sanitize_svg.dart.Opgepakt. Tak: fix/pdf-svg-unicode-1942. Verwachte reikwijdte: lib/services/pdf/document_pdf_fonts.dart, document_pdf_widgets.dart, document_pdf_export.dart, lib/utils/sanitize_svg.dart, plus tests.
Gerepareerd en op
main(merge8c7280d82, PR #1966).Wat erin zit:
DocumentPdfFonts.svgTypesettingzegt per tekening of de standaardsneden volstaan, welk Unicode-font het anders moet doen, of dat de tekening niet te zetten is. Het gebundelde Roboto gaat viacustomFontLookupmee.svgTextContentleest nu ook de<text>- en<tspan>-knopen. Zonder dat zou deze reparatie een luide fout in stil verlies veranderen — een pijl (→) staat namelijk níét in het gebundelde Roboto en werd een leeg blokje.<defs/>uit de opschoning is weg.Acht regressietests, waarvan vier rood stonden tegen de onherstelde code. Handmatig gecontroleerd op een echte export: kop, alinea, grafiektitel met gedachtestreepje en krul-apostrofs in de aslabels staan er allemaal.
Wat er níét in zit: de pijl zelf blijft een leeg blokje, want het gebundelde Roboto-Variable heeft U+2192 niet in zijn
cmap. De export meldt hem nu, maar zetten kan hij hem niet — een ander of extra terugvalfont is een aparte afweging (bestandsgrootte tegenover dekking).