Scottywins Office to PDF 1.7.10 — Scottywins portable Windows batch converter
================================================

QUICK START
1. Extract the ZIP to a local folder. Open Portable\ScottywinsOfficeToPDF.exe.
2. Browse to your Office files folder and your PDF output folder.
   Initial test paths are C:\test1 and C:\finished; change them as needed.
3. Choose Include subfolders, Preserve folder structure, and Skip existing PDFs.
4. Click Convert to PDF. Click Continue batch at each pause. Review the counters
   and View Log for failures.
5. Open Finished Folder to inspect the results.

HELP, ABOUT, AND BRANDING
Help & About includes instructions, troubleshooting, version, and Scott Moran's
Scottywins contact details. The Scotty Wins logo from scottywins.com is embedded
in the EXE. The dark navy, cyan, and blue theme follows mydogni.com's palette.
Change Source\Branding.cs for future contact changes. To change the logo,
replace Source\Branding\logo.png and rebuild. It is included in the source ZIP.

BATCHES AND LIMITED DISK SPACE
By default the app pauses after every 100 processed Office files. Change the
number before starting, or uncheck Pause every to run continuously.
Click Continue batch after checking results or moving finished PDFs elsewhere.
Cancel works while paused. File counters and the current run remain in memory.
Files skipped because a PDF already exists count toward the batch size.

The app checks available output-drive space before each new export (including
network folders) and pauses if less than the chosen reserve is available.
The default reserve is 512 MB; minimum is 64 MB. Free up space, then click
Continue batch; it rechecks before proceeding. Source publications are untouched.
If space cannot be queried, the run stops and logs the error.

Batches count PUBLICATION FILES, not pages. A single 10,000-page publication
still exports as one PDF. This app does not split publications into page ranges.
A large PDF can exceed the reserve during export: disk-full failures are logged
and partial temporary PDFs are removed where possible. Choose a larger output
drive or network share for very large files. Batching cannot reduce the space
needed for all finished PDFs you keep on the destination drive.

Moving completed PDFs away is fine while the current run stays open. If you
restart, Skip existing PDFs only recognizes files still at their output paths.
Moved PDFs will be regenerated unless you restore them or select an unfinished
source folder. The app never deletes originals or automatically moves PDFs.

PROGRAM UPDATES
Download repository: https://scottywins.com/downloads/publisher-to-pdf/
The app checks Scottywins at startup and every six hours while open. A popup
appears only for newer releases. Choose Download update or Later. Conversion
is never stopped for an update; its popup waits until the run stops. Minimized
apps wait until restored. Each version is announced once per app session.
The app verifies an offline ECDSA signature on the release manifest, then checks
the downloaded ZIP against its signed SHA-256 checksum. Close the app and
extract the ZIP to update. Nothing is installed automatically. Failed checks
show a status in Updates without an error popup or interruption to conversion.
The saved server override remains configurable in the Updates tab and is stored
under %LOCALAPPDATA%\PublisherToPDF\update-server.txt for the current user.
The server source and release guide are in the separate sanitized source-review ZIP.

REQUIREMENTS
Windows 10/11 x64 and an installed, activated Microsoft Publisher version
that supports PDF export. Each coworker needs the Office programs matching the selected file types. The
portable EXE includes .NET; coworkers do not need to install a .NET runtime.
Run Publisher manually once to complete activation and first-run prompts.
Use publications you trust and ensure their fonts and linked images are available.
No administrator privileges are requested by the app.

SAFETY AND RESUMING
Original publications are opened read-only, never saved, renamed, or deleted.
The app uses Publisher's ReadOnly open option and makes no Save or SaveAs calls
on your source files. Publications stay in their original location so that
relative linked resources can resolve normally.
Only PDF files created by this application are cleaned up after a failed export.
PDFs first go to a unique temporary file in the output folder, are checked for
a PDF header, then moved into place. Existing output is preserved on export
failure. This header check is not a full PDF integrity or visual fidelity test.

Skip existing PDFs skips ANY existing PDF at the intended destination, without
checking its age or contents. To resume, leave it checked and run again.
Uncheck it to replace existing PDFs; the app asks before starting that run.
If you flatten subfolders and duplicate basenames exist, the whole run is
rejected before exporting. Enable Preserve folder structure to resolve this.
Folder scans do not follow child directory junctions or symbolic links.
An inaccessible folder stops the scan and is logged; no partial scan is converted.

Cancel safely stops between files, after the current Publisher operation finishes.
Closing the app during conversion also requests cancellation; close it again
when the run has stopped. A Publisher dialog or hung COM call may delay stopping.
Inspect Publisher for activation, damaged-file, or missing-resource prompts.
The app does not force-kill Publisher or interrupt an export in progress.
Each file uses a new Publisher instance. Your existing Publisher session is not
attached to. Do not edit the source publications during a run.

LOGS
View Log opens the latest run log using the Windows Notepad.
Logs are stored in %LOCALAPPDATA%\PublisherToPDF\Logs, not beside the EXE.
Logs contain source/output paths and exception details; review before sharing.
The on-screen log retains recent lines; the saved log contains the whole run.

BUILD FROM SOURCE
Install the .NET 8 SDK for Windows. From the Source folder:

  dotnet build -c Release
  dotnet publish -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -o ..\Portable

No Office interop package is required; COM calls use late binding.
The executable is unsigned. Company application policies may require IT to
approve it or sign a build. This package includes no installer.

TESTS
From the Portable folder, run and wait for process completion:

  ScottywinsOfficeToPDF.exe --self-test
  ScottywinsOfficeToPDF.exe --self-test --publisher-test --office-test

These switches run internal checks without opening the main window and write
test-results.txt beside the executable. The second also uses real Publisher
to create a temporary publication and export it. Fixtures stay in a uniquely
named PublisherToPDF-Test-* folder in the current user's temporary directory.
Test PDFs generated by the fake exporter are intentionally not real documents.

Microsoft API references:
https://learn.microsoft.com/en-us/office/vba/api/publisher.application.open
https://learn.microsoft.com/en-us/office/vba/api/publisher.document.exportasfixedformat
https://learn.microsoft.com/en-us/office/vba/api/publisher.document.close

Before wider rollout, test a few representative coworker publications and
inspect the exported PDFs for page layout, fonts, images, and links.



LICENSING AND FREE TRIAL
Without a saved key, each PC can convert three publication files successfully.
Skipped existing PDFs and failed exports do not consume the trial. The server
retains the count across app restarts and reinstalls on the same Windows PC.
Internet access is required. Once exhausted, the next conversion opens License.
Enter a manually issued key and click Activate. A standard license covers one
PC; multiuser keys share a configurable PC allowance. Deactivate releases a seat.
Lifetime licenses do not expire. Monthly/yearly terms start on first activation
of the KEY, so activating another PC does not restart a shared subscription.
Validation is required at the start of each licensed run and after batch pauses.
Stripe checkout remains disabled pending sandbox verification.
Interrupted trial reports are retried on the next run. Stale reservations expire
after 30 minutes; unknown crash outcomes conservatively consume one trial slot. A Windows reinstall can change the PC identifier. This licensing
is access control for the shipped app, not protection against modified source.
Server administration is supplied separately. Never publish its database,
issued keys, or admin/core scripts in the website directory.
License requests, renewals and trial support: support@scottywins.com

VERSION 1.5.0
Update server address is hidden under Advanced update settings. Staff can check
and download updates from the normal Updates screen. Licensing HTTP requests
reject redirects. Support contact: support@scottywins.com.
Purchase preview: https://scottywins.com/downloads/publisher-to-pdf/purchase.php
Introductory one-PC prices: $4.99/month, $19.99/year, $29.99 lifetime;
15-PC office lifetime: $149. Checkout is not connected to Stripe yet.
Manual expiring licenses begin on first activation. Future Stripe subscriptions
follow paid billing periods beginning at purchase and renew automatically.
Perpetual Microsoft Publisher installations can continue working after retirement;
Microsoft support ends. Microsoft 365 Publisher access ends after October 1, 2026.
REVIEW FIXES IN 1.5.0
Saved PDFs survive trial-report network failures. The app records the run summary,
pauses further exports and reconciles the durable report before the next trial run.
Known failed/skipped files do not consume the allowance; unknown crash results may.
Duplicate trial results never consume additional slots. Publisher ~$ lock files
are excluded. A concurrently created output counts as skipped. A corrupt saved
key reports an error instead of silently enabling trial mode. Open Finished Folder
accepts folders only. Version forms such as 1.5.0 and 1.5.0.0 compare equally.
Ownership markers allow cleanup of abandoned exports without deleting active ones.
Legacy temporary files without ownership markers need manual inspection/cleanup.

Update manifests are signed with a private key kept off the web server. The app
embeds its public key and permits only HTTPS Scottywins download URLs, with no
redirects. This protects app updates against website-only compromise. The website
and earlier app versions do not verify this signature. Obtain this initial build
from a trusted source. The EXE is still unsigned (no Authenticode certificate).

SERVER AND PAYMENT LIMITS
The backend retains early subscription state and retries ordering gaps. Full
refunds/disputes revoke access and queue cancellation of recurring billing; failed
cancellations are retried via webhook redelivery. Partial refunds do not change
access; winning a dispute requires administrator review, not automatic restoration.
Checkout requests are throttled by IP. Paid amount/currency/product mismatches
fail closed and require support reconciliation; taxes/coupons are not supported.
Private admin tools can recover an order's key and release an individual PC seat.
Verify customer identity before returning any key. No automatic email is sent.

