v4.3.0 — 4 August 2026
Multi-column documents read in the right order, lists and tables of contents keep their shape, plain-text web addresses become real links, and every run leaves a downloadable report behind.
A screen reader can only read a document as well as the document is built. This release rebuilds the parts that were missing: the order pages are read in, real lists, working links, and a table of contents you can navigate.
Added
- Multi-column pages read in the right order. CampusMind now works out reading order from the shape of the page, so a two-column layout is read down one column and then the other, and a banner or header that spans the full width is read where it belongs. Before this, everything was read straight down the page, which interleaved the columns — the single biggest reason a multi-column document made no sense to a screen reader. (WCAG 1.3.2 Meaningful Sequence)
- Reading order is yours to change. Every element shows its place in the reading order in the Tag & Caption Editor, and if you move something, your order is what gets written into the file when you run it again. The document's title and author work the same way — edit them once, and the next run keeps them.
- Web and email addresses become real links. A URL, a
www.address, or an email address typed as plain text is turned into a link you can actually click, tagged so a screen reader announces it as a link and describes where it goes. Links are found before tagging starts, so each one is read in its proper place in the sentence rather than at the end of the page. - Bulleted and numbered content is tagged as a list. Lists used to arrive as a run of separate paragraphs. They now come back as genuine lists, so assistive technology can announce "list of six items" and let someone skip past it. Numbered section headings such as "1 Introduction" and "1.1 Scope" are deliberately left alone — in testing, letting them be swallowed into lists took a document from 138 correctly tagged headings down to about 25.
- Headings are judged on meaning, not just font size. A new step reads the surrounding context to confirm a heading is really a heading and to work out its level. It also demotes the things that merely look like headings — list items, captions, running page headers, exercise text. If the service is unavailable, the run carries on using the previous size-based method rather than stopping.
- Tables of contents keep their shape. Contents entries are tagged as a table of contents and nested to match their indentation, so the hierarchy of the document survives. It recognizes "Contents" along with "List of Figures", "List of Tables", and "List of Illustrations", follows a contents list that runs across several pages, and joins an entry that wraps onto a second line back into one entry. Each entry is read out before its page number, which is the order that makes sense out loud.
- Footnotes are tagged as footnotes. They are marked with the
<Note>structure rather than left as ordinary text, so they are announced as footnotes and can be skipped. - Every run leaves a report behind. Each remediation produces a downloadable report covering how the run went, how long it took, the settings used, which document it was, and the full processing log — including the error if something went wrong. Re-running keeps the earlier reports rather than replacing them, and a run that fails still produces one, so a document that crashed is no longer a dead end.
Changed
- The document title is now a real H1. It used to depend on a mapping that some PDF viewers, Adobe Acrobat included, do not follow — so the title did not show up as a heading. Section headings now start at H2 to match.
- Heading levels no longer skip. A jump from H2 straight to H4 is detected and corrected, and levels are written into the file directly so a later step cannot overwrite them.
- Table headers say which cells they head. Header cells are now genuine
<TH>cells carrying row or column scope instead of an undifferentiated grid, which clears the "table header cell has no associated subcells" finding validators used to report. - Every document declares a language. Where the language cannot be worked out — usually a scan with no readable text — the document is set to English rather than left blank. (WCAG 3.1.1)
- Small images are treated as decoration. Anything under 100 pixels on either side — bullets, icons, hairline rules — is no longer captioned or tagged as a figure. Those are decorative, and describing them added noise for a reader and cost for you.
- Anything outside the reading order is marked as decoration, and form fields that had no accessible name are given one.
- The hybrid engine handles tables and contents lists. Hybrid mode now sends table detection and cell structure to PaddleX, which returns real cell-level structure, and it picks up tables of contents too. See choosing an engine.
- Captions and footnotes are recognized for what they are. Figure captions, table captions and footnotes are identified by role rather than tagged as generic text, and a block of mathematics is recognized as a formula instead of being detected twice.
- PaddleX no longer gets a second pass at headings. The font-size heading fallback now runs only for Document Intelligence and hybrid. PaddleX already classifies headings itself, and running both promoted ordinary body text into headings.
- Stricter detection by default. The default PaddleX thresholds for layout, headings, tables and images move to 0.5, replacing a single 0.25 default. Expect fewer invented headings, tables and figures. You can still move any of them per run — see raising and lowering a threshold.
- PDFix SDK upgraded from 9.0.0 to 9.1.1.
Fixed
- Phantom figures are gone. The tagging engine sometimes invented figures with no content behind them, which showed up with alt text reading literally "Figure 1000000". These are now removed — unless the figure has genuine tagged content inside it, in which case it is kept rather than risk losing real structure.
- Overlapping tables and images no longer break a page. Content sitting mostly inside a detected table is resolved the same way every time, which fixes tables rendering differently from page to page and a crash when a table and an image overlapped.
- The tagged and untagged marks in the editor are accurate. That status was a geometric guess and often said "untagged" about content that was tagged. It now comes from the document's actual structure, and a new field shows which tag owns each element's content, so a legitimate difference is visible instead of silently wrong.
- Documents that arrive already tagged keep their tags. Existing tags were only read back from the first branch of the structure, so genuine tagging elsewhere in the document was ignored. Every branch is now read.
- Re-running a scanned document works. Running again with your edits used to go back to the original scan instead of the text-recognized version, producing a file with no text in it. The right version is now used.
- Re-running with your edits no longer fails. Two separate faults on that path each caused the run to stop outright. Both are fixed.
- The editor matches the finished file. Headings, titles, lists, alt text, reading order and contents depth shown in the editor now agree with the document Acrobat opens — so a re-run reproduces what you saved.
- Documents with inline mathematics pass validation. Tagging text with mathematical symbols mixed into it could produce a fault that made PAC give up on the file entirely. This is now repaired, cautiously: only empty sequences are corrected automatically, and anything else is flagged for you to look at rather than changed on your behalf.
- Cleaner processing logs. A formatting error in the status-update messages is corrected.
Also in this release: platform changes beyond PDF accessibility. See the full changelog.
Releases
Accessibility changes in each CampusMind release, newest first. One page per release.
v4.2.0 — 31 July 2026
Canvas files remediated and written back without leaving CampusMind, a hybrid extraction engine, configurable PaddleX detection thresholds, advanced batch filters, and a batch cap raised to 100 files.