Repository navigation
Release 2026.41.0: integrate ten PRs (#510, #513, #525, #526, #528, #529, #530, #531, #532, #533) - #534
Conversation
…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
|
Comparison sweep against an independent renderer (MuPDF page renders vs. app screenshots at fit-page, both test folders, 46 files) on the merged tree:
All flags are "extra ink": at fit-page zoom the app draws thin lines heavier than the reference.
|
Release 2026.41.0: integrates ten PRs that touch the same files, plus the version bump.
Merge this PR with "Create a merge commit" (not squash). The head commits of the ten PRs then land on
mainunchanged and GitHub closes them as merged.Commits of the integration itself
test: run the unit test list from a file, so it fits the Windows command line: with all new tests thetest:unitscript grew past the 8191 characters that cmd.exe accepts, sonpm run test:unitfailed on Windows (CI runs it on windows-latest too). The list moved toopen-pdf-studio/scripts/unit-testlijst.txt(one path per line) andscripts/draai-unit-tests.mjsruns it without a shell. From now on, new tests go into that file, not into package.json. One path per line also ends the recurring merge conflicts on the singletest:unitline. A test keepstest:unitpointing at the script and checks that every listed file exists.test: adapt the merged tests to PDF.js 6 and the atomic save: tests of fix(annotations): dimension lines from other editors keep their look #528, fix(textbox): rotated and typewriter text boxes from other editors keep their shape #529 and feat(annotations): Caret and Replace annotations in load, save and drawing (#508, part 1) #530 were written against PDF.js 5 and the old save path (loadingTask.destroy(), theviewportRectanglehelper, a pdf.js document on the test document, capturingwriteBinaryFileAtomic). No application code changes.chore: version to 2026.41.0.Conflicts resolved
js/pdf/vector-embed.js(Improve PDF exports, vector snippets and PDF.js 6 compatibility #510 and fix(save): a snippet or vector print of an empty page no longer fails #526): Improve PDF exports, vector snippets and PDF.js 6 compatibility #510's shared source Form, with fix(save): a snippet or vector print of an empty page no longer fails #526's guard for pages without/Contentsapplied when the source page is loaded.js/pdf/saver.js(fix(annotations): dimension lines from other editors keep their look #528, fix(textbox): rotated and typewriter text boxes from other editors keep their shape #529, feat(annotations): Caret and Replace annotations in load, save and drawing (#508, part 1) #530): feat(annotations): Caret and Replace annotations in load, save and drawing (#508, part 1) #530 moved the rotation mapper tosaver/rotatie-mapper.jsand fix(annotations): dimension lines from other editors keep their look #528 movedattachVectorAPtosaver/vector-ap.js; each conflict block was the other side's copy of a function that had been moved, verified identical to the module before removal; fix(textbox): rotated and typewriter text boxes from other editors keep their shape #529's newtypemachineVoorOpslagis kept.js/pdf/loader/annotation-converter.js,js/pdf/renderer.js: import lines only, both sides kept.js/pdf/saver/bestaande-markeringen.test.mjs(Underline and strikeout on rotated pages show as a short cross mark in other viewers #527 rewrote it): Underline and strikeout on rotated pages show as a short cross mark in other viewers #527's version with the PDF.js 6 helper.package.jsonand the test list: union of all test files (two live probes of Improve PDF exports, vector snippets and PDF.js 6 compatibility #510,mcp-liveandmcp-real-pdf, stay out on purpose; they need a running app).Verification on the merged tree
npm run test:unit2958 passed, 0 failed, 4 skipped;npx vite build,npm run typecheck,cargo buildandcargo test --no-rungreen.powershell.exeandreg.exe. This build: nopowershell,reg,cmdorwmic, only the PDFium workers, WebView2 and conhost. The printer list through MCP returns the 7 printers with the default and the file printers recognised.Manual checks before release
Known follow-ups (not in this release)
🤖 Generated with Claude Code