The backend still shares the hosting account with WordPress. Moving licensing
and Stripe secrets to an isolated service remains recommended before live payments.
Client-side trial enforcement is not tamper-proof against modified clients or
changed machine IDs. Publisher hangs/dialogs do not have an automatic watchdog.

VERIFICATION
Windows self-tests, real Publisher COM export with unchanged-source check, signed
manifest tamper/checksum tests and update-popup tests passed. Isolated PHP 8.4
license, trial, commerce and event-order/cancellation tests passed. Real Stripe
sandbox checkout/webhooks and live HTTPS trial interruption remain unverified.


OFFICE TO PDF MODE (1.6.0)
Choose Publisher, Word, Excel and PowerPoint checkboxes on the Convert tab.
Supported inputs: .pub, .doc/.docx, .xls/.xlsx and .ppt/.pptx. Other extensions,
including macro-enabled .docm/.xlsm/.pptm, are excluded. Publisher ~$ lock files
and Office ~$ lock files are excluded. Each type requires its matching installed,
activated desktop Office application; Office web apps are not sufficient.

All formats use the existing safe batching, disk reserve, progress, cancellation,
trial and license controls. A single license covers these conversion features.
The three-file trial is shared across formats, not three files for each type.
Unavailable applications cause failures for their affected files; other formats
continue. Publisher is only required when converting Publisher inputs.

When several file types are selected, output retains the input extension:
Report.docx -> Report.docx.pdf; Report.xlsx -> Report.xlsx.pdf.
This prevents matching basenames in different Office formats from colliding.
When just one type is selected, Report.docx -> Report.pdf, as before. Keep the
same type selections when resuming so the output paths remain consistent.
Flattened same-type duplicate names are still rejected before conversion.

Word opens read-only and exports PDF. Excel opens read-only without updating
workbook links and exports visible sheets using their existing print settings
and print areas. PowerPoint opens read-only and writes slides to a separate PDF.
VBA automation macros are disabled before input is opened; legacy Excel XLM
security prompts and other Office security policies can still require attention.
Use trusted files. No source Save/SaveAs is performed; PowerPoint's PDF SaveAs
writes only the temporary PDF. All originals are closed without saving changes.

Close PowerPoint before converting .ppt/.pptx files. The converter refuses these
files if PowerPoint is already running, to protect any open presentations from
PowerPoint's shared application instance. Office prompts or hangs can still delay
safe cancellation; there is no force-kill watchdog. Encrypted/protected documents
may prompt or fail and should be handled manually. Formatting depends on installed
fonts, linked resources, and existing page/print settings. Inspect office examples
before widespread rollout. PDF merge/split, images and compression are not included.

Verification: actual Publisher, Word, Excel and PowerPoint fixture exports passed
with SHA-256 checks showing originals unchanged. Mixed discovery, naming, lock-file
exclusion, trial/resume/cancellation, update signing and notification tests passed.


RENAMED IN 1.6.1
The app is now Scottywins Office to PDF. Run Portable\ScottywinsOfficeToPDF.exe.
Existing license keys, activations, trial counts, settings and logs carry over.
The existing download and update addresses remain compatible with earlier apps.


VERSION 1.6.2
The four file-type selections are saved immediately for the current Windows user.
First launch defaults to all four types. If all are unchecked, conversion asks you
to select at least one. Invalid/unreadable saved preferences fall back to all four.

EXE-ONLY UPDATES
Version 1.6.2 and later prefer a separately signed executable download when offered.
Save it to Downloads, close the app, then copy it over the old ScottywinsOfficeToPDF.exe.
No ZIP extraction is required. Licenses, selections and settings remain in your user
profile. Starting in 1.6.3, accept Install update after the verified EXE download. The app
prepares an updater, closes, replaces its executable, and restarts automatically.
The full ZIP with source remains available, and earlier builds still receive that ZIP.



VERSION 1.6.3 - INSTALL AND RESTART
EXE updates can now install after you confirm Install update. Downloads remain
signed and checksum-verified. Conversion must be stopped before installation.
Keep the installed filename ScottywinsOfficeToPDF.exe. The updater verifies the
running program's path, stages the new EXE in the same folder, waits for exit,
backs up the previous EXE, replaces it and relaunches. It never force-kills the app.
If installation permissions fail, the current app remains open; manual replacement
is available. License and format preferences remain in the Windows user profile.
Builds older than 1.6.3 need this update installed manually once. Later updates
can use this restart flow. Isolated process replacement/relaunch smoke test passed.


