Klausur-Deckblatt: Fortschrittsbalken und Erzeugung im Hintergrund
CI / build-and-test (push) Canceled after 0s

Ein Klassensatz dauert spürbar und fror den Dialog ein. GenerateAsync
setzt jetzt per Task.Run, RenderBatchToPdf meldet jeden gesetzten
Datensatz über ein optionales IProgress<int>. Das abschließende
Document.Merge meldet nichts, dort läuft der Balken unbestimmt.
Währenddessen sind die Schaltflächen gesperrt und der Dialog bleibt
offen. Ein einzelnes Deckblatt wird nicht mehr doppelt gesetzt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
adminandClaude Opus 5.5 committed 2026-10-08 09:00:15 +02:00
1 parent 24a30881f3
commit e4a81e8974
9 files changed
+93 -23

No files matched your search

+4 -1
View File
@@ -192,7 +192,10 @@ public sealed record BatchRenderResult(byte[] Pdf, IReadOnlyList<int> PageCounts
public interface ITemplateBatchRenderer
{
/// <summary>Rendert dieselbe Vorlage je Datensatz und fügt alles zu einem PDF zusammen.</summary>
BatchRenderResult RenderBatchToPdf(LoadedTemplate template, IReadOnlyList<ITemplateDataProvider> data);
/// <param name="progress">Bekommt nach jedem gesetzten Datensatz deren bisherige Anzahl. Nach
/// dem letzten folgt noch das Zusammenfügen, das sich nicht weiter unterteilen lässt.</param>
BatchRenderResult RenderBatchToPdf(LoadedTemplate template, IReadOnlyList<ITemplateDataProvider> data,
IProgress<int>? progress = null);
}
public interface ITemplatePreviewRenderer
+10 -4
View File
@@ -14,17 +14,23 @@ public sealed class QuestTemplateRenderer : ITemplateRenderer, ITemplatePreviewR
public byte[] RenderToPdf(LoadedTemplate template, ITemplateDataProvider data) =>
BuildDocument(template, ValidateData(template, data)).GeneratePdf();
public BatchRenderResult RenderBatchToPdf(LoadedTemplate template, IReadOnlyList<ITemplateDataProvider> data)
public BatchRenderResult RenderBatchToPdf(LoadedTemplate template, IReadOnlyList<ITemplateDataProvider> data,
IProgress<int>? progress = null)
{
if (data.Count == 0) throw new ArgumentException("Mindestens ein Datensatz ist erforderlich.", nameof(data));
var documents = data.Select(x => BuildDocument(template, ValidateData(template, x))).ToList();
// Seitenzahl je Datensatz getrennt ermitteln: das zusammengeführte Dokument verrät nicht
// mehr, welcher Datensatz unerwartet auf eine Folgeseite übergelaufen ist.
var pageCounts = documents.Select(x => PdfPageCounter.Count(x.GeneratePdf())).ToList();
var single = new List<byte[]>(documents.Count);
foreach (var document in documents)
{
single.Add(document.GeneratePdf());
progress?.Report(single.Count);
}
var pdf = documents.Count == 1
? documents[0].GeneratePdf()
? single[0]
: Document.Merge(documents).UseOriginalPageNumbers().GeneratePdf();
return new(pdf, pageCounts);
return new(pdf, single.Select(PdfPageCounter.Count).ToList());
}
public byte[] RenderFirstPageToPng(LoadedTemplate template, ITemplateDataProvider data, int dpi = 120)