Documents/Pdf: Add progress tracker
This commit is contained in:
@ -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"/>
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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,21 +32,28 @@ 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}");
|
||||||
|
while (true) {
|
||||||
var line = await WinziPrintProc.StandardOutput.ReadLineAsync() ?? throw new IOException("Invalid response from WinziPrint");
|
var line = await WinziPrintProc.StandardOutput.ReadLineAsync() ?? throw new IOException("Invalid response from WinziPrint");
|
||||||
if (line.StartsWith("error:")) {
|
if (line.StartsWith("error:")) {
|
||||||
MessageBox.Show(line[6..].Trim(), "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
|
MessageBox.Show(line[6..].Trim(), "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
return Array.Empty<int>();
|
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, ]+)\)");
|
var m = Regex.Match(line, @"\(([0-9, ]+)\)");
|
||||||
return m.Groups[1].Value.Split(", ").Select(n => int.Parse(n));
|
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) {
|
||||||
App.MainDispatcher.BeginInvoke(() => {
|
App.MainDispatcher.BeginInvoke(() => {
|
||||||
|
@ -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) {
|
||||||
|
Reference in New Issue
Block a user