TemplateDesigner: pdf-Export
CI / build-and-test (push) Canceled after 0s

This commit is contained in:
2026-08-31 23:28:08 +02:00
parent 4b4a746e17
commit 11ef73ab1f
4 changed files with 53 additions and 2 deletions
@@ -141,6 +141,9 @@ public partial class DesignerViewModel : ObservableObject
public ITemplateDataProvider BuildDataProvider() => new DesignerDataProvider(Placeholders.ToDictionary(
x => x.Name.Trim(), x => x.ToValue(), StringComparer.Ordinal));
public byte[] RenderCurrentPdf() =>
new QuestTemplateRenderer().RenderToPdf(BuildLoaded(), BuildDataProvider());
public void ApplyPdfImport(PdfImportResult import)
{
TemplateId = import.Manifest.Id; TemplateName = import.Manifest.Name; Description = import.Manifest.Description;
+4 -2
View File
@@ -10,6 +10,7 @@
<Separator/>
<MenuItem Header="Speichern" InputGesture="Ctrl+S" Click="OnSave"/>
<MenuItem Header="Speichern unter …" InputGesture="Ctrl+Shift+S" Click="OnSaveAs"/>
<MenuItem Header="Aktuelle Ansicht als PDF exportieren …" Click="OnExportCurrentPdf"/>
<Separator/>
<MenuItem Header="Ausgangsvorlage importieren …" Click="OnImportStarterTemplate"/>
<Separator/>
@@ -204,8 +205,9 @@
</TabControl>
<Grid Grid.Column="1" RowDefinitions="Auto,*" Margin="0,18">
<Grid ColumnDefinitions="*,Auto" Margin="12,0,12,10"><TextBlock Text="Layout-DSL" Classes="section"/>
<Button Grid.Column="1" Content="Prüfen &amp; Vorschau" Click="OnPreview"/></Grid>
<Grid ColumnDefinitions="*,Auto,8,Auto" Margin="12,0,12,10"><TextBlock Text="Layout-DSL" Classes="section"/>
<Button Grid.Column="1" Content="Prüfen &amp; Vorschau" Click="OnPreview"/>
<Button Grid.Column="3" Content="Als PDF exportieren …" Click="OnExportCurrentPdf"/></Grid>
<TabControl Grid.Row="1" Margin="12">
<TabItem Header="Seite 1">
<TextBox Text="{Binding LayoutSource}" AcceptsReturn="True" TextWrapping="NoWrap"
@@ -267,6 +267,40 @@ public partial class MainWindow : Window
private async void OnSaveAs(object? sender, RoutedEventArgs e) => await SaveAsAsync();
private async void OnExportCurrentPdf(object? sender, RoutedEventArgs e)
{
byte[] pdf;
try
{
pdf = _viewModel.RenderCurrentPdf();
}
catch (Exception ex)
{
_viewModel.SetStatus($"PDF-Export fehlgeschlagen: {ex.Message}", true);
return;
}
var file = await StorageProvider.SaveFilePickerAsync(new()
{
Title = "Aktuelle Vorlagenansicht als PDF exportieren",
SuggestedFileName = _viewModel.TemplateId + "-vorschau.pdf",
DefaultExtension = "pdf",
FileTypeChoices = [new("PDF-Dateien") { Patterns = ["*.pdf"] }],
});
if (file is null) return;
try
{
var destination = EnsurePdfExtension(file.Path.LocalPath);
await File.WriteAllBytesAsync(destination, pdf);
_viewModel.SetStatus($"PDF-Vorschau exportiert: {Path.GetFileName(destination)}", false);
}
catch (Exception ex)
{
_viewModel.SetStatus($"PDF-Export fehlgeschlagen: {ex.Message}", true);
}
}
private async Task SaveAsAsync()
{
try { _viewModel.BuildLoaded(); }
@@ -332,6 +366,9 @@ public partial class MainWindow : Window
private static string EnsurePackageExtension(string path) =>
string.Equals(Path.GetExtension(path), TemplatePackage.Extension, StringComparison.OrdinalIgnoreCase)
? path : path + TemplatePackage.Extension;
private static string EnsurePdfExtension(string path) =>
string.Equals(Path.GetExtension(path), ".pdf", StringComparison.OrdinalIgnoreCase)
? path : path + ".pdf";
private void RefreshStarterTemplates(string? selectedId = null) =>
_viewModel.SetStarterTemplates(_starterTemplates.GetAll(), selectedId);