87 lines
3.1 KiB
C#
87 lines
3.1 KiB
C#
using System;
|
|
using System.Threading.Tasks;
|
|
using System.Windows;
|
|
using PdfSharp.Pdf.IO;
|
|
using PuppeteerSharp;
|
|
using Elwig.Helpers;
|
|
using Elwig.Windows;
|
|
using System.Diagnostics;
|
|
|
|
namespace Elwig.Documents {
|
|
public static class Pdf {
|
|
|
|
private static readonly string Chromium = @"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe";
|
|
private static readonly string PdfToPrinter = App.ExePath + "PDFtoPrinter.exe";
|
|
private static IBrowser? Browser = null;
|
|
public static bool IsReady => Browser != null;
|
|
|
|
public static async Task Init(Action evtHandler) {
|
|
Browser = await Puppeteer.LaunchAsync(new LaunchOptions {
|
|
Headless = true,
|
|
ExecutablePath = Chromium,
|
|
// paged.js uses XHRs to load styles, so this is needed
|
|
Args = new[] { "--allow-file-access-from-files" },
|
|
});
|
|
evtHandler();
|
|
}
|
|
|
|
public static async Task Close() {
|
|
if (Browser == null) return;
|
|
await Browser.CloseAsync();
|
|
Browser = null;
|
|
}
|
|
|
|
public static async Task Convert(string htmlPath, string pdfPath) {
|
|
if (Browser == null) throw new InvalidOperationException("The puppeteer engine has not been initialized yet");
|
|
using var page = await Browser.NewPageAsync();
|
|
page.Console += OnConsole;
|
|
await page.GoToAsync($"file://{htmlPath}");
|
|
await page.EvaluateFunctionAsync("async () => { await window.PagedPolyfill.preview(); }");
|
|
await page.PdfAsync(pdfPath, new() {
|
|
PreferCSSPageSize = true,
|
|
//Format = PaperFormat.A4,
|
|
DisplayHeaderFooter = false,
|
|
MarginOptions = new() {
|
|
Top = "0mm",
|
|
Right = "0mm",
|
|
Bottom = "0mm",
|
|
Left = "0mm",
|
|
},
|
|
});
|
|
}
|
|
|
|
private static void OnConsole(object? sender, ConsoleEventArgs e) {
|
|
MessageBox.Show(e.Message.Text);
|
|
}
|
|
|
|
public static void UpdateMetadata(string path, string title, string author) {
|
|
using var doc = PdfReader.Open(path);
|
|
doc.Info.Title = title;
|
|
doc.Info.Author = author;
|
|
doc.Save(path);
|
|
}
|
|
|
|
public static void Show(TempFile file, string title) {
|
|
App.MainDispatcher.BeginInvoke(() => {
|
|
var w = new DocumentViewerWindow(title, file);
|
|
w.Show();
|
|
});
|
|
}
|
|
|
|
public static void Show(string path, string title) {
|
|
App.MainDispatcher.BeginInvoke(() => {
|
|
var w = new DocumentViewerWindow(title, path);
|
|
w.Show();
|
|
});
|
|
}
|
|
|
|
public static async Task Print(string path, int copies = 1) {
|
|
var p = new Process() { StartInfo = new() { FileName = PdfToPrinter } };
|
|
p.StartInfo.ArgumentList.Add(path);
|
|
p.StartInfo.ArgumentList.Add($"copies={copies}");
|
|
p.Start();
|
|
await p.WaitForExitAsync();
|
|
}
|
|
}
|
|
}
|