Skip to content

Release 2026.41.0: integrate ten PRs (#510, #513, #525, #526, #528, #529, #530, #531, #532, #533) - #534

Merged
DutchSailor merged 28 commits into
mainfrom
integratie/release-2026.41.0
Oct 6, 2026
Merged

DutchSailor merged 28 commits into
mainfrom
integratie/release-2026.41.0

Conversation

@DutchSailor

Copy link
Copy Markdown
Collaborator

Release 2026.41.0: integrates ten PRs that touch the same files, plus the version bump.

PR What
#510 PDF exports, vector snippets (shared source per document), PDF.js 6, PDFium 8076 (by @oscar981-op, updated with main)
#513 Assistant skill: structural overview per storey (no longer saves or exports on its own)
#525 Larger "PDF" label on the file icon (#495)
#526 A snippet or vector print of an empty page no longer fails
#528 Dimension lines from other editors keep their look
#529 Rotated and typewriter text boxes from other editors keep their shape
#530 Caret and Replace annotations in load, save and drawing (#508, part 1)
#531 Printers without PowerShell, so endpoint protection no longer kills the app (#524)
#532 One wheel notch stops within about 0.2 s in every view (#522)
#533 Underline, strikeout and highlights on rotated pages run along the text (#527)

Merge this PR with "Create a merge commit" (not squash). The head commits of the ten PRs then land on main unchanged and GitHub closes them as merged.

Commits of the integration itself

Conflicts resolved

Verification on the merged tree

  • npm run test:unit 2958 passed, 0 failed, 4 skipped; npx vite build, npm run typecheck, cargo build and cargo test --no-run green.
  • Windows: app is killed at startup by endpoint protection (Sophos) because it spawns PowerShell to query printers #524, live: a process monitor (snapshot every ~10 ms from app start for 25 s, children and grandchildren). Control run on the 2026.39.2 code: it caught 2× powershell.exe and reg.exe. This build: no powershell, reg, cmd or wmic, only the PDFium workers, WebView2 and conhost. The printer list through MCP returns the 7 printers with the default and the file printers recognised.
  • Save round trip with the full verification set: identical to release 2026.39.2 (33 good, the two known cases).
  • Release gate scripts: text rotation, save duplicates, continuous view, fast zoom, search (54 checks) and rotation sweep (46/46) good. Placement under the cursor failed once at zoom 2 (129 pt) while the machine was heavily loaded and passed twice in a row afterwards on the same build (0.00 pt at zoom 1/2/3.52); it never failed on the individual branches. Worth keeping an eye on.
  • Comparison sweep against an independent renderer: see the comment below.
  • A drawing whose annotations were made in another editor (rotated labels, dimension lines, typewriter title block) now matches the file's own appearance.

Manual checks before release

  • [Feature]: faster stop on scroll #522: the wheel feel in the real window (synthetic wheel input does not reproduce native behaviour): one notch on a heavy drawing, fast spinning then stopping, page flips at the edge, the same feel in every view, precision touchpad, Shift+wheel, Ctrl+wheel. One notch in single-page mode now moves 100 px instead of about 207 px.
  • macOS: the notarisation of the 2026.39.x builds failed on an expired Apple developer agreement; it has to be accepted before the macOS assets can be built.

Known follow-ups (not in this release)

🤖 Generated with Claude Code

oscar981-op and others added 28 commits September 30, 2026 16:35
…saves

- Load the legacy PDF.js build (app and worker) so older macOS and Linux
  WebViews get polyfills for the new Map/Promise APIs PDF.js 6 relies on
- Run CI on Node 22; PDF.js 6 no longer supports Node 20
- Fall back to in-process rendering unless the PDFium worker itself died
- Close released PDFium documents off the UI thread
- Atomic save: retry the replace on Windows and write in place when another
  program keeps the file open; keep the given path when it cannot be resolved
- Do not ask the signature question twice when a save was already running
- Normalise line endings in the export test so it passes on Windows
- Remove the session log from docs/

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… rectangles

- Update PDFium to chromium/8076 (Windows x64/ARM64, Linux, macOS) and
  pdfium-render to 0.9.4; pins, checksums and READMEs follow
- Replace the removed PageViewport.convertToViewportRectangle, which made
  every PDF with annotations fail to load under PDF.js 6
- Grant the temp folder to the fs scope before writing a snippet source, so
  a reopened vector snippet renders instead of showing an empty frame

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A new assistant skill, "Constructieoverzicht": one structural plan per
storey on snippets of the architect's floor plans, with marking, legend
and a short explanation.

It records the conventions that differ from an architectural plan: the
storey below is the underlay at 20 % halftone, its load-bearing walls are
dashed piers without lintels, flat roofs at floor level belong on that
floor's plan, the roof plan shows only the pitched roof, span arrows sit
on one line, and columns in glazed fronts stand on the mullions.

It uses existing MCP commands only. A seam test checks that every
command, ribbon button and line style it names exists in the app.
Redraw the file-type icon with a much larger red label and bold letters,
so "PDF" is readable in Explorer at every size. Each size from 16 to
256 px is drawn natively (hand-placed letters at 16 px, no downscaling),
keeping the page, folded corner, top bar and text lines.
scripts/genereer-bestandsicoon.py generates the PNGs and the .ico.
Bring the PR up to date with release 2026.39.2.

- vector-embed.js: keep the shared source Form per document and add the
  transparency group for translucent snippets (#512) on the per-cut
  wrapper; an opaque and a translucent cut of the same box no longer
  share a wrapper.
- vector-embed.test.mjs: both test sets, plus a test for that combination.
- annotation-converter.js: both import sets.
- package.json: test lists merged, version from main; package-lock.json
  from this branch with the version from main.
…rts on its own

The instruction told the assistant to save with app_save_pdf, which
overwrites the opened template sheet, and to press the Raster-PDF button
itself, which opens a save dialog from the bridge and reports success
before anything is written. The assistant now leaves saving to the user
and offers the raster PDF instead; the test enforces both.
A page that pdf-lib created itself (new document, inserted blank page)
has no /Contents. pdf-lib throws on embedding such a page only when the
document is saved, so a vector snippet cut from it made every later save
of the document fail, and printing a document with such a page failed
in vector mode. Give the page an empty content stream before embedding;
the image does not change.
Dimension lines (/Line /IT /LineDimension) from other programs were
read into the app's own measure style and lost most of their
properties; saving then wrote that style back, so other viewers showed
the changed version too. Now taken over, and kept over load and save
through OPS keys:
- line width 1 when neither /BS nor /Border is given (also plain lines
  and arrows);
- hollow closed arrowheads when there is no /IC, at the size the file
  uses;
- leader lines from /LL, /LLE and /LLO, without the app's own overshoot;
- the caption inside the line (/CP /Inline, also the default for /Cap
  without /CP), with font size and colour from /RC;
- short dimensions with the arrowheads outside the leader lines;
- near-vertical dimensions read from bottom to top.
Files saved by Open PDF Studio itself and floor-plan measures load and
save as before.
…ep their shape

- A text box turned by 90 degrees on a page with /Rotate 90 or 270 got
  its width and height swapped, because its size was worked out from
  the box in PDF coordinates while its angle is a screen angle. The
  size now comes from the box as it is displayed.
- Typewriter text (/IT /FreeTextTypewriter, also spelled
  FreeTextTypeWriter) never wraps, but it was wrapped like an ordinary
  text box and grew over the next field. It now breaks only at hard
  line breaks. Saving writes /IT back and widens the box to the text
  as other viewers measure it, for any alignment.
Text boxes saved by Open PDF Studio itself load and save as before.
…awing (#508, part 1)

Text-edit corrections are written and read in the documented PDF structure:
- Insert: a /Caret annotation (blue).
- Delete: a /StrikeOut with /IT /StrikeOutTextEdit (red).
- Replace: a /Caret parent with a /StrikeOut child, linked by /IRT and
  /RT /Group (purple). The loader accepts both parent/child directions.
All of them get appearance streams with quads in reading direction on
every page rotation, so other viewers draw them as the app does.
Struck-out text is kept in OPS_MarkedText, never in /Contents.

In the app a caret is drawn, selected, moved, copied and deleted like
other markups. A Replace pair moves, deletes and undoes as one group,
locked halves are respected, and copies get fresh links and no
duplicate /NM. Existing highlights, underlines, strikeouts and replies
keep loading and saving exactly as before. Labels are added in every
locale.

The keyboard-driven proofreading mode follows in a separate change.
…/release-2026.39.3

# Conflicts:
#	open-pdf-studio/js/pdf/vector-embed.js
#	open-pdf-studio/js/pdf/vector-embed.test.mjs
…/release-2026.39.3

# Conflicts:
#	open-pdf-studio/package.json
…2026.39.3

# Conflicts:
#	open-pdf-studio/package.json
…ease-2026.39.3

# Conflicts:
#	open-pdf-studio/js/pdf/loader/annotation-converter.js
#	open-pdf-studio/js/pdf/saver.js
#	open-pdf-studio/package.json
…26.39.3

# Conflicts:
#	open-pdf-studio/js/pdf/saver.js
#	open-pdf-studio/package.json
…and line

With all new tests of this release the "test:unit" script grew past the
8191 characters that cmd.exe accepts, and npm run test:unit stopped with
"The command line is too long" on Windows (CI runs it on windows-latest
too). The list now lives in scripts/unit-testlijst.txt, one path per
line, and scripts/draai-unit-tests.mjs passes it to node --test without
a shell, in batches if it ever grows past the process limit. One path
per line also stops branches that each add a test from conflicting on
a single line. A test keeps "test:unit" pointing at the script and
checks that every listed file exists.
The tests of the dimension line, text box and Caret changes were written
against PDF.js 5 and the previous save path. With PDF.js 6 and the
atomic save from the export changes they now use loadingTask.destroy(),
the viewportRectangle helper, a pdf.js document on the test document and
capture writeBinaryFileAtomic. No application code changes.
…on no longer kills the app (#524)

At every start the app spawned powershell.exe to ask for the printers
(Get-Printer, Get-CimInstance Win32_Printer), and 3 s later reg.exe to
check whether it is the default PDF app. Endpoint protection treats
"document app starts PowerShell" as an exploit chain and terminated the
app within a second, so it was unusable on managed PCs.
- get_printers, is_virtual_printer_installed and
  virtual_printer_catch_enabled read the spooler directly with
  EnumPrintersW and GetDefaultPrinterW, on a worker thread. get_printers
  returns the same JSON, with the status mapped to the Win32_Printer
  codes.
- The default-app check reads the registry with RegGetValueW instead of
  reg.exe. It now also recognises the app by its own program path, which
  the old comparison never matched.
Installing and removing the virtual printer still use PowerShell, but
only when the user clicks them. macOS and Linux are unchanged.
The single-page view scrolled with a velocity that decayed per frame,
so the run-out depended on the frame rate: on a heavy drawing at about
20 frames per second one notch kept moving for over 2 seconds and went
about twice as far as the notch. The other views left wheel scrolling to
the browser. A shared helper (js/pdf/wiel-scroll.js) now gives every
view the same behaviour: a mouse-wheel notch moves exactly its distance
with a short time-based ease-out (180 ms), quick notches add up without
lag or overshoot, a notch back reverses at once (also at the scroll
edge), and touchpad scrolling stays 1:1 without added smoothing. Page
flipping at the page edge, Ctrl+wheel zoom and smooth jumps to a page or
search result are unchanged.
…long the text (#527)

Text markups (Highlight, Underline, StrikeOut, Squiggly) were saved with
quads axis-aligned in user space in a fixed order and without an
appearance stream, so on pages with /Rotate 90 or 270 other viewers drew
underline and strike lines across the text.
- Quads are written in reading direction as the page is displayed, with
  an appearance stream along the text (multiply blend for highlights)
  and /OPS_TextDir, reusing the geometry of the Caret work (#508).
- Markups made on vertical or upside-down text take their reading
  direction from the selected text.
- Untouched markups from other programs keep their quads; files saved by
  older versions are repaired on /Rotate 90 and 270. On /Rotate 180 the
  old order cannot be told apart from upside-down text and stays as it
  was.
- The line width of underline, strikeout and squiggly is kept
  (/OPS_LineWidth), and a replacement strike's appearance uses the
  caret's colour.
…tie/release-2026.39.3

# Conflicts:
#	open-pdf-studio/package.json
…lease-2026.39.3

# Conflicts:
#	open-pdf-studio/js/pdf/renderer.js
#	open-pdf-studio/package.json
…26.39.3

# Conflicts:
#	open-pdf-studio/js/pdf/saver/bestaande-markeringen.test.mjs
#	open-pdf-studio/package.json
@DutchSailor

Copy link
Copy Markdown
Collaborator Author

Comparison sweep against an independent renderer (MuPDF page renders vs. app screenshots at fit-page, both test folders, 46 files) on the merged tree:

  • No page has missing content (miss=0 everywhere, except one non-reproducible blank page, see below).
  • Flagged pages, compared with release 2026.39.2:
File 2026.39.2 this PR
-CP-21 Constructieoverzicht p1 p1
2196-CB-21 p1 p1
HY-103-1 p1 p1
MV-03 p1 p1
Technische tekening (both folders) p3 p3, p4
Zware vector PDF (folder 1) p8, p15, p19 p8, p15, p19
Zware vector PDF (folder 2) p15, p19 p8, p15, p19

All flags are "extra ink": at fit-page zoom the app draws thin lines heavier than the reference.

  • Technische tekening p4 is the only new flag. It comes from the PDFium update in Improve PDF exports, vector snippets and PDF.js 6 compatibility #510: at small zoom, thin lines are anti-aliased about one pixel wider (9.8 % → 12.1 % ink, extra cells 8 → 11, threshold 10). Same content, nothing missing. Every branch run that contains Improve PDF exports, vector snippets and PDF.js 6 compatibility #510 shows the same numbers.

  • Zware vector PDF p8 is not new. This PR gives exactly the same numbers as 2026.39.2 in folder 1 (extra 10, 15.01 % ink). On 2026.39.2 the folder-2 pass of that page happened to come out lower.

  • Two one-off events, not reproduced. Worth keeping an eye on:

    • Halfway through the second folder the test instance closed without a crash report or event log entry. A rerun of that folder with an exit watcher ran to the end without a problem.
    • On that rerun, page 5 of Zware vector PDF stayed blank for the full 40 s wait. On this build the same page rendered on the four other passes, with identical numbers (three of them back to back on a warm instance), and it never stayed blank on any earlier run.

@DutchSailor
DutchSailor merged commit c845939 into main Oct 6, 2026
4 checks passed
@DutchSailor
DutchSailor deleted the integratie/release-2026.41.0 branch October 6, 2026 06:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants