Irfan PDF

Release notes

A summary per version, taken from the project changelog. Its own rule applies here too: dates are the day a change was verified on a working installation, and every entry was tested — not just written.

VersionDateHeadline
1.7.0 final build2026-10-11Rebuilt after full review: new icon and palette, 12 security findings closed
1.7.02026-10-05Print, cached previews, navigation state, real icon and launcher
1.6.02026-10-04PDF to Excel, image tools, target-size compression, local assistant, multi-user
1.5.02026-10-04Form editing and OCR fidelity — the page must not change
1.4.02026-10-04Full-text search across the library
1.3.02026-10-03Document comparison and batch processing with a working Stop
1.2.02026-10-0316 new security, finishing and page tools
1.1.02026-10-03Health check, logging, installer, portable package, product renamed
1.0.0“earlier” — no date recordedEnglish OCR, desktop shell, first 13 tools

1.7.0 final build — 2026-10-11

  • Rebuilt after a full review; the suite re-run before and after, totals unmoved: 39 suites / 1,101 checks / 0 failures.
  • New icon — red tile (#FF0000 → #CC0000), white IP monogram, folded page corner — drawn by one script into both IrfanPDF.ico and the favicon; the same geometry went into the sidebar logo.
  • Interface colours tuned for contrast: brand red #CC0000 (5.88:1 where pure red fails at 4.0:1), black primary buttons, dark-mode links at #FF6B6B.
  • Eight security findings fixed: DNS-rebinding Host check, UNC export targets refused, editor save no longer reads arbitrary paths, autosave ids validated, activity-log 401, first administrator from this computer, no raw exception text to the client, plus nosniff/SAMEORIGIN/no-referrer headers.
  • Four more: PBKDF2-HMAC-SHA256 raised to 600,000 iterations, sign-in rate limited (5 failures / 5 min → 429), cross-site writes refused (foreign Origin 403, text/plain 415), and a 512 MB request ceiling.
  • An earlier claim corrected: the runtime does not carry two copies of OpenCV — overhead measured at 0.6 MB — and the “100 MB wasted” finding is retracted.

1.7.0 — 2026-10-05

  • Folder open cost: previews cached on disk (keyed on size + mtime), small JPEGs, two renders at once, lazy loading, 120-row paging — ~78 s of CPU → 0.08 s.
  • Back keeps your place: central state store and navigation history, Back button and Alt+Left; folder, selection, tool options and editor page/zoom survive.
  • A real IrfanPDF.ico (three places referenced one that never existed) and a real IrfanPDF.exe launcher — single-instance, icon embedded, findable in Windows Search.
  • Print: page ranges (1,3,5, 3-5, odd, even, first, last), N-up 2/4/6/8/9, a 200-DPI print view at true paper size, Windows hand-over that never claims a sheet printed.
  • Deleted documents forget every cascaded output in the text index; the dead Health-check Start Menu shortcut was repaired (its script had never been installed).
  • Editor zoom became three real modes (Whole page / Fill width / Actual size); results gained Show in folder, Open output folder and retry of just a batch’s failures.

1.6.0 — 2026-10-04

  • PDF to Excel: .xlsx written from scratch, validated structurally and opened in real Excel — 21000 reads back as a number, C2 + C3 computes to 24500.
  • Image to Text (OCR → editable text → .txt) and Extract Images (embedded objects, each re-opened and checked against its declared pixel dimensions).
  • Compress to a size you name — up to 7 validated passes, an already-small file copied byte for byte, an honest warning when the target cannot be reached safely; plus the Image Compressor and an Image Quality Enhancer that states it is not an AI upscaler.
  • PDF AI Assistant: local text analysis quoting your document verbatim — no API key, no URL, no network call, enforced by a test.
  • Optional multi-user: sign-in starts off; an administrator can add people and limit which tools each may use, with salted PBKDF2 hashes and a uniform error message.
  • _IPDF output naming, and validate_pdf() run before any tool reports success.

1.5.0 — 2026-10-04

  • Editing a form no longer eats the form: redaction constants read by name, cover boxes fitted to the ink they hide, and a silently dropped save payload kept — each gated by a test.
  • OCR view fidelity: words placed one by one at their own box, size and colour; table words written back in reading order instead of being dropped.
  • The freshness gate now compares letters for wording and digits for numeric content, so re-segmenting a table cell cannot look like lost data.
  • Status line: 23 suites / 476 checks, overall PASS, plus the 20-check self-test from a portable package in a folder with a space in its path (PASS 20 FAIL 0).

1.4.0 — 2026-10-04

  • Search that reads your documents: names + text, AND matching, a snippet and an IN TEXT badge; one click switches between names-only, text-only and both.
  • A scan becomes searchable the moment it is made editable — a test finds a picture-only PDF absent and its OCR’d copy present.
  • The index rebuilds on upload, after OCR and after an edited save; deleting forgets the words; Repair clears stale entries; per-file text capped at 400,000 characters.
  • Fixes: routes swallowed by a wildcard answered 404, Repair reported failure while doing the right thing, and the status counted non-PDF files as missing.
  • Health check grew to 20 checks; _test_text_search added with 38 checks.

1.3.0 — 2026-10-03

  • Compare documents: one self-contained HTML report with a word-level text diff and a page-by-page pixel comparison, both measured from the files, working offline as a single file.
  • Batch processing of up to 200 documents with per-file outcomes and a CSV report; one damaged or password-protected file fails alone while the rest save.
  • A Stop that works: a batch stops between documents, a stopped job reports cancelled, never done, and the results already finished are kept.
  • Fixes found while testing: the Stop button never sent its request, a stopped job left a dead screen, a cancelled batch lost its results.

1.2.0 — 2026-10-03

  • 16 new tools: Protect with password (real AES-256), Remove password, permanent Redact, Watermark, page numbers, Extract text, Document details, Flatten, Greyscale, Repair, and six page tools (duplicate, insert, reorder, crop, resize, remove blank).
  • Password-protected PDFs became usable: a LOCKED badge explains the blank preview, other features refuse them with a message naming the fix, Remove password produces a working copy.
  • Fixes: text page ranges were off by one, blank detection could delete a sparse real page, inserting at the front did nothing, an all-blank document crashed, invalid filenames broke uploads.
  • Status line: 18 suites / 323 checks plus a 19-check self-test; the desktop window’s Save dialog — the one thing no script can check — was verified by hand.

1.1.0 — 2026-10-03

  • Downloads in the desktop window were silently cancelled — fixed (WebView2 downloads enabled), verified by hand.
  • Fixes: PDF to Word crashed on every multi-page scan, table cells fused into one line, a registry read error could orphan every file on disk, two suites could never fail.
  • Health check / self-test added (Run full test, Quick test, Repair, Export diagnostic report), plus rotating logging to data\logs\irfan-pdf.log (5 × 2 MB) where nothing logs document content.
  • The portable package and the first Windows installer arrived: shortcuts, .pdf association, Open with verb, uninstall entry, no admin rights.
  • Renamed to Irfan PDF; paths derive from the application folder (never a user profile), with IRFAN_PDF_HOME to relocate data.
  • Known limitations published: encrypted PDFs refused (opening with a password is not implemented), no single-file EXE, some table regions not yet editable, no AI features.

1.0.0 — earlier (no date recorded)

  • OCR with the official English PP-OCRv5 model, keeping inter-word spacing.
  • Orientation auto-fix for sideways and upside-down scans.
  • Per-word background covers (no grey boxes), font-size caps, single-shade editor rendering.
  • Save / Save As with overwrite protection; 13 PDF/OCR tools; the desktop shell.
  • A 14-suite regression run.

No release date for 1.0.0

The changelog says only “1.0.0 - earlier”. The verification report lists the missing release date as information that does not exist in the project files — so no date is invented here.

After the last release: the regression gate

The full gate (py -3.12 tests\run_regression.py) was run on 2026-10-17 against the source tree, with the application started on 127.0.0.1:8765 exactly as the runner starts it. After the Stop fix described below, the re-run returned 43 of 43 suites passing — including test_e2e (37/37), test_document_integrity (52/52), test_package (52/52), test_batch_compare (46/46) and _test_deskew (16/16).

What this gate caught on 2026-10-17 — recorded, not hidden

The first run of the gate that day was 42 of 43: test_batch_compare finished at 43 of 46 checks, all three failures being one scenario — a 4-page OCR job submitted and cancelled 0.2 s later.

  • What the application did: accepted the stop — ok: true, “Stopping after the current step” — and then ran the OCR to completion anyway and wrote its result file. A single-document job ignored the stop.
  • Why it looked like a timing flake: the same suite passed 46/46 on 2026-10-14 with “cancelled after 99%”, on the same machine and the same code. The outcome tracked how fast the OCR finished relative to the test’s 0.2 s window.
  • Why that was not accepted as “just timing”: a stop the application acknowledges and then ignores is a defect, not a test artifact — on a slow machine the user would wait for a cancelled-looking job to finish anyway.

The fix, its measurements and the re-run are in the next note. After the fix the same command returned 43 / 43 suites PASS with 0 failures, test_batch_compare among them at 46/46.

Fixed after 1.7.0 — Stop now reaches a running job (source, 2026-10-17)

While documenting the failure above, the cause was fixed in the application source rather than left as a footnote. Two changes, both verified against a running app:

  • Stop is honoured between OCR pages. scanned_pdf_to_editable() now polls a stop flag at every page boundary and raises the job worker’s own JobCancelled, and the single-file OCR handler passes it. A stopped multi-page OCR ends as cancelled with no result file — measured at 95% progress on a 12-page document.
  • The Analyst’s Stop was silently dead. Its handler passed the job’s cancelled property where the analyser polls a callable (callable(should_cancel) and should_cancel()), so a long analysis could never be stopped. A callable is passed now, which restores what that screen already offers.
  • The gate check itself was made honest: its cancel fixture was a 4-page OCR that could finish inside the 0.2 s cancel window, so it was testing timing rather than behaviour. It now uses a 12-page document; the three assertions are unchanged and pass (46/46).

Where the fix can be got: all three packages were rebuilt on 2026-10-22 and carry it — the installer was re-run into a clean folder and self-tested (PASS 20 / FAIL 0), and a stop issued mid-document on a 12-page scan ended the job as cancelled with no output file (measured at 5% on the installed copy and on the extracted Professional package; the earlier 2026-10-17 builds measured the same behaviour at 12% and 95%). The entry is also recorded in the project’s CHANGELOG.md under the entry dated 2026-10-17.

Auto-deskew, stated precisely

Automatic deskew of tilted scans at upload (0.30–5.00°, flat-scan-only guards) is part of the application code that ships in the package — server\core\ocr\text_layer.py, with its suite tests\_test_deskew.py beside it. That suite was added to the gate on 2026-10-16 and passes 16/16 on every run since — and the packages on disk were rebuilt on 2026-10-22 from this same source, then installed and self-tested. What is verified: the feature exists in the installed build and is regression-tested. What is not claimed: that any package carries a later date than it actually does.

The shipped test report — generated with the release — records 40 suites and 1,093 declared checks on 2026-10-05 (40/40, PASS). The full changelog ships inside every package at Documentation\CHANGELOG.md, and the test suite ships at tests\ so the numbers can be reproduced rather than trusted.

Next: Installation · Download · FAQ