Documents/Pdf: Add progress tracker

This commit is contained in:
2023-10-19 22:16:33 +02:00
parent f19de3ae6e
commit c190ce1474
5 changed files with 34 additions and 17 deletions

View File

@ -24,6 +24,8 @@
<TextBox x:Name="TextElement" TextWrapping="Wrap" VerticalScrollBarVisibility="Visible" AcceptsReturn="True" <TextBox x:Name="TextElement" TextWrapping="Wrap" VerticalScrollBarVisibility="Visible" AcceptsReturn="True"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="200,10,10,10" Height="Auto"/> HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="200,10,10,10" Height="Auto"/>
<ProgressBar x:Name="ProgressBar" Margin="10,10,10,106" Height="27" Width="180"
VerticalAlignment="Bottom" HorizontalAlignment="Left"/>
<Button x:Name="TestButton" Content="Stichprobe" FontSize="14" Width="180" Margin="10,10,10,74" Height="27" Tag="Print" IsEnabled="False" <Button x:Name="TestButton" Content="Stichprobe" FontSize="14" Width="180" Margin="10,10,10,74" Height="27" Tag="Print" IsEnabled="False"
Click="TestButton_Click" Click="TestButton_Click"
VerticalAlignment="Bottom" HorizontalAlignment="Left"/> VerticalAlignment="Bottom" HorizontalAlignment="Left"/>

View File

