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:
2026-08-27 07:37:09 +02:00
parent 532485a830
commit 6610acfa44
230 changed files with 9362 additions and 11508 deletions
+10 -10
View File
@@ -10,14 +10,14 @@ $ErrorActionPreference = 'Stop'
Set-StrictMode -Version Latest
$projectDir = Split-Path -Parent $PSScriptRoot
$appProject = Join-Path $projectDir 'KillerPDF.csproj'
$launcherProject = Join-Path $projectDir 'Packaging\KillerLauncher\KillerLauncher.csproj'
$appProject = Join-Path $projectDir 'MmdPdf.csproj'
$launcherProject = Join-Path $projectDir 'Packaging\MmdPdfLauncher\MmdPdfLauncher.csproj'
$artifactRoot = Join-Path $projectDir "bin\$Configuration\net48\portable-package"
$payloadDir = Join-Path $artifactRoot 'payload'
$payloadZip = Join-Path $artifactRoot 'payload.zip'
$launcherOutput = Join-Path $artifactRoot 'launcher'
$publicDir = Join-Path $projectDir "bin\$Configuration\net48\publish"
$publicExe = Join-Path $publicDir 'KillerPDF.exe'
$publicExe = Join-Path $publicDir 'MmdPdf.exe'
if (-not $RepackOnly) {
if ([IO.Directory]::Exists($artifactRoot)) { [IO.Directory]::Delete($artifactRoot, $true) }
@@ -31,10 +31,10 @@ if ([IO.Directory]::Exists($launcherOutput)) { [IO.Directory]::Delete($launcherO
$versionXml = [xml](Get-Content -Raw -LiteralPath $appProject)
$versionNode = $versionXml.SelectSingleNode('/Project/PropertyGroup/Version')
$version = if ($versionNode) { [string]$versionNode.InnerText } else { '' }
if (-not $version) { throw 'KillerPDF.csproj has no Version.' }
if (-not $version) { throw 'MmdPdf.csproj has no Version.' }
if (-not $RepackOnly) {
Write-Host "==> Building loose KillerPDF payload $version..." -ForegroundColor Cyan
Write-Host "==> Building loose MmdPdf payload $version..." -ForegroundColor Cyan
& dotnet publish $appProject -c $Configuration `
-p:KillerPayloadBuild=true `
-p:PublishDir="$payloadDir\"
@@ -49,7 +49,7 @@ if (-not $RepackOnly) {
# The PDF file-type icon is a loose installed asset even though the application also embeds it.
[IO.File]::Copy((Join-Path $projectDir 'Resources\pdf-file.ico'),
(Join-Path $payloadDir 'pdf-file.ico'), $true)
} elseif (-not [IO.File]::Exists((Join-Path $payloadDir 'KillerPDF.App.exe'))) {
} elseif (-not [IO.File]::Exists((Join-Path $payloadDir 'MmdPdf.App.exe'))) {
throw 'RepackOnly requested but the prepared payload is missing.'
}
@@ -67,7 +67,7 @@ if ($payloadDifference.Count -gt 0) {
$details = ($payloadDifference | ForEach-Object { "$($_.SideIndicator) $($_.InputObject)" }) -join [Environment]::NewLine
throw "Payload file set changed. Review dependencies and update build\payload-files.txt deliberately:`n$details"
}
foreach ($required in 'KillerPDF.App.exe', 'pdfium.dll', 'PdfSharpCore.dll', 'System.Text.Json.dll') {
foreach ($required in 'MmdPdf.App.exe', 'pdfium.dll', 'PdfSharpCore.dll', 'System.Text.Json.dll') {
if ($actualPayloadNames -notcontains $required) {
throw "Required loose payload file is missing ($required). Costura/Fody may have run accidentally."
}
@@ -105,15 +105,15 @@ finally { $zipStream.Dispose() }
Write-Host "==> Building the public portable launcher..." -ForegroundColor Cyan
& dotnet publish $launcherProject -c $Configuration `
-p:LauncherAssemblyName=KillerPDF `
-p:LauncherAssemblyName=MmdPdf `
-p:LauncherVersion=$version `
-p:LauncherIcon="$(Join-Path $projectDir 'Resources\kp-icon.ico')" `
-p:LauncherIcon="$(Join-Path $projectDir 'Resources\mmd-icon.ico')" `
-p:PayloadZip="$payloadZip" `
-p:AllowUnsignedInstall="$(!$RequireSignature)" `
-p:PublishDir="$launcherOutput\"
if ($LASTEXITCODE -ne 0) { throw 'Launcher build failed.' }
$builtLauncher = Join-Path $launcherOutput 'KillerPDF.exe'
$builtLauncher = Join-Path $launcherOutput 'MmdPdf.exe'
if (-not [IO.File]::Exists($builtLauncher)) { throw "Launcher output is missing: $builtLauncher" }
[IO.File]::Copy($builtLauncher, $publicExe, $true)
+7 -7
View File
@@ -57,18 +57,18 @@ function Read-Trace([string]$Path) {
}
$results = @()
$oldTrace = [Environment]::GetEnvironmentVariable('KILLERPDF_STARTUP_TRACE', 'Process')
$oldTrace = [Environment]::GetEnvironmentVariable('MMDPDF_STARTUP_TRACE', 'Process')
try {
for ($i = 1; $i -le $Iterations; $i++) {
$trace = Join-Path ([IO.Path]::GetTempPath()) ("killerpdf-startup-{0}.trace" -f [guid]::NewGuid().ToString('N'))
[Environment]::SetEnvironmentVariable('KILLERPDF_STARTUP_TRACE', $trace, 'Process')
$trace = Join-Path ([IO.Path]::GetTempPath()) ("mmdpdf-startup-{0}.trace" -f [guid]::NewGuid().ToString('N'))
[Environment]::SetEnvironmentVariable('MMDPDF_STARTUP_TRACE', $trace, 'Process')
$process = Start-Process -FilePath $ExePath -PassThru
$launchedUtc = $process.StartTime.ToUniversalTime()
$deadline = [datetime]::UtcNow.AddSeconds($TimeoutSeconds)
try {
while ([datetime]::UtcNow -lt $deadline) {
if ($process.HasExited) { throw "KillerPDF exited before reaching the ready marker (exit $($process.ExitCode))." }
if ($process.HasExited) { throw "MmdPdf exited before reaching the ready marker (exit $($process.ExitCode))." }
if ((Test-Path -LiteralPath $trace) -and
(Select-String -LiteralPath $trace -SimpleMatch 'MainWindow ready' -Quiet)) { break }
Start-Sleep -Milliseconds 25
@@ -76,7 +76,7 @@ try {
}
if (-not (Test-Path -LiteralPath $trace) -or
-not (Select-String -LiteralPath $trace -SimpleMatch 'MainWindow ready' -Quiet)) {
throw "Timed out after $TimeoutSeconds seconds waiting for KillerPDF startup."
throw "Timed out after $TimeoutSeconds seconds waiting for MmdPdf startup."
}
$timing = Read-Trace $trace
@@ -98,7 +98,7 @@ try {
finally {
if ($Launcher -and -not $process.HasExited) {
$children = @(Get-CimInstance Win32_Process -ErrorAction SilentlyContinue |
Where-Object { $_.ParentProcessId -eq $process.Id -and $_.Name -eq 'KillerPDF.App.exe' })
Where-Object { $_.ParentProcessId -eq $process.Id -and $_.Name -eq 'MmdPdf.App.exe' })
foreach ($child in $children) {
Stop-Process -Id $child.ProcessId -Force -ErrorAction SilentlyContinue
}
@@ -113,7 +113,7 @@ try {
}
}
finally {
[Environment]::SetEnvironmentVariable('KILLERPDF_STARTUP_TRACE', $oldTrace, 'Process')
[Environment]::SetEnvironmentVariable('MMDPDF_STARTUP_TRACE', $oldTrace, 'Process')
}
$results | Export-Csv -LiteralPath $OutputCsv -NoTypeInformation -Encoding UTF8
+2 -2
View File
@@ -2,8 +2,8 @@ CommunityToolkit.Mvvm.dll
de/PdfSharpCore.resources.dll
Docnet.Core.dll
ICSharpCode.SharpZipLib.dll
KillerPDF.App.exe
KillerPDF.App.exe.config
MmdPdf.App.exe
MmdPdf.App.exe.config
LICENSE
Microsoft.Bcl.AsyncInterfaces.dll
Microsoft.Bcl.HashCode.dll