ASH PDF Studio
A free, open-source (MIT) PDF viewer and editor for Windows, published by
ASH Technical & Project Management Services (ASH PMCS).
Download the latest version (installer or portable .exe, no admin rights needed) ·
Download page on ashdesignsuite.com ·
User guide
Features
- Viewer: fast rendering (Mozilla pdf.js), tabs, zoom, thumbnails, bookmarks, layers panel (show/hide drawing layers), light theme by default with an optional dark theme.
- Search: find in the document, plus Advanced search across all open documents or every PDF in a folder (with subfolders and an optional saved index): exact phrase / all words / any words, whole word, case, proximity, stemming, regular expressions, patterns (email, phone, date, URL, amount), comments and bookmarks; results grouped by file, CSV export.
- Annotate: shapes, lines and arrows, freehand, area highlight, text boxes, callouts, whiteout, sticky notes, text highlight / underline / strikeout. Annotations are saved as real PDF annotations, so they stay editable here and in other PDF apps, and annotations made in other apps open as editable objects. Flatten annotations into the page when you want them fixed.
- Comments panel: every annotation by page with author, date, replies and status (Accepted, Rejected, Cancelled, Completed); filters and CSV export.
- Stamps: 20 standard stamps, dynamic stamps (name, date and time filled in), your own text and image stamps; Apply stamp fixes a placed stamp into the page content like a rubber stamp (Undo reverses it until you close the file).
- Signatures: a signature library (draw, type with handwriting fonts, import an image with background removal, paste), initials, saved signature images encrypted with your Windows account (an optional password adds a second lock; a portable folder copied to another PC or Windows user cannot open them, so re-create them there), place on many pages at once, signature blocks with name and date, Apply signature to fix a placed signature (or block) into the page content like a wet signature (no longer movable or editable, here or in other viewers once saved; Undo reverses it until you close the file; whiteout under it is applied with it, other items under it only after you confirm; Preferences > Annotations > Ask before applying a signature brings the confirmation back). Signatures placed before this version carry no library marker and cannot be applied: re-place them from the library. These are visual signatures, not digital certificates.
- Create: new blank PDF (A4, A3, A5, Letter, Legal or custom size, portrait or landscape), from images, or from Word / Excel files.
- Pages: rotate, reorder, delete, insert, duplicate, extract, crop, resize, reverse, interleave two scans, merge and split.
- Header & footer, page numbers, watermark, background, Bates numbering: add, replace and remove later.
- Forms: fill AcroForm fields and save.
- Print: page ranges, odd/even, fit or actual size, copies, with or without annotations.
- More: snapshot of an area (copy or save as PNG), word count, document properties, export pages as images, warning before overwriting a digitally signed PDF.
Install or run portable
Each release has two files (x64):
| File | What it does |
|---|
ASH-PDF-Studio-Setup-<version>.exe | Installer for the current user (no admin rights). Lets you choose the folder, adds Start-menu and desktop shortcuts, and registers the app in the "Open with" list for .pdf. It does not make itself the default PDF app; choose that yourself in Settings > Apps > Default apps. Uninstall from Settings > Apps. |
ASH-PDF-Studio-Portable-<version>.exe | No installation. Run it from any folder or USB stick. Settings are stored in an ASH-PDF-Studio-data folder next to the .exe; nothing else is left on the PC. |
SHA256SUMS.txt lists the checksums: Get-FileHash .\ASH-PDF-Studio-Setup-0.1.0.exe in PowerShell must match.
Unsigned executables. The .exe files are not code-signed yet (see Code signing policy).
Windows SmartScreen will show "Windows protected your PC" on first run: click More info > Run anyway
only if you downloaded the file from this project's GitHub Releases page and the checksum matches.
System requirements: Windows 10 or 11, 64-bit (x64), about 400 MB of disk space.
Build from source
Requires Node.js 22 and npm.
npm ci
npm run vendor # copy pdf.js / pdf-lib / fontkit into renderer/vendor
npm start # run the app (dev mode: menu bar visible, F12 = devtools)
npm test # unit tests (node --test test/)
npm run smoke:browser # renderer smoke test in Chromium via playwright-core
npm run licenses # regenerate THIRD-PARTY-NOTICES.md; fails on a disallowed licence
npm run dist # Windows installer + portable exe into dist/ (run on Windows)
build/icon.png is the ASH brand icon (512x512); electron-builder derives the Windows .ico from it.
How releases are built
.github/workflows/build.yml runs on every push to main, on tags v* and on demand. On
windows-latest it runs npm ci, the licence check, the tests, vendor and dist, writes
SHA256SUMS.txt and uploads the two .exe files and the checksums as workflow artifacts. For a tag
vX.Y.Z it also creates a GitHub Release with those three files (gh release create --generate-notes).
To release: set version in package.json, commit, then git tag v0.1.0 && git push --tags.
A second job (smoke, Ubuntu) runs npm ci, vendor and the unit tests.
After a release, node scripts/winget-manifest.mjs <version> SHA256SUMS.txt writes the Windows Package Manager
manifests to winget/manifests/; winget/README.md explains how to test and submit them.
Project layout
| Path | Contents |
|---|
electron/main.js | Main process (window, file access, IPC). ES module. |
electron/preload.js | Exposes window.api (CommonJS: sandboxed preloads cannot be ES modules). |
renderer/ | The UI: index.html, app.js, styles.css, shim.js, generated vendor/. |
src/core/ | PDF operations library (see docs/CORE-API.md). |
scripts/ | vendor.js, licenses.js, smoke-browser.mjs. |
build/ | Icon and NSIS installer hooks (installer.nsh). |
Renderer contract
Page and modules
The renderer is served from app://pdfstudio/renderer/index.html (a privileged custom scheme, not
file://), so it has a normal origin. index.html sets a strict Content-Security-Policy (no inline or
remote scripts, no eval) and an import map:
| Specifier | File |
|---|
pdf-lib | ./vendor/pdf-lib.esm.min.js |
@pdf-lib/fontkit | ./vendor/fontkit.esm.js (default export) |
pdfjs-dist | ./vendor/pdf.min.mjs (pdf.js legacy build) |
pdfjs-worker | ./vendor/pdf.worker.min.mjs |
app.js imports the core library as ../src/core/pdfOps.js; its bare pdf-lib imports resolve
through the same import map. The import map is inline, so its SHA-256 hash is part of the CSP:
if you change the map, update the hash (the browser smoke test fails and prints the new one).
Open documents with pdf.js like this:
import * as pdfjs from 'pdfjs-dist';
pdfjs.GlobalWorkerOptions.workerSrc = new URL('./vendor/pdf.worker.min.mjs', location.href).href;
const v = new URL('./vendor/pdfjs/', location.href).href;
const pdf = await pdfjs.getDocument({
data: bytes, cMapUrl: v + 'cmaps/', cMapPacked: true, standardFontDataUrl: v + 'standard_fonts/',
wasmUrl: v + 'wasm/', iccUrl: v + 'iccs/', isEvalSupported: false, enableScripting: false,
}).promise;
window.api
Provided by electron/preload.js in the app and by renderer/shim.js in a plain browser (tests).
All methods return Promises except onOpenFile. A file object is { path, name, bytes: Uint8Array, stamp? }.
| Member | Result | Notes |
|---|
isElectron | true / false | false when the browser shim is active. |
version() | string | App version. |
openFiles({ filters?, multiple? }) | file[] (empty if cancelled) | filters: [{ name, extensions: ['pdf'] }]; default PDF only. |
readFile(path, { withStamp? }) | Uint8Array, or { bytes, stamp } with withStamp | Only paths already returned by openFiles, saveFile, launch or open-file events. stamp ({ mtimeNs, size }, null in the browser) is what the file held; openFiles files, launch/open-file events and saveFile / writeFile results carry it too. |
saveFile({ defaultPath?, filters?, bytes }) | { path, stamp } or null if cancelled | Shows Save As, writes atomically (temp file + rename). Browser: downloads. |
writeFile(path, bytes, { expect?, force? }) | { path, stamp }, or { ok: false, changedOnDisk: true, path } | Save in place; same path rule as readFile. With expect (the stamp the tab last read or wrote) a file changed on disk since is not written unless force; no expect: no check. |
imageExportBegin({ baseName, pageCount, pages, format }) / imageExportWrite(jobId, index, bytes) / imageExportEnd(jobId) | { jobId, folder, count } or null / { name } / boolean | Multi-page image export (src/core/imgexport.js): begin rejects any other key, shows the folder picker in main and asks once before replacing existing files; files are <base>-p001.png, max 2000 per job, each a PNG/JPEG Uint8Array up to 50 MB; end (or cancel) closes the job. Browser: downloads. |
getLaunchFiles() | |
Restrictions the UI must respect: new windows and navigation are blocked (web links open in the system browser
through openExternal: links in a PDF after the user confirms the address, help links directly), and every permission request is denied, including
navigator.clipboard; use copyText / readText / copyImage / readImage instead.
Help
The user guide is built into the app: press F1 or use Help ▸ User guide (search, guided tours, and "Show me" links that
point at the real buttons). The same guide is published on https://ashdesignsuite.com. Its sources are in help/
(npm run help:build, npm run help:shots).
Limitations
- Editing the existing text of a page (Edit text, D) works one line at a time; text inside form objects cannot be edited.
- Office conversions (File > Export to Word document, Create PDF from Office file) drive the Microsoft Office installed on the PC through PowerShell COM automation, so they work only on Windows with Office (the built-in engines cover .docx and .xlsx without Office); Word's PDF Reflow keeps text and simple layouts best. A run is stopped after 5 minutes (10 for Word export).
- Text recognition (Tools ▸ Recognize text) is English only.
- No digital-signature validation or certificate signing yet; signed PDFs open, signatures are not verified, and saving changes invalidates them (the app warns before overwriting).
- Encrypted PDFs: password-protected files can be viewed after entering the password; editing and saving encrypted files is limited.
- PDF JavaScript is not run, and XFA forms are not supported.
- Windows x64 only for now.
Code signing policy
Releases are not code-signed yet (see the install notes above), so Windows SmartScreen warns on first run;
check the SHA-256 against SHA256SUMS.txt before running a download. We plan to sign releases once the project
qualifies for free open-source signing or a publisher certificate is in place; this section will then name the
certificate. The rules below apply from the first signed release.
- What gets signed: only the installer and portable files built by this repository's GitHub Actions workflow
(
.github/workflows/build.yml) from the tagged source. Nothing built elsewhere is signed.
- Team roles: committers and reviewers: the repository owner, abbas437
(Ahmad Abbas, ASH PMCS); code changes are prepared with an AI coding assistant working in this repository
and every change is tested by the CI build. Approver for each signed release: Ahmad Abbas.
- Privacy: ASH PDF Studio makes no network connections of its own: no telemetry, no update check, no account.
Your files stay on your computer. The only connections are web links you click (help pages, project pages),
which open in your default browser.
Licence
MIT — see LICENSE. Bundled third-party components keep their own licences (pdf.js is
Apache-2.0, pdf-lib and fontkit MIT; the OCR engine tesseract.js, its Tesseract/Leptonica wasm core and the
English traineddata are Apache-2.0, with the image libraries compiled into that wasm under their own permissive
licences; Electron and Chromium notices ship with the app); the full list is
in THIRD-PARTY-NOTICES.md, and docs/COPYRIGHT-REVIEW.md
records the copyright and trademark review. "PDF" is used only as the name of the ISO 32000 file format;
this project is not affiliated with Adobe.
The ASH logo and icon are trademarks of ASH Technical & Project Management Services and are not covered by the MIT licence of this repository. You may not use them for other products.