Analyser/Docs
Documentation menu

Documents

PDF, paginated document rendering, DjVu scans, Office formats (modern OOXML and legacy binary), OpenDocument, iWork, e-books, notebooks, Access databases, and Markdown. Source: pdf.js, paged.js, djvu.js, docx.js, xlsx.js, xlsb.js, pptx.js, odf.js, legacy-office.js, textdoc.js, iwork.js, epub.js, mobi.js, mdb.js, notebook.js, markdown.js.

On this page

PDF viewer#

What it does. The most feature-complete document viewer on the site: metadata, forensic document-structure analysis, full text extraction, page-thumbnail previews with a full-page lightbox, embedded raster image extraction, and OCR - all via the vendored pdf.js.

How to reach it. Drop any .pdf. Built in web/assets/js/renderers/pdf.js. A PDF past 64 MB is handed to pdf.js piece by piece, each range read from the file as a page needs it, rather than loaded whole - so a very large scan opens and only the pages you look at are read. The revision and trailing-data checks scan the file in pieces too.

How to use it.

  • Info card: application/name/size/page count, Title/Author/Creator/ Producer, creation/modification dates, PDF spec version, page 1 dimensions (points, inches, mm), plus a timestamp-anomaly check (future dates, modified-before-created, vs. the file's own last-modified time).
  • Document structure & security card (shown only when something is found): revision count (each save appends a %%EOF marker - more than one means incremental edits are preserved inside the file), linearisation ("fast web view"), trailing data after the final %%EOF (⚠ a polyglot/tamper tell), outline/table of contents (expandable), embedded file attachments, embedded JavaScript with a heuristic risk scan (flags network/file-access/launch/obfuscation/crypto patterns per script, and separately flags auto-run triggers like "Document open" as the riskiest kind), encryption/permissions (allowed vs. restricted actions: print/copy/modify), Keywords/Subject/PDF-A conformance from XMP, and a fonts list (embedded vs. not-embedded, a portability/authenticity tell).
  • Text content: extracted per page with reconstructed line breaks; Copy per page; Show next 3 pages/Show all reveal more. If a page has no embedded text (image-only/scanned), a note points at OCR instead.
  • Page previews: thumbnails for the first 4 pages (Show next 3 pages/Show all for the rest). Click a thumbnail to open a full-page lightbox with Prev/Next, Zoom (double-click/double-tap, or the toolbar button), and High-res (re-renders the current page at higher resolution for sharper zoom, at a memory/speed cost) - plus a selectable text layer overlaid on the canvas. Per-thumbnail hover actions (always visible on touch): Analyse (renders the page to an image and sends it through the full photo pipeline), OCR (Tesseract on that one page, shown in a popup overlay), PNG (downloads the page as an image).
  • One long page: View as one long page (under the thumbnails) opens every page stacked in a single scrolling column, with the current page shown at the bottom. Pages are drawn as they scroll into view and dropped again once well past, so a long document stays light. Save as PNG writes the whole column as ONE tall image at 150, 300 (default) or 600 dpi; narrower pages are centred on white, and the PNG records its dpi so it opens at its real printed size. The image is streamed band by band rather than drawn on one canvas, so its length is not bound by browser canvas limits; a resolution whose image would be too big for the device (by total pixels, set per memory tier in limits.js) is greyed out, with the would-be size in its tooltip. While it saves, the button reads Cancel. Needs CompressionStream (current Chrome, Firefox and Safari).
  • Embedded images: click Extract embedded images to pull the original raster images (logos, photos, scans) out of the PDF's content streams - distinct from the rendered page previews. Each found image gets a download link and an Analyse button (up to 300 images).
  • OCR - Scan pages as images (collapsible): click Scan all pages to run Tesseract across every page (language picker first), with a progress bar; Show more/Show all reveal more pages of the transcript.

Per-page text controls:

The full-page lightbox toolbar:

The one-long-page view's toolbar:

Per-thumbnail hover actions, plus the embedded-image and OCR entry points:

Notes / limits. pdf.js is lazy-loaded. OCR and per-page rendering are CPU-heavy for large documents; the UI stages results in batches so nothing blocks on a full-document scan by default.

3D PDFs#

What it does. A "3D PDF" carries a 3D model alongside its pages, which Adobe Acrobat shows as an interactive view; any other viewer, pdf.js included, shows only a flat poster picture in its place. Analyser finds the model and draws it in the same 3D viewer as STL and STEP files: orbit, zoom, the view cube, colours from the file, and a picker for the assembly's parts (parts that share a name, such as a set of bolts, are grouped as one chip).

How to reach it. Drop a 3D PDF. A 3D model card appears under the page previews; nothing appears for an ordinary PDF. Built in web/assets/js/renderers/pdf3d.js, with PRC decoding by nanoPRC (AGPL-3.0), compiled to WebAssembly and lazy-loaded (about 600 KB).

How to use it.

  • The card lists the format, size, parts, triangle count and whether the colours came from the file, then the model below it.
  • Views in the file. The camera positions the PDF stores by name - the list Acrobat shows under Views, such as Front, Top, or a teacher's own "meridional plane" - appear as buttons under the 3D view. A button turns the model to that camera, with its projection, and frames it whole. A view that carries a cross-section is marked (section): the half of the model facing the camera is cut away along the stored plane, so the view looks into the model. Reset view puts the model back whole.
  • Download model saves the embedded model as it is (.prc or .u3d), to open in a CAD or 3D tool. Save as STL writes the decoded triangles as a binary STL (colours are not kept: STL has no place for them).
  • Earlier versions. When a 3D PDF is saved again (Acrobat adding a cross-section, for example), the new model is added to the end of the file and the old one stays inside. The card shows the one the PDF actually displays, and All 3D models in this file lists every one with its status - shown, replaced by a later save, or no longer shown - and a View button for each.

Notes / limits. PRC is drawn from the triangles stored in the file, which is how Acrobat's own 3D export writes it. A PRC model holding only exact (B-rep) surfaces with no stored triangles is reported but not drawn, and section curves and wireframe lines are not drawn. A saved view keeps its direction, its up and its projection, but the model is framed whole rather than at the stored zoom; the view's background, lighting, render mode and part visibility are not applied, a cross-section's outline and plane are not drawn, and only the first cross-section of a view is used. U3D models are found and offered as a download, but not drawn yet. Encrypted PDFs are not read. The file is only searched for a model when one of its first 20 pages has a 3D annotation, so an ordinary PDF costs no extra read. PDFs past a size set per memory tier in limits.js are not searched for a model, and a very large model stops at a per-tier triangle limit (the card says so). In /compare the 3D card shows the model's format and size, without decoding or drawing it.

Shared page-preview presentation (Word/ODF/spreadsheet/presentation text)#

What it does. Formats that have no real page geometry of their own (Word/ODF flowing text, spreadsheets, presentations) get the same "page sheet" experience as PDF: paginateFlow() lays flowing content onto A4-proportioned sheets (breaking to a new sheet when one fills, never splitting a block mid-page), and pagedPreviewCard() builds the thumbnail grid + lightbox reader.

How to reach it. Not used directly - it's the shared rendering substrate for docx.js, odf.js, legacy-office.js, and textdoc.js (callers with genuine natural pages, like one-slide-per-page presentations, build their own page nodes and skip straight to pagedPreviewCard). Built in paged.js.

How to use it. Same controls as PDF's thumbnail/lightbox pattern: Show next N pages/Show all, per-page Copy, and Copy all text.

Page preview placeholder#

What it does. Every paged format shows empty page-shaped tiles where its previews will land, from the moment the file is recognised until the real sheets exist. Getting to a first page is slow in a way that isn't obvious - a DOCX has to be unzipped, its XML parsed, its images decoded and its flow laid out; a PDF needs a pdf.js render pass per page - and until this the other cards appeared first, so the analysis looked finished and then had everything shoved down when a tall previews card arrived on top.

How to reach it. Automatic, on PDF, DOCX, ODT/ODS/ODP, legacy DOC/XLS/PPT, RTF/FB2/MHTML and the other textdoc.js types, PPTX slides, and CBZ/CBR comic pages.

How it works. pagePreviewSkeleton() in paged.js builds the stand-in card - the real title, a status line, and ghost tiles sized from the same thumbWidth() the real thumbnails use, so the swap moves nothing. Renderers keep the returned node and .replaceWith() the real card onto it. Grids whose tiles fill in one at a time (PPTX slides, comic pages) instead pre-place one .anr-ghost-sheet per page and replace them individually. The tiles are surface-coloured rather than paper-white, with a slow accent sweep, so they read as pending rather than as blank pages.

DjVu scanned documents#

What it does. Decodes and renders DjVu pages (a scanned-document format common for archived books/journals) to canvas, with prev/next paging.

How to reach it. Drop a .djvu/.djv. Built in djvu.js around the vendored pure-JS DjVu.js.

How to use it. ‹ Prev/Next › page through the document; the pager is disabled while a page is rendering (decoding a scanned page can take a moment).

Notes / limits. On memory-constrained (mobile) devices, files over 200MB are rejected with a message to try a desktop browser instead - the whole document is decoded page-by-page in a WASM heap, which can crash a phone tab.

DOCX (Word)#

What it does. Reads Office Open XML Word documents and renders a simplified document view: metadata, formatted text (via the shared page-preview presentation), tables, and text extraction.

How to reach it. Drop a .docx/.docm/.dotx/.dotm. Built in docx.js.

How to use it. Click any embedded inline image to send it through the full photo analyser.

XLSX (Excel, OOXML)#

What it does. Reads Office Open XML spreadsheets and renders each worksheet as a table with sheet tabs and document metadata.

How to reach it. Drop a .xlsx/.xlsm/.xltx/.xltm. Built in xlsx.js.

How to use it. Click a sheet tab to switch worksheets. Each sheet lazily mounts the full tablekit.js table/chart workbench (sort/filter/ search/hide/reorder columns, a chart builder, PNG/JSON/CSV export) - see data-archive.md.

XLSB (Excel Binary Workbook)#

What it does. .xlsb stores a workbook in the binary BIFF12 record format rather than XLSX's XML, so the in-house OOXML reader can't open it - this uses the vendored SheetJS community build purely to decode it into sheets, rendered with the same table UI as .xlsx.

How to reach it. Drop a .xlsb. Built in xlsb.js.

How to use it. Same sheet-tab switching and tablekit.js mounting as XLSX. Metadata additionally flags ⚠ Contains macros (VBA project) when present.

PPTX (PowerPoint)#

What it does. Reads Office Open XML presentations and renders each slide as a card with its title/body text and any embedded images, in presentation order.

How to reach it. Drop a .pptx/.pptm/.ppsx/.ppsm/.potx/.potm. Built in pptx.js.

How to use it. Click a slide thumbnail to open it full-size in a lightbox (× to close); click an embedded image inside a slide to analyse it as a photo.

ODF (OpenDocument: ODT/ODS/ODP)#

What it does. OpenDocument files are ZIP packages whose payload is content.xml (plus meta.xml and a Pictures/ folder). This converts that XML into the same shared page-preview presentation as DOCX/XLSX/PPTX, so ODT reads like the DOCX viewer, ODS like the XLSX viewer, and ODP like the PPTX viewer.

How to reach it. Drop a .odt/.ott/.fodt/.sxw (text), .ods/ .ots/.fods/.sxc (spreadsheet), .odp/.otp/.fodp/.sxi (presentation), or .odg/.otg/.fodg/.sxd (graphics). Built in odf.js.

How to use it. Text documents get paged.js's pagination controls; spreadsheets mount the tablekit.js workbench.

Legacy binary Office (DOC/XLS/PPT, 97-2003)#

What it does. The pre-2007 Office formats are OLE2/Compound File containers, not ZIP+XML - there's no clean styled layout to recover the way DOCX/ODT give, so this is deliberately best-effort: it pulls the readable content out and shows it through the same page-sheet preview as the other document viewers. .doc reads Word text via the FIB piece table (CLX/PlcPcd), paginated as pages.

How to reach it. Drop a .doc, .xls, or .ppt. Built in legacy-office.js.

How to use it. Same pagination controls as the other paged-document viewers; a plain hyperlink list surfaces embedded/external links the legacy document referenced.

Text and lightweight-markup documents#

What it does. A family of formats whose content is really just text or simple XML/HTML, each shown as readable prose or selectable source: markup source (DITA, TEI, JATS, reStructuredText, AsciiDoc, Org, Textile, TeX/LaTeX, BibTeX), RTF (control words stripped to readable prose), AbiWord (.abw, XML), FictionBook (.fb2, XML e-book), HWPX, MHTML, and Safari .webarchive saved pages.

A .webarchive is a binary property list: the page itself, the images, scripts and stylesheets it had loaded, and one nested archive per embedded frame. Every frame's HTML is rendered in order, main page first, because web apps such as Word Online and webmail keep the readable text inside a frame while the main page is an empty script shell. Like MHTML, the markup goes through the shared sanitiser, so scripts, styles and remote images are left out. The readout names the address the page was saved from and counts the frames and stored resources, and the images stored in the archive appear in a Saved images grid, read from the file rather than fetched.

How to reach it. Drop any of the above extensions. Built in textdoc.js, reusing paged.js's pagination controls (Show next N pages/ Show all, Copy all text, per-page Copy).

Apple iWork (Pages / Numbers / Keynote)#

What it does. Modern iWork files (2013+) store content as Snappy-compressed, undocumented Protocol Buffer streams in Index/*.iwa - there's no practical way to re-render that in the browser. Instead, Analyser shows the QuickLook preview Apple bakes into the package: an embedded Preview.pdf (rendered page-by-page via the PDF viewer) or, failing that, the largest preview/thumbnail image. Files saved without a preview fall back to a metadata-only readout.

How to reach it. Drop a .pages/.numbers/.key/.keynote. Built in iwork.js.

How to use it. If a Preview.pdf exists, it's shown via the full PDF viewer (inheriting all its controls). Otherwise, if a thumbnail image exists, click Analyse this image to send it through the photo pipeline.

Notes / limits. .key collides with PEM cryptographic key files (not a ZIP); if the dropped .key isn't actually a ZIP package, it's handed to proprietary.js's identifier instead so a real private key still gets read. Format detected as "iWork 2013+ (IWA)" vs. "iWork '09 (XML)" based on package contents.

EPUB reader#

What it does. Reads zipped XHTML e-books: metadata, cover, and chapter-by-chapter reading with navigation.

How to reach it. Drop a .epub. Built in epub.js.

How to use it. ← Prev/Next → page through chapters; the chapter select dropdown jumps directly to any chapter.

Kindle / Mobipocket e-books (MOBI/AZW/AZW3)#

What it does. Decodes MOBI 6 and KF8 (AZW3, and combo .mobi) e-books fully in the browser via the vendored foliate-js: metadata and cover, then a section-by-section reader with each section decoded to a self-contained HTML blob shown in a sandboxed (scriptless) iframe with images resolved.

How to reach it. Drop a .mobi/.azw/.azw3. Built in mobi.js.

How to use it. ‹ Prev/Next › step through sections; the pager is disabled while a section loads (KF8's HUFF/CDIC decompression can be slow).

Microsoft Access databases (MDB/ACCDB)#

What it does. Opens a Jet/ACE database fully in the browser via the vendored mdb-reader: lists user tables with their columns and row counts, and shows a sample of rows from each - the same table UI as the spreadsheet viewers.

How to reach it. Drop a .mdb/.accdb. Built in mdb.js.

How to use it. Click a table tab to switch tables; rows are capped at 200 shown per table (a note states the true count when truncated).

Jupyter notebooks#

What it does. Renders an .ipynb the way a reader sees it: narrative markdown cells, code cells with their In[n] prompt, and captured outputs (stream text, execute results, rich display data including PNG/JPEG images decoded from base64 data URIs, and errors).

How to reach it. Drop a .ipynb. Built in notebook.js.

How to use it. Show more cells/Show all reveal more of a long notebook.

Markdown#

What it does. Renders .md/.markdown as formatted HTML alongside document stats and the raw source, using a self-contained CommonMark-ish + GitHub-Flavoured-Markdown parser (no dependency): headings (ATX + setext), bold/italic/strikethrough, inline and fenced code, links, images, blockquotes, nested ordered/unordered lists, task lists, GFM tables, and horizontal rules.

How to reach it. Drop a .md/.markdown file. Built in markdown.js.

Notes / limits. All text is HTML-escaped and raw inline HTML is rendered as literal text - the renderer never executes embedded HTML/script content, for safety when previewing an untrusted Markdown file.