Documents/Pdf: Add progress tracker
This commit is contained in:
		@@ -47,7 +47,7 @@ namespace Elwig.Documents {
 | 
			
		||||
            GC.SuppressFinalize(this);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static async Task<Document> Merge(IEnumerable<Document> docs) {
 | 
			
		||||
        public static Document Merge(IEnumerable<Document> docs) {
 | 
			
		||||
            return new MergedDocument(docs);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -75,17 +75,21 @@ namespace Elwig.Documents {
 | 
			
		||||
            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) {
 | 
			
		||||
                var pdf = new TempFile("pdf");
 | 
			
		||||
                var tmpHtmls = new List<TempFile>();
 | 
			
		||||
                var n = 0;
 | 
			
		||||
                foreach (var doc in m.Documents) {
 | 
			
		||||
                    var tmpHtml = new TempFile("html");
 | 
			
		||||
                    await doc.Render();
 | 
			
		||||
                    await File.WriteAllTextAsync(tmpHtml.FilePath, await doc.Render(), Utils.UTF8);
 | 
			
		||||
                    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) {
 | 
			
		||||
                    tmp.Dispose();
 | 
			
		||||
                }
 | 
			
		||||
@@ -94,10 +98,12 @@ namespace Elwig.Documents {
 | 
			
		||||
                var pdf = new TempFile("pdf");
 | 
			
		||||
                using (var tmpHtml = new TempFile("html")) {
 | 
			
		||||
                    await File.WriteAllTextAsync(tmpHtml.FilePath, await Render(), Utils.UTF8);
 | 
			
		||||
                    progress?.Report(50.0);
 | 
			
		||||
                    await Pdf.Convert(tmpHtml.FilePath, pdf.FilePath);
 | 
			
		||||
                }
 | 
			
		||||
                _pdfFile = pdf;
 | 
			
		||||
            }
 | 
			
		||||
            progress?.Report(100.0);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void SaveTo(string pdfPath) {
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,7 @@ namespace Elwig.Documents {
 | 
			
		||||
        public static async Task Init(Action evtHandler) {
 | 
			
		||||
            var p = new Process() { StartInfo = new() {
 | 
			
		||||
                FileName = WinziPrint,
 | 
			
		||||
                Arguments = "-",
 | 
			
		||||
                Arguments = $"-p -e utf-8 -d '{App.TempPath}' -",
 | 
			
		||||
                CreateNoWindow = true,
 | 
			
		||||
                UseShellExecute = false,
 | 
			
		||||
                RedirectStandardInput = true,
 | 
			
		||||
@@ -32,20 +32,27 @@ namespace Elwig.Documents {
 | 
			
		||||
            evtHandler();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static async Task<IEnumerable<int>> Convert(string htmlPath, string pdfPath) {
 | 
			
		||||
            return await Convert(new string[] { htmlPath }, pdfPath);
 | 
			
		||||
        public static async Task<IEnumerable<int>> Convert(string htmlPath, string pdfPath, IProgress<double>? progress = null) {
 | 
			
		||||
            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");
 | 
			
		||||
            progress?.Report(0.0);
 | 
			
		||||
            await WinziPrintProc.StandardInput.WriteLineAsync($"{string.Join(';', htmlPath)};{pdfPath}");
 | 
			
		||||
            var line = await WinziPrintProc.StandardOutput.ReadLineAsync() ?? throw new IOException("Invalid response from WinziPrint");
 | 
			
		||||
            if (line.StartsWith("error:")) {
 | 
			
		||||
                MessageBox.Show(line[6..].Trim(), "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                return Array.Empty<int>();
 | 
			
		||||
            while (true) {
 | 
			
		||||
                var line = await WinziPrintProc.StandardOutput.ReadLineAsync() ?? throw new IOException("Invalid response from WinziPrint");
 | 
			
		||||
                if (line.StartsWith("error:")) {
 | 
			
		||||
                    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) {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user