@ -93,8 +93,10 @@ namespace Elwig.Dialogs {
""") """)
.ToListAsync(); .ToListAsync();
using var doc = await Document.Merge(list.Select(m => new DeliveryConfirmation(Context, Year, m, deliveries.Where(d => d.Delivery.MgNr == m.MgNr)))); ; using var doc = Document.Merge(list.Select(m => new DeliveryConfirmation(Context, Year, m, deliveries.Where(d => d.Delivery.MgNr == m.MgNr)))); ;
await doc.Generate(); await doc.Generate(new Progress<double>(v => {
ProgressBar.Value = v;
}));
Mouse.OverrideCursor = null; Mouse.OverrideCursor = null;
if (mode < 2) { if (mode < 2) {

View File

@ -47,7 +47,7 @@ namespace Elwig.Documents {
GC.SuppressFinalize(this); GC.SuppressFinalize(this);
} }
public static async Task<Document> Merge(IEnumerable<Document> docs) { public static Document Merge(IEnumerable<Document> docs) {
return new MergedDocument(docs); return new MergedDocument(docs);
} }
@ -75,17 +75,21 @@ namespace Elwig.Documents {
return await Html.CompileRenderAsync(name, this); ; return await Html.CompileRenderAsync(name, this); ;
} }
public async Task Generate() { public async Task Generate(IProgress<double>? progress = null) {
progress?.Report(0.0);
if (this is MergedDocument m) { if (this is MergedDocument m) {
var pdf = new TempFile("pdf"); var pdf = new TempFile("pdf");
var tmpHtmls = new List<TempFile>(); var tmpHtmls = new List<TempFile>();
var n = 0;
foreach (var doc in m.Documents) { foreach (var doc in m.Documents) {
var tmpHtml = new TempFile("html"); var tmpHtml = new TempFile("html");
await doc.Render();
await File.WriteAllTextAsync(tmpHtml.FilePath, await doc.Render(), Utils.UTF8); await File.WriteAllTextAsync(tmpHtml.FilePath, await doc.Render(), Utils.UTF8);
tmpHtmls.Add(tmpHtml); tmpHtmls.Add(tmpHtml);
n++;
progress?.Report(50.0 * n / m.Documents.Count());
} }
await Pdf.Convert(tmpHtmls.Select(f => f.FilePath), pdf.FilePath); progress?.Report(50.0);
await Pdf.Convert(tmpHtmls.Select(f => f.FilePath), pdf.FilePath, new Progress<double>(v => progress?.Report(50.0 + v / 2)));
foreach (var tmp in tmpHtmls) { foreach (var tmp in tmpHtmls) {
tmp.Dispose(); tmp.Dispose();
} }
@ -94,10 +98,12 @@ namespace Elwig.Documents {
var pdf = new TempFile("pdf"); var pdf = new TempFile("pdf");
using (var tmpHtml = new TempFile("html")) { using (var tmpHtml = new TempFile("html")) {
await File.WriteAllTextAsync(tmpHtml.FilePath, await Render(), Utils.UTF8); await File.WriteAllTextAsync(tmpHtml.FilePath, await Render(), Utils.UTF8);
progress?.Report(50.0);
await Pdf.Convert(tmpHtml.FilePath, pdf.FilePath); await Pdf.Convert(tmpHtml.FilePath, pdf.FilePath);
} }
_pdfFile = pdf; _pdfFile = pdf;
} }
progress?.Report(100.0);
} }
public void SaveTo(string pdfPath) { public void SaveTo(string pdfPath) {

View File

@ -21,7 +21,7 @@ namespace Elwig.Documents {
public static async Task Init(Action evtHandler) { public static async Task Init(Action evtHandler) {
var p = new Process() { StartInfo = new() { var p = new Process() { StartInfo = new() {
FileName = WinziPrint, FileName = WinziPrint,
Arguments = "-", Arguments = $"-p -e utf-8 -d '{App.TempPath}' -",
CreateNoWindow = true, CreateNoWindow = true,
UseShellExecute = false, UseShellExecute = false,
RedirectStandardInput = true, RedirectStandardInput = true,
@ -32,20 +32,27 @@ namespace Elwig.Documents {
evtHandler(); evtHandler();
} }
public static async Task<IEnumerable<int>> Convert(string htmlPath, string pdfPath) { public static async Task<IEnumerable<int>> Convert(string htmlPath, string pdfPath, IProgress<double>? progress = null) {
return await Convert(new string[] { htmlPath }, pdfPath); return await Convert(new string[] { htmlPath }, pdfPath, progress);
} }
public static async Task<IEnumerable<int>> Convert(IEnumerable<string> htmlPath, string pdfPath) { public static async Task<IEnumerable<int>> Convert(IEnumerable<string> htmlPath, string pdfPath, IProgress<double>? progress = null) {
if (WinziPrintProc == null) throw new InvalidOperationException("The WinziPrint process has not been initialized yet"); if (WinziPrintProc == null) throw new InvalidOperationException("The WinziPrint process has not been initialized yet");
progress?.Report(0.0);
await WinziPrintProc.StandardInput.WriteLineAsync($"{string.Join(';', htmlPath)};{pdfPath}"); await WinziPrintProc.StandardInput.WriteLineAsync($"{string.Join(';', htmlPath)};{pdfPath}");
var line = await WinziPrintProc.StandardOutput.ReadLineAsync() ?? throw new IOException("Invalid response from WinziPrint"); while (true) {
if (line.StartsWith("error:")) { var line = await WinziPrintProc.StandardOutput.ReadLineAsync() ?? throw new IOException("Invalid response from WinziPrint");
MessageBox.Show(line[6..].Trim(), "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); if (line.StartsWith("error:")) {
return Array.Empty<int>(); MessageBox.Show(line[6..].Trim(), "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
return Array.Empty<int>();
} else if (line.StartsWith("progress:")) {
var parts = line[9..].Trim().Split('/').Select(int.Parse).ToArray();
progress?.Report(parts[0] / (double)parts[1]);
} else if (line.StartsWith("success:")) {
var m = Regex.Match(line, @"\(([0-9, ]+)\)");
return m.Groups[1].Value.Split(", ").Select(n => int.Parse(n));
}
} }
var m = Regex.Match(line, @"\(([0-9, ]+)\)");
return m.Groups[1].Value.Split(", ").Select(n => int.Parse(n));
} }
public static void Show(TempFile file, string title) { public static void Show(TempFile file, string title) {

View File

@ -317,7 +317,7 @@ namespace Elwig.Windows {
.ThenBy(m => m.MgNr); .ThenBy(m => m.MgNr);
break; break;
} }
using var doc = await Document.Merge((await members.ToListAsync()).Select(m => new Letterhead(m))); using var doc = Document.Merge((await members.ToListAsync()).Select(m => new Letterhead(m)));
await doc.Generate(); await doc.Generate();
Mouse.OverrideCursor = null; Mouse.OverrideCursor = null;
if (App.Config.Debug) { if (App.Config.Debug) {