Klausur-Deckblatt: Fortschrittsbalken und Erzeugung im Hintergrund
CI / build-and-test (push) Canceled after 0s
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:
1 parent
24a30881f3
commit
e4a81e8974
9 files changed
+93
-23
No files matched your search
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in new issue
Block a user