Documents/Pdf: allow double-sided pages to be printed
This commit is contained in:
		| @@ -9,6 +9,16 @@ | ||||
|     <meta charset="UTF-8"/> | ||||
|     <link rel="stylesheet" href="file:///@Raw(Model.DataPath)\resources\style.css"/> | ||||
|     <link rel="stylesheet" href="file:///@Raw(Model.DataPath)\resources\style-page.css"/> | ||||
|     @if (Model.DoubleSided) { | ||||
|         <style> | ||||
|             @@page :left { | ||||
|                 margin: 25mm 25mm 35mm 20mm; | ||||
|                 @@bottom-center { | ||||
|                     content: element(page-footer-left); | ||||
|                 } | ||||
|             } | ||||
|         </style> | ||||
|     } | ||||
| </head> | ||||
| <body> | ||||
|     @if (Model.ShowFoldMarks) { | ||||
| @@ -27,6 +37,16 @@ | ||||
|         </div> | ||||
|         <footer>@Raw(Model.Footer)</footer> | ||||
|     </div> | ||||
|     @if (Model.DoubleSided) { | ||||
|         <div class="footer-wrapper left"> | ||||
|             <div class="pre-footer"> | ||||
|                 <span class="page"></span> | ||||
|                 <span class="doc-id">@Model.DocumentId</span> | ||||
|                 <span class="date">@($"{Model.Date:dddd, d. MMMM yyyy}")</span> | ||||
|             </div> | ||||
|             <footer>@Raw(Model.Footer)</footer> | ||||
|         </div> | ||||
|     } | ||||
|     <header>@Raw(Model.Header)</header> | ||||
|     <div class="spacing"></div> | ||||
|     <div class="main-wrapper"> | ||||
|   | ||||
| @@ -11,6 +11,7 @@ namespace Elwig.Documents { | ||||
|         private TempFile? _pdfFile = null; | ||||
|  | ||||
|         public bool ShowFoldMarks = App.Config.Debug; | ||||
|         public bool DoubleSided = false; | ||||
|  | ||||
|         public string DataPath; | ||||
|         public int CurrentNextSeason; | ||||
| @@ -90,7 +91,7 @@ namespace Elwig.Documents { | ||||
|                     progress?.Report(50.0 * i / n); | ||||
|                 } | ||||
|                 progress?.Report(50.0); | ||||
|                 await Pdf.Convert(tmpHtmls.Select(f => f.FileName), pdf.FileName, new Progress<double>(v => progress?.Report(50.0 + v / 2))); | ||||
|                 await Pdf.Convert(tmpHtmls.Select(f => f.FileName), pdf.FileName, DoubleSided, new Progress<double>(v => progress?.Report(50.0 + v / 2))); | ||||
|                 foreach (var tmp in tmpHtmls) { | ||||
|                     tmp.Dispose(); | ||||
|                 } | ||||
| @@ -100,7 +101,7 @@ namespace Elwig.Documents { | ||||
|                 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); | ||||
|                     await Pdf.Convert(tmpHtml.FilePath, pdf.FilePath, DoubleSided); | ||||
|                 } | ||||
|                 _pdfFile = pdf; | ||||
|             } | ||||
|   | ||||
| @@ -21,25 +21,30 @@ namespace Elwig.Documents { | ||||
|         public static async Task Init(Action evtHandler) { | ||||
|             var p = new Process() { StartInfo = new() { | ||||
|                 FileName = WinziPrint, | ||||
|                 Arguments = $"-p -e utf-8 -d \"{App.TempPath}\" -", | ||||
|                 CreateNoWindow = true, | ||||
|                 UseShellExecute = false, | ||||
|                 RedirectStandardInput = true, | ||||
|                 RedirectStandardOutput = true | ||||
|             } }; | ||||
|             p.StartInfo.ArgumentList.Add("-p"); | ||||
|             p.StartInfo.ArgumentList.Add("-e"); | ||||
|             p.StartInfo.ArgumentList.Add("utf-8"); | ||||
|             p.StartInfo.ArgumentList.Add("-d"); | ||||
|             p.StartInfo.ArgumentList.Add(App.TempPath); | ||||
|             p.StartInfo.ArgumentList.Add("-"); | ||||
|             p.Start(); | ||||
|             WinziPrintProc = p; | ||||
|             evtHandler(); | ||||
|         } | ||||
|  | ||||
|         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(string htmlPath, string pdfPath, bool doubleSided = false, IProgress<double>? progress = null) { | ||||
|             return await Convert(new string[] { htmlPath }, pdfPath, doubleSided, progress); | ||||
|         } | ||||
|  | ||||
|         public static async Task<IEnumerable<int>> Convert(IEnumerable<string> htmlPath, string pdfPath, IProgress<double>? progress = null) { | ||||
|         public static async Task<IEnumerable<int>> Convert(IEnumerable<string> htmlPath, string pdfPath, bool doubleSided = false, 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}"); | ||||
|             await WinziPrintProc.StandardInput.WriteLineAsync((doubleSided ? "-2;" : "") + $"{string.Join(';', htmlPath)};{pdfPath}"); | ||||
|             while (true) { | ||||
|                 var line = await WinziPrintProc.StandardOutput.ReadLineAsync() ?? throw new IOException("Invalid response from WinziPrint"); | ||||
|                 if (line.StartsWith("error:")) { | ||||
|   | ||||
| @@ -20,9 +20,6 @@ | ||||
| hr.page-break { | ||||
|     display: none; | ||||
| } | ||||
| .document-break { | ||||
|     break-before: page; | ||||
| } | ||||
|  | ||||
| @page { | ||||
|     size: A4; | ||||
|   | ||||
| @@ -57,6 +57,12 @@ header .type { | ||||
| .footer-wrapper { | ||||
|     position: running(page-footer); | ||||
|     width: 165mm; | ||||
|     /* for some reason the position without the following statement changes on the second page */ | ||||
|     border: 0.5pt solid #00000000; | ||||
| } | ||||
|  | ||||
| .footer-wrapper.left { | ||||
|     position: running(page-footer-left); | ||||
| } | ||||
|  | ||||
| .pre-footer { | ||||
| @@ -69,16 +75,16 @@ header .type { | ||||
|     width: 33%; | ||||
| } | ||||
|  | ||||
| .pre-footer .date { | ||||
| .pre-footer > *:first-child { | ||||
|     text-align: left; | ||||
| } | ||||
|  | ||||
| .pre-footer .doc-id { | ||||
| .pre-footer > *:nth-child(2) { | ||||
|     text-align: center; | ||||
|     font-style: italic; | ||||
| } | ||||
|  | ||||
| .pre-footer .page { | ||||
| .pre-footer > *:last-child { | ||||
|     text-align: right; | ||||
|     float: right; | ||||
| } | ||||
|   | ||||
| @@ -95,7 +95,12 @@ namespace Elwig.Dialogs { | ||||
|                 """) | ||||
|                 .ToListAsync(); | ||||
|  | ||||
|             using var doc = Document.Merge(list.Select(m => new DeliveryConfirmation(Context, Year, m, deliveries.Where(d => d.Delivery.MgNr == m.MgNr).ToList()))); ; | ||||
|             using var doc = Document.Merge(list.Select(m => | ||||
|                 new DeliveryConfirmation(Context, Year, m, deliveries.Where(d => d.Delivery.MgNr == m.MgNr).ToList()) { | ||||
|                     DoubleSided = true | ||||
|                 } | ||||
|             )); | ||||
|             doc.DoubleSided = true; | ||||
|             await doc.Generate(new Progress<double>(v => { | ||||
|                 ProgressBar.Value = v; | ||||
|             })); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user