feat: rebrand to MMD PDF, single corporate theme, and remove original text under an edit
- Services/PdfRedactText.cs: strip text whose origin falls inside a CoverAnnotation from the page content stream at save time, hooked into PdfBurn.DrawAnnotationsIntoDoc. Fixes edited values staying recoverable by text extraction. - Themes/MMD.xaml replaces all thirteen themes; picker and accent strip removed; no dark mode. - Rename KillerPDF -> MMD PDF across code, resources, packaging and locale strings; new icon. - Remove the upstream author credit and the in-app install button.
This commit is contained in:
@@ -4,7 +4,7 @@ using System.IO;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
|
||||
namespace KillerPDF.Features
|
||||
namespace MmdPdf.Features
|
||||
{
|
||||
/// <summary>
|
||||
/// Everything the About card does that is not drawing: reading the signature and release date,
|
||||
@@ -21,9 +21,9 @@ namespace KillerPDF.Features
|
||||
// Steve's: a fork signed by somebody else must not claim the alias, and an unsigned build
|
||||
// has no subject at all. Family standard, see code/CLAUDE.md.
|
||||
private const string SignerName = "Stephen Riley";
|
||||
private const string AkaName = "Steve the Killer";
|
||||
private const string AkaName = "MMD Steel Group IT";
|
||||
|
||||
private const string Repo = "https://github.com/SteveTheKiller/KillerPDF";
|
||||
private const string Repo = "https://github.com/SteveTheKiller/MmdPdf";
|
||||
|
||||
private readonly IAboutHost _host;
|
||||
|
||||
@@ -109,7 +109,7 @@ namespace KillerPDF.Features
|
||||
{
|
||||
System.Net.ServicePointManager.SecurityProtocol |= System.Net.SecurityProtocolType.Tls12;
|
||||
using var http = new System.Net.Http.HttpClient { Timeout = TimeSpan.FromSeconds(4) };
|
||||
http.DefaultRequestHeaders.UserAgent.ParseAdd("KillerPDF-UpdateCheck");
|
||||
http.DefaultRequestHeaders.UserAgent.ParseAdd("MmdPdf-UpdateCheck");
|
||||
var json = await http.GetStringAsync($"{Repo.Replace("github.com", "api.github.com/repos")}/releases/latest")
|
||||
.ConfigureAwait(true);
|
||||
|
||||
@@ -148,13 +148,13 @@ namespace KillerPDF.Features
|
||||
if (_host.IsDirty)
|
||||
{
|
||||
KillerDialog.Show(_host.Window, _host.Loc("Str_Dlg_SaveBeforeUpdate"),
|
||||
"KillerPDF", MessageBoxButton.OK, MessageBoxImage.Warning);
|
||||
"MmdPdf", MessageBoxButton.OK, MessageBoxImage.Warning);
|
||||
return;
|
||||
}
|
||||
|
||||
var confirm = KillerDialog.Show(_host.Window,
|
||||
string.Format(_host.Loc("Str_UpdatePrompt"), tag),
|
||||
"KillerPDF", MessageBoxButton.OKCancel, MessageBoxImage.Question);
|
||||
"MmdPdf", MessageBoxButton.OKCancel, MessageBoxImage.Question);
|
||||
if (confirm != MessageBoxResult.OK) return;
|
||||
|
||||
_host.UpdateEnabled = false;
|
||||
@@ -187,9 +187,9 @@ namespace KillerPDF.Features
|
||||
{
|
||||
System.Net.ServicePointManager.SecurityProtocol |= System.Net.SecurityProtocolType.Tls12;
|
||||
using var http = new System.Net.Http.HttpClient { Timeout = TimeSpan.FromSeconds(90) };
|
||||
http.DefaultRequestHeaders.UserAgent.ParseAdd("KillerPDF-UpdateCheck");
|
||||
http.DefaultRequestHeaders.UserAgent.ParseAdd("MmdPdf-UpdateCheck");
|
||||
|
||||
var exeUrl = $"{Repo}/releases/download/{tag}/KillerPDF.exe";
|
||||
var exeUrl = $"{Repo}/releases/download/{tag}/MmdPdf.exe";
|
||||
// Read the checksums from the release ASSET next to the exe, not from
|
||||
// raw.githubusercontent at the tag. Both files are uploaded to the release
|
||||
// together, so the hash can never drift from the exe the way a repo-committed
|
||||
@@ -202,7 +202,7 @@ namespace KillerPDF.Features
|
||||
string? expected = null;
|
||||
foreach (var line in sumsTxt.Replace("\r", "").Split('\n'))
|
||||
{
|
||||
if (line.TrimStart().StartsWith("KillerPDF.exe", StringComparison.OrdinalIgnoreCase))
|
||||
if (line.TrimStart().StartsWith("MmdPdf.exe", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
var parts = line.Split([' ', '\t'], StringSplitOptions.RemoveEmptyEntries);
|
||||
if (parts.Length >= 2) expected = parts[^1];
|
||||
@@ -216,7 +216,7 @@ namespace KillerPDF.Features
|
||||
actual = BitConverter.ToString(sha.ComputeHash(exeBytes)).Replace("-", "");
|
||||
if (!actual.Equals(expected, StringComparison.OrdinalIgnoreCase)) return null;
|
||||
|
||||
var path = Path.Combine(Path.GetTempPath(), $"KillerPDF_update_{Guid.NewGuid():N}.exe");
|
||||
var path = Path.Combine(Path.GetTempPath(), $"MmdPdf_update_{Guid.NewGuid():N}.exe");
|
||||
File.WriteAllBytes(path, exeBytes);
|
||||
return path;
|
||||
}
|
||||
@@ -233,9 +233,9 @@ namespace KillerPDF.Features
|
||||
var reopen = _host.FileToReopen;
|
||||
var pid = Process.GetCurrentProcess().Id;
|
||||
var relArg = string.IsNullOrEmpty(reopen) ? "" : $" \"{reopen}\"";
|
||||
var bat = Path.Combine(Path.GetTempPath(), $"killerpdf_update_{Guid.NewGuid():N}.bat");
|
||||
var bat = Path.Combine(Path.GetTempPath(), $"mmdpdf_update_{Guid.NewGuid():N}.bat");
|
||||
bool portable = App.IsPortable();
|
||||
string? portableLauncher = Environment.GetEnvironmentVariable("KILLERPDF_LAUNCHER_PATH");
|
||||
string? portableLauncher = Environment.GetEnvironmentVariable("MMDPDF_LAUNCHER_PATH");
|
||||
bool packagedPortable = portable && !string.IsNullOrWhiteSpace(portableLauncher) && File.Exists(portableLauncher);
|
||||
|
||||
if (!App.VerifyAuthenticode(newExe).Valid)
|
||||
@@ -252,7 +252,7 @@ namespace KillerPDF.Features
|
||||
// When elevated, relaunch through explorer.exe so the app comes back at the user's
|
||||
// normal integrity level rather than inheriting the elevated token. explorer.exe
|
||||
// cannot forward arguments, so the currently-open file is not reopened on that
|
||||
// path - a one-off convenience loss, preferred over leaving KillerPDF running as
|
||||
// path - a one-off convenience loss, preferred over leaving MmdPdf running as
|
||||
// administrator for the rest of the session.
|
||||
var script = new StringBuilder()
|
||||
.AppendLine("@echo off")
|
||||
@@ -262,7 +262,7 @@ namespace KillerPDF.Features
|
||||
|
||||
if (packagedPortable)
|
||||
{
|
||||
if (int.TryParse(Environment.GetEnvironmentVariable("KILLERPDF_LAUNCHER_PID"), out int launcherPid))
|
||||
if (int.TryParse(Environment.GetEnvironmentVariable("MMDPDF_LAUNCHER_PID"), out int launcherPid))
|
||||
{
|
||||
script.AppendLine(":waitlauncher")
|
||||
.AppendLine($"tasklist /fi \"PID eq {launcherPid}\" 2>nul | find \"{launcherPid}\" >nul")
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace KillerPDF.Features
|
||||
namespace MmdPdf.Features
|
||||
{
|
||||
/// <summary>
|
||||
/// What AboutController needs from the window hosting it, beyond the shared shell services.
|
||||
@@ -6,7 +6,7 @@ namespace KillerPDF.Features
|
||||
/// Every member is a value or a plain string, never a control, so the controller holds no
|
||||
/// reference to a TextBlock or a Button and can be driven by a stub in a test.
|
||||
///
|
||||
/// KillerPDF differs from Killendar's version in one way worth knowing: several of the About
|
||||
/// MmdPdf differs from Killendar's version in one way worth knowing: several of the About
|
||||
/// card's lines are built as INLINES rather than set as text - the wordmark is two differently
|
||||
/// styled runs, and the tagline, version and alias each carry a hyperlink. Constructing those
|
||||
/// is UI work, so it stays in the shell and the controller hands over only the strings and the
|
||||
|
||||
@@ -5,15 +5,15 @@ using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using PdfSharpCore.Pdf;
|
||||
using PdfSharpCore.Pdf.IO;
|
||||
using KillerPDF.Services;
|
||||
using MmdPdf.Services;
|
||||
|
||||
namespace KillerPDF.Features
|
||||
namespace MmdPdf.Features
|
||||
{
|
||||
// ============================================================
|
||||
// Headless CLI batch mode
|
||||
// ============================================================
|
||||
//
|
||||
// KillerPDF.exe --batch-resave <input.pdf|inputDir> <output.pdf|outputDir> [--log <file.csv>] [--quiet]
|
||||
// MmdPdf.exe --batch-resave <input.pdf|inputDir> <output.pdf|outputDir> [--log <file.csv>] [--quiet]
|
||||
//
|
||||
// Resaves one PDF (or every *.pdf under a folder tree, mirroring the
|
||||
// relative structure into the output folder) through the same pipeline a
|
||||
@@ -25,7 +25,7 @@ namespace KillerPDF.Features
|
||||
//
|
||||
// Built for the veraPDF validation harness (validation/): baseline the
|
||||
// corpus, --batch-resave it, validate the output tree, then diff with
|
||||
// validation/Compare-VeraPDF.ps1. The claim being tested is "a KillerPDF
|
||||
// validation/Compare-VeraPDF.ps1. The claim being tested is "a MmdPdf
|
||||
// save does not degrade standards conformance".
|
||||
//
|
||||
// Exit codes: 0 = every file OK or SKIP, 1 = at least one FAIL
|
||||
@@ -34,7 +34,7 @@ namespace KillerPDF.Features
|
||||
// Invoked from App.OnStartup BEFORE the single-instance mutex, so a batch
|
||||
// run works even while a GUI instance is open and never forwards to it.
|
||||
//
|
||||
// KillerPDF builds as a GUI-subsystem exe, so it has no console of its
|
||||
// MmdPdf builds as a GUI-subsystem exe, so it has no console of its
|
||||
// own; AttachConsole(-1) latches onto the parent terminal when launched
|
||||
// from one. Output interleaves with the prompt (standard GUI-app quirk) -
|
||||
// the authoritative record is the --log CSV and the exit code.
|
||||
@@ -82,7 +82,7 @@ namespace KillerPDF.Features
|
||||
|
||||
if (badUsage || string.IsNullOrWhiteSpace(input) || string.IsNullOrWhiteSpace(output))
|
||||
{
|
||||
con.WriteLine("Usage: KillerPDF.exe --batch-resave <input.pdf|inputDir> <output.pdf|outputDir> [--log <file.csv>] [--quiet]");
|
||||
con.WriteLine("Usage: MmdPdf.exe --batch-resave <input.pdf|inputDir> <output.pdf|outputDir> [--log <file.csv>] [--quiet]");
|
||||
exitCode = 2;
|
||||
return true;
|
||||
}
|
||||
|
||||
+21
-21
@@ -18,14 +18,14 @@ using Docnet.Core.Models;
|
||||
using PdfSharpCore.Drawing;
|
||||
using PdfSharpCore.Pdf;
|
||||
using PdfSharpCore.Pdf.IO;
|
||||
using KillerPDF.Services;
|
||||
using MmdPdf.Services;
|
||||
// The scrubs, bitmap helpers, import helpers and PDFium interop all live in Services
|
||||
// (PdfScrub.cs, BitmapHelpers.cs, PdfImport.cs, PdfiumInterop.cs; KillerUI refactor,
|
||||
// (PdfScrub.cs, BitmapHelpers.cs, PdfImport.cs, PdfiumInterop.cs; MmdPdfUI refactor,
|
||||
// 2026-07-31), called qualified below. No Features-to-Shell reaches remain in this file.
|
||||
// OpenBatchConsole and FlattenBatchDetail are shared with the batch runner.
|
||||
using static KillerPDF.Features.BatchRunner;
|
||||
using static MmdPdf.Features.BatchRunner;
|
||||
|
||||
namespace KillerPDF.Features
|
||||
namespace MmdPdf.Features
|
||||
{
|
||||
// ============================================================
|
||||
// Command-line interface
|
||||
@@ -35,7 +35,7 @@ namespace KillerPDF.Features
|
||||
// BEFORE the single-instance mutex, so CLI runs work while a GUI instance
|
||||
// is open, never forward to it, and never show a window. A launch with no
|
||||
// recognized command flag falls through to the normal GUI (including the
|
||||
// classic "KillerPDF.exe file.pdf" file-association open).
|
||||
// classic "MmdPdf.exe file.pdf" file-association open).
|
||||
//
|
||||
// Each command reuses the same pipeline its GUI equivalent runs - the
|
||||
// merge named-destination rewrite, the pre-save scrubs, the PDFium
|
||||
@@ -140,11 +140,11 @@ namespace KillerPDF.Features
|
||||
|
||||
private static string CliHelpText() => string.Join(Environment.NewLine,
|
||||
[
|
||||
"KillerPDF " + (Assembly.GetExecutingAssembly().GetName().Version?.ToString(3) ?? "") + " - command line usage",
|
||||
"MmdPdf " + (Assembly.GetExecutingAssembly().GetName().Version?.ToString(3) ?? "") + " - command line usage",
|
||||
"",
|
||||
" KillerPDF.exe <file.pdf> open in the app",
|
||||
" KillerPDF.exe --version | -v print version",
|
||||
" KillerPDF.exe --help | -h | /? this text",
|
||||
" MmdPdf.exe <file.pdf> open in the app",
|
||||
" MmdPdf.exe --version | -v print version",
|
||||
" MmdPdf.exe --help | -h | /? this text",
|
||||
"",
|
||||
" --merge <out.pdf> <in1> <in2> ... merge PDFs (and images) into one PDF",
|
||||
" --extract-pages <in.pdf> <pages> <out.pdf>",
|
||||
@@ -165,7 +165,7 @@ namespace KillerPDF.Features
|
||||
" open/save pipeline (validation harness)",
|
||||
"",
|
||||
"Exit codes: 0 success, 1 operation failed, 2 bad usage.",
|
||||
"Runs headless and works while the KillerPDF window is open.",
|
||||
"Runs headless and works while the MmdPdf window is open.",
|
||||
]);
|
||||
|
||||
/// <summary>
|
||||
@@ -246,7 +246,7 @@ namespace KillerPDF.Features
|
||||
{
|
||||
if (pos.Count < 3)
|
||||
{
|
||||
con.WriteLine("Usage: KillerPDF.exe --merge <out.pdf> <in1.pdf> <in2.pdf> ...");
|
||||
con.WriteLine("Usage: MmdPdf.exe --merge <out.pdf> <in1.pdf> <in2.pdf> ...");
|
||||
return 2;
|
||||
}
|
||||
string outPath = Path.GetFullPath(pos[0]);
|
||||
@@ -297,7 +297,7 @@ namespace KillerPDF.Features
|
||||
{
|
||||
if (pos.Count != 3)
|
||||
{
|
||||
con.WriteLine("Usage: KillerPDF.exe --extract-pages <in.pdf> <pages> <out.pdf> (pages like 1-3,5,9-12)");
|
||||
con.WriteLine("Usage: MmdPdf.exe --extract-pages <in.pdf> <pages> <out.pdf> (pages like 1-3,5,9-12)");
|
||||
return 2;
|
||||
}
|
||||
string inPath = Path.GetFullPath(pos[0]), spec = pos[1], outPath = Path.GetFullPath(pos[2]);
|
||||
@@ -325,7 +325,7 @@ namespace KillerPDF.Features
|
||||
{
|
||||
if (pos.Count != 2)
|
||||
{
|
||||
con.WriteLine("Usage: KillerPDF.exe --split <in.pdf> <outputFolder>");
|
||||
con.WriteLine("Usage: MmdPdf.exe --split <in.pdf> <outputFolder>");
|
||||
return 2;
|
||||
}
|
||||
string inPath = Path.GetFullPath(pos[0]), outDir = Path.GetFullPath(pos[1]);
|
||||
@@ -358,7 +358,7 @@ namespace KillerPDF.Features
|
||||
{
|
||||
if (pos.Count != 2)
|
||||
{
|
||||
con.WriteLine("Usage: KillerPDF.exe --decrypt <in.pdf> <out.pdf> [--password <password>]");
|
||||
con.WriteLine("Usage: MmdPdf.exe --decrypt <in.pdf> <out.pdf> [--password <password>]");
|
||||
return 2;
|
||||
}
|
||||
string inPath = Path.GetFullPath(pos[0]), outPath = Path.GetFullPath(pos[1]);
|
||||
@@ -479,7 +479,7 @@ namespace KillerPDF.Features
|
||||
{
|
||||
if (pos.Count != 2)
|
||||
{
|
||||
con.WriteLine("Usage: KillerPDF.exe --to-image <in.pdf> <outputFolder> [--dpi <n>] [--format png|jpg] [--pages <range>] [--transparent]");
|
||||
con.WriteLine("Usage: MmdPdf.exe --to-image <in.pdf> <outputFolder> [--dpi <n>] [--format png|jpg] [--pages <range>] [--transparent]");
|
||||
return 2;
|
||||
}
|
||||
string inPath = Path.GetFullPath(pos[0]), outDir = Path.GetFullPath(pos[1]);
|
||||
@@ -520,7 +520,7 @@ namespace KillerPDF.Features
|
||||
{
|
||||
w = pr.GetPageWidth();
|
||||
h = pr.GetPageHeight();
|
||||
raw = KillerPDF.Services.PdfiumInterop.RenderPageWithAnnotations(
|
||||
raw = MmdPdf.Services.PdfiumInterop.RenderPageWithAnnotations(
|
||||
renderPath, idx, w, h, transparent)
|
||||
?? (transparent
|
||||
? pr.GetImage()
|
||||
@@ -546,7 +546,7 @@ namespace KillerPDF.Features
|
||||
{
|
||||
if (pos.Count != 2)
|
||||
{
|
||||
con.WriteLine("Usage: KillerPDF.exe --flatten <in.pdf> <out.pdf> [--dpi <n>]");
|
||||
con.WriteLine("Usage: MmdPdf.exe --flatten <in.pdf> <out.pdf> [--dpi <n>]");
|
||||
return 2;
|
||||
}
|
||||
string inPath = Path.GetFullPath(pos[0]), outPath = Path.GetFullPath(pos[1]);
|
||||
@@ -570,7 +570,7 @@ namespace KillerPDF.Features
|
||||
// #141: WithAnnotations, or the rebuild drops the file's own markup.
|
||||
w = pr.GetPageWidth();
|
||||
h = pr.GetPageHeight();
|
||||
raw = KillerPDF.Services.PdfiumInterop.RenderPageWithAnnotations(renderPath, i, w, h)
|
||||
raw = MmdPdf.Services.PdfiumInterop.RenderPageWithAnnotations(renderPath, i, w, h)
|
||||
?? pr.GetImage(new Docnet.Core.Converters.NaiveTransparencyRemover());
|
||||
}
|
||||
int rot = rotations != null && i < rotations.Length ? rotations[i] : 0;
|
||||
@@ -616,7 +616,7 @@ namespace KillerPDF.Features
|
||||
{
|
||||
if (pos.Count != 1)
|
||||
{
|
||||
con.WriteLine("Usage: KillerPDF.exe --print <in.pdf> [--printer <name>] [--pages <range>] [--copies <n>]");
|
||||
con.WriteLine("Usage: MmdPdf.exe --print <in.pdf> [--printer <name>] [--pages <range>] [--copies <n>]");
|
||||
return 2;
|
||||
}
|
||||
string inPath = Path.GetFullPath(pos[0]);
|
||||
@@ -677,7 +677,7 @@ namespace KillerPDF.Features
|
||||
{
|
||||
w = pr.GetPageWidth();
|
||||
h = pr.GetPageHeight();
|
||||
raw = KillerPDF.Services.PdfiumInterop.RenderPageWithAnnotations(renderPath, idx, w, h)
|
||||
raw = MmdPdf.Services.PdfiumInterop.RenderPageWithAnnotations(renderPath, idx, w, h)
|
||||
?? pr.GetImage(); // #141
|
||||
}
|
||||
int rot = rotations != null && idx < rotations.Length ? rotations[idx] : 0;
|
||||
@@ -740,7 +740,7 @@ namespace KillerPDF.Features
|
||||
{
|
||||
if (pos.Count != 2)
|
||||
{
|
||||
con.WriteLine("Usage: KillerPDF.exe --ocr <in.pdf> <out.pdf> [--lang <code>] (default eng)");
|
||||
con.WriteLine("Usage: MmdPdf.exe --ocr <in.pdf> <out.pdf> [--lang <code>] (default eng)");
|
||||
return 2;
|
||||
}
|
||||
string inPath = Path.GetFullPath(pos[0]), outPath = Path.GetFullPath(pos[1]);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
using System.Windows;
|
||||
|
||||
namespace KillerPDF.Features
|
||||
namespace MmdPdf.Features
|
||||
{
|
||||
/// <summary>
|
||||
/// The three things every feature needs from the window: an owner for modal dialogs, string
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace KillerPDF.Features
|
||||
namespace MmdPdf.Features
|
||||
{
|
||||
/// <summary>
|
||||
/// What OcrController needs from the window hosting it, beyond the shared shell services.
|
||||
|
||||
@@ -9,14 +9,14 @@ using Microsoft.Win32;
|
||||
using PdfSharpCore.Drawing;
|
||||
using PdfSharpCore.Pdf;
|
||||
using PdfSharpCore.Pdf.IO;
|
||||
using KillerPDF.Services;
|
||||
using MmdPdf.Services;
|
||||
|
||||
namespace KillerPDF.Features
|
||||
namespace MmdPdf.Features
|
||||
{
|
||||
/// <summary>
|
||||
/// The four OCR operations that work on the open document: page to clipboard, region to
|
||||
/// clipboard, searchable PDF, and extract-all-text. Moved out of Ocr.cs (MainWindow) in the
|
||||
/// KillerUI refactor.
|
||||
/// MmdPdfUI refactor.
|
||||
///
|
||||
/// Holds no controls. Talks to the window only through <see cref="IOcrHost"/>, so the whole
|
||||
/// of this file is testable against a stub host. The pure language/download helpers live in
|
||||
@@ -84,7 +84,7 @@ namespace KillerPDF.Features
|
||||
catch (Exception ex)
|
||||
{
|
||||
_host.HideBusy();
|
||||
KillerDialog.Show(_host.Window, _host.Loc("Str_Err_OcrFailed") + "\n" + ex.Message, "KillerPDF",
|
||||
KillerDialog.Show(_host.Window, _host.Loc("Str_Err_OcrFailed") + "\n" + ex.Message, "MmdPdf",
|
||||
MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
}
|
||||
finally
|
||||
@@ -141,7 +141,7 @@ namespace KillerPDF.Features
|
||||
catch (Exception ex)
|
||||
{
|
||||
_host.HideBusy();
|
||||
KillerDialog.Show(_host.Window, _host.Loc("Str_Err_OcrFailed") + "\n" + ex.Message, "KillerPDF", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
KillerDialog.Show(_host.Window, _host.Loc("Str_Err_OcrFailed") + "\n" + ex.Message, "MmdPdf", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
}
|
||||
finally
|
||||
{
|
||||
@@ -173,7 +173,7 @@ namespace KillerPDF.Features
|
||||
if (!await _host.EnsureOcrModelsReadyAsync()) return;
|
||||
_host.CommitActiveTextBox();
|
||||
|
||||
var dlg = new KillerPDF.Controls.FileDialog(KillerPDF.Controls.FileDialogMode.Save)
|
||||
var dlg = new MmdPdf.Controls.FileDialog(MmdPdf.Controls.FileDialogMode.Save)
|
||||
{
|
||||
Filter = _host.Loc("Str_Filter_Pdf") + "|*.pdf",
|
||||
Title = _host.Loc("Str_Ocr_SaveSearchable"),
|
||||
@@ -190,7 +190,7 @@ namespace KillerPDF.Features
|
||||
try { _host.SaveDocumentTo(src); }
|
||||
catch (Exception ex)
|
||||
{
|
||||
KillerDialog.Show(_host.Window, _host.Loc("Str_Err_PrepareDoc") + "\n" + ex.Message, "KillerPDF",
|
||||
KillerDialog.Show(_host.Window, _host.Loc("Str_Err_PrepareDoc") + "\n" + ex.Message, "MmdPdf",
|
||||
MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
return;
|
||||
}
|
||||
@@ -208,12 +208,12 @@ namespace KillerPDF.Features
|
||||
_host.SetStatus(string.Format(_host.Loc("Str_St_SearchableSaved"), pages, words));
|
||||
KillerDialog.Show(_host.Window,
|
||||
string.Format(_host.Loc("Str_Dlg_SearchableSaved"), outPath, pages, words),
|
||||
"KillerPDF", MessageBoxButton.OK, MessageBoxImage.Information);
|
||||
"MmdPdf", MessageBoxButton.OK, MessageBoxImage.Information);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_host.HideBusy();
|
||||
KillerDialog.Show(_host.Window, _host.Loc("Str_Err_SearchableFailed") + "\n" + ex.Message, "KillerPDF",
|
||||
KillerDialog.Show(_host.Window, _host.Loc("Str_Err_SearchableFailed") + "\n" + ex.Message, "MmdPdf",
|
||||
MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
}
|
||||
finally
|
||||
@@ -311,7 +311,7 @@ namespace KillerPDF.Features
|
||||
if (!await _host.EnsureOcrModelsReadyAsync()) return;
|
||||
_host.CommitActiveTextBox();
|
||||
|
||||
var dlg = new KillerPDF.Controls.FileDialog(KillerPDF.Controls.FileDialogMode.Save)
|
||||
var dlg = new MmdPdf.Controls.FileDialog(MmdPdf.Controls.FileDialogMode.Save)
|
||||
{
|
||||
Filter = _host.Loc("Str_Filter_Text") + "|*.txt|Markdown|*.md",
|
||||
Title = _host.Loc("Str_Ocr_ExtractAllText"),
|
||||
@@ -328,7 +328,7 @@ namespace KillerPDF.Features
|
||||
try { _host.SaveDocumentTo(src); pageCount = _host.PageCount; }
|
||||
catch (Exception ex)
|
||||
{
|
||||
KillerDialog.Show(_host.Window, _host.Loc("Str_Err_PrepareDoc") + "\n" + ex.Message, "KillerPDF",
|
||||
KillerDialog.Show(_host.Window, _host.Loc("Str_Err_PrepareDoc") + "\n" + ex.Message, "MmdPdf",
|
||||
MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
return;
|
||||
}
|
||||
@@ -348,7 +348,7 @@ namespace KillerPDF.Features
|
||||
catch (Exception ex)
|
||||
{
|
||||
_host.HideBusy();
|
||||
KillerDialog.Show(_host.Window, _host.Loc("Str_Err_ExtractFailed") + "\n" + ex.Message, "KillerPDF",
|
||||
KillerDialog.Show(_host.Window, _host.Loc("Str_Err_ExtractFailed") + "\n" + ex.Message, "MmdPdf",
|
||||
MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
}
|
||||
finally
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace KillerPDF.Features
|
||||
namespace MmdPdf.Features
|
||||
{
|
||||
/// <summary>
|
||||
/// What SearchController needs from the window hosting it, beyond the shared shell services.
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
using KillerPDF.Services;
|
||||
using MmdPdf.Services;
|
||||
|
||||
namespace KillerPDF.Features
|
||||
namespace MmdPdf.Features
|
||||
{
|
||||
/// <summary>
|
||||
/// The document-search state machine: runs SearchService over the working file, keeps the
|
||||
/// per-page rect map and the flat reading-ordered match list, and steps the match cursor.
|
||||
/// Moved out of Search.cs (MainWindow) in the KillerUI refactor.
|
||||
/// Moved out of Search.cs (MainWindow) in the MmdPdfUI refactor.
|
||||
///
|
||||
/// Holds no controls. Talks to the window only through <see cref="ISearchHost"/>; the search
|
||||
/// bar UI, debounce, and the highlight painting stay in the shell half (Shell/Search.cs).
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
using System.Windows;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Controls;
|
||||
using KillerPDF.Controls;
|
||||
using MmdPdf.Controls;
|
||||
|
||||
namespace KillerPDF.Features
|
||||
namespace MmdPdf.Features
|
||||
{
|
||||
/// <summary>
|
||||
/// What a document viewer needs from the window around it.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace KillerPDF
|
||||
namespace MmdPdf
|
||||
{
|
||||
/// <summary>
|
||||
/// The tab and session members under the names the window already calls them by, routed to the
|
||||
|
||||
@@ -6,7 +6,7 @@ using System.Windows.Media;
|
||||
using System.Windows.Shapes;
|
||||
using PdfSharpCore.Pdf;
|
||||
|
||||
namespace KillerPDF
|
||||
namespace MmdPdf
|
||||
{
|
||||
/// <summary>
|
||||
/// The window's half of the viewer bridge. Read this alongside
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
using System.Windows.Controls;
|
||||
using KillerPDF.Controls;
|
||||
using MmdPdf.Controls;
|
||||
|
||||
namespace KillerPDF
|
||||
namespace MmdPdf
|
||||
{
|
||||
// The element names MainWindow.xaml used to generate, now that the document pane is a control
|
||||
// (Controls/PdfViewer.xaml).
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
using KillerPDF.Features;
|
||||
using KillerPDF.Controls;
|
||||
using MmdPdf.Features;
|
||||
using MmdPdf.Controls;
|
||||
using System.Windows;
|
||||
using System.Windows.Input;
|
||||
using System;
|
||||
using System.Linq;
|
||||
|
||||
namespace KillerPDF
|
||||
namespace MmdPdf
|
||||
{
|
||||
// MainWindow's half of IViewerHost.
|
||||
//
|
||||
|
||||
@@ -5,7 +5,7 @@ using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using PdfSharpCore.Pdf;
|
||||
|
||||
namespace KillerPDF
|
||||
namespace MmdPdf
|
||||
{
|
||||
/// <summary>
|
||||
/// Outward stubs: the annotation, text, crop, form and link members under the names the rest of
|
||||
|
||||
Reference in New Issue
Block a user