Draw estimate signatures as vector TikZ instead of PNG
The estimate foot now renders the provider and client signatures as
TikZ \draw/\fill paths straight from the captured stroke data, in two
side-by-side minipages with a \useasboundingbox so the boxes align
regardless of stroke coverage. A side that hasn't signed shows a
signature rule.
- TeXHelpers.SignatureToTikz walks the PostIt wire format
([k, x0,y0, ...] per stroke, coords in [0, CoordinateMax], y-down)
and emits one \draw per stroke (round caps/joins, 1.5pt), flipping y
so the signature is upright on paper; a single-point tap becomes a
filled dot, mirroring the Avalonia round-capped Polyline.
- FrontOfficeApiController.LoadEstimateForRenderAsync includes
Estimate.Signatures so SignaturePro/SignatureClient resolve.
- Estimate_tex.cshtml drops the \includegraphics of a PNG (which
failed the build when the file was absent) and adds \usepackage{tikz}.
- README: document texlive-pictures (tikz) and texlive-fonts-extra
(bera) as runtime deps; bera.sty missing is the likely cause of the
remaining host Emergency stop.
Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
parent
bbc37d3095
commit
9c1f552bca
4 changed files with 116 additions and 16 deletions
|
|
@ -157,12 +157,14 @@ namespace Yavsc.ApiControllers
|
|||
}
|
||||
|
||||
// Loads the estimate linked to a query with the navigation the
|
||||
// Estimate_tex template reads (client + performer profile + bill).
|
||||
// Estimate_tex template reads (client + performer profile + bill
|
||||
// + the captured signatures, drawn as tikz at the foot of the devis).
|
||||
private Task<Estimate?> LoadEstimateForRenderAsync(long queryId, CancellationToken token)
|
||||
=> dbContext.Estimates
|
||||
.Where(e => e.CommandId == queryId)
|
||||
.OrderByDescending(e => e.Id)
|
||||
.Include(e => e.Bill)
|
||||
.Include(e => e.Signatures)
|
||||
.Include(e => e.Query).ThenInclude(q => q!.Client).ThenInclude(c => c!.PostalAddress)
|
||||
.Include(e => e.Query).ThenInclude(q => q!.PerformerProfile).ThenInclude(p => p!.OrganizationAddress)
|
||||
.Include(e => e.Query).ThenInclude(q => q!.PerformerProfile).ThenInclude(p => p!.Performer)
|
||||
|
|
|
|||
Loading…
Reference in a new issue