EMPLOYEE FOLDER LIST (1.7.10)
1. Click Folder list on Convert.
2. Add folder selects an individual employee's source. Its output defaults to a
   PDFs subfolder. Edit either path in the table, or double-click a cell to browse.
3. Add employee folders selects a shared parent such as U:\Employees. It adds
   immediate child directories only: Jane -> Jane\PDFs, Mike -> Mike\PDFs, etc.
4. Save list. Use folder list is enabled automatically. Choose Office types and
   conversion options, then click Convert to PDF. Uncheck Use folder list to use
   the original single-folder fields. Your folder list and mode are saved per user.

Mapped drive paths and UNC paths such as \\server\share\Employees\Jane are accepted.
The Windows user running the app must have read access to every source and write
access to each output. Mapped drives must exist for that user. No elevation or
server Office installation is required: conversion runs on the licensed Windows
PC with the matching desktop Office programs. Folder rows do not consume license
seats; only conversion PCs do. Trial allowance remains shared across all rows.

Include subfolders and Preserve folder structure apply to every row. Counters,
batch pauses, disk reserve and cancellation cover the combined queue. Logs record
routing and files found per row. Processing follows row order, one file at a time.
Unavailable/inaccessible source folders stop planning before any exports. Fix
access and rerun. Output write failures are logged per file; other jobs continue.
The source scan excludes a nested destination folder. Original Office files are
opened read-only and never changed. A PDFs folder is created only when needed.

Repeated/overlapping sources, overlapping output folders and output inside another
employee's source are refused. Paths are compared ignoring case; mapped-drive/UNC
aliases pointing to the same physical share cannot be identified automatically.
Use consistent paths throughout the list. Keep the same folder list and file-type
selections when resuming. Skip existing PDFs handles PDFs still at their output
paths. Outputs moved away will be regenerated on a later run.

Folder-list routing, persistence, output exclusion, collision prevention, resume,
cancellation and unchanged originals passed isolated tests. Actual Publisher,
Word, Excel and PowerPoint exports and update notification tests passed. Client
server shares and their permissions still need a small representative test on site.

1.7.10: New employee rows default to Converted to PDF inside the employee source folder. This folder is created during conversion. Existing saved output paths are retained. Fixed cross-employee output ancestor validation, recursive scanning with ancestor outputs, and isolated output/free-space failures. Updater and licensing review follow-ups remain pending; checkout is disabled.

Review & Finish (1.7.10): Convert files with this version first. Open Review & Finish, open each PDF, inspect all pages and layout, and tick Verified for checked files. Finish moves PDFs beside the original Office file using a normal .pdf name. It refuses duplicate names, existing PDFs, or changed originals/PDFs. Originals are retained by default. To permanently remove originals, check the deletion option and type DELETE exactly in the warning. Files are not sent to the Recycle Bin. Only newly recorded successful conversions are eligible; skipped files from older versions are not eligible. Records persist locally for later review. Review logs are saved with conversion logs. This feature has regression tests with disposable fixtures; live employee network shares have not been tested.

1.7.10: Bold permanent deletion warning, red DELETE text and confirmation button, automatic dialog sizing prevents clipped text and buttons. Review and finish automatically removes emptied Converted to PDF folders and emptied nested folders along the finished PDF path. Nonempty folders, custom output roots and reparse points are retained. Cleanup never recursively deletes files.

1.7.10: Custom Scottywins SW/document icon embedded in the executable and app windows for Windows taskbar, title bars and Explorer. Includes 16,24,32,48,64,128,256 pixel icon sizes.

1.7.10: Approved shiny glass Scottywins SW/document icon embedded in the executable and app windows.

1.7.10: Review & Finish includes Select all verified files. Check it only after inspecting all PDFs; it ticks the Verified boxes without enabling deletion. Clear it to deselect all. Mixed selections display a partial check.

1.7.10: Glossy glass buttons with hover, pressed, keyboard focus and disabled states. Glass tabs, cyan borders, dark tinted input fields and a reflective progress bar.

1.7.10: Disabled conversion-option checkboxes retain readable labels and clear white checkmarks. Current-file status includes processed counts and whether batch pauses are enabled. Continue batch remains disabled until an actual batch or disk-space pause.

1.7.10: Excluded folders skips the selected folder and all descendants for all selected file types, including employee queue jobs. List survives restart. Mapped-drive exclusions resolve to their UNC share when the mapping is available. Reconnect mapped drives before converting. Logs name exclusions and inaccessible folders; inaccessible folders are skipped so other folders continue.

New feature: Show failed files displays failed paths and reasons from current and previous saved logs. Refresh the list during a run; copy the failed list for support.
