Library / SDK
MuiseDestiny/zotero-figure avatar
MuiseDestiny/zotero-figure

Zotero Figure: pulling figures, tables and formulas out of your PDFs

PDF图、表、公式一网打尽——Zotero插件。

573 stars22 forksTypeScriptAGPL-3.0

At a glance

What is it?
Zotero Figure is a Zotero plugin that detects figures, tables, display formulae, captions and table footnotes in PDFs, with layout detection running locally on a bundled model. The one feature that leaves the machine is optional formula OCR, and everything else stays in your library.
Who is it for?
Adopt Zotero Figure if you read papers with figures and formulae and want them as assets in your Zotero library rather than as screenshots, and you are comfortable with a plugin that models are downloaded for and a licence that requires you to share modifications. Do not adopt it if you need batch figure extraction from hundreds of PDFs at speed, because the analysis is local and CPU or GPU bound, and do not deploy it in a setting where a SiliconFlow API key is not allowed.
Can I use it commercially?
Yes, with strict conditions. AGPL-3.0 is a network copyleft licence: if people use a modified version over a network, for example as a hosted service, you must offer them its source code under the same licence.
Is it still maintained?
Yes. The repository last received commits 34 days ago.
What is it written in?
Mainly TypeScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 22, 2026, and from our analysis. They are not legal advice.

Editorial analysis

Detection runs locally, with the model bundled in

Zotero Figure detects PDF figures, tables, display formulae, captions, and table footnotes, and the key architectural point is in the next sentence: PDF reading, rendering, and layout detection run locally with the model bundled in the plugin.

That is a real design choice in a plugin ecosystem where sending pages to a server is often the easy path. The feature list says it plainly: analyze PDFs locally without uploading pages or downloading a model at runtime. The model ships inside the plugin, and the layout detection that finds candidate regions runs on your machine.

The privacy section confirms the scope. PDF parsing, rendering, layout detection, and local result storage stay on your computer. Local results do not use Zotero Sync unless you enable annotation mirroring.

The one exception is optional and clearly marked. Formula OCR is optional. API-key checking sends a text-only request to SiliconFlow, and formula recognition sends formula PNG crops, never full PDF pages. The key is stored in local Zotero preferences, and SiliconFlow usage may incur charges. The README is careful about the distinction between a text-only request and a crop, which is the detail that makes the feature defensible.

The project is written in TypeScript, licensed AGPL-3.0-or-later, and the default branch is bootstrap. The last push was on 2026-09-18, with v1.0.3 released the same day.

Installing is an XPI through the Zotero plugin manager

The requirements are narrow. You need Zotero 9 or Zotero 10, the Zotero Figure XPI from the latest release, and, if you only want formula OCR, network access and a SiliconFlow API key. The README also states that Java and pdffigures2.jar are not required, which is worth noting because the figure extraction literature has traditionally leaned on those.

The installation is three steps. Download zotero-figure.xpi from the latest release, then in Zotero open Tools, then Plugins, choose Install Plugin From File, and select the XPI. Then restart Zotero if requested.

That is a XPI install rather than a build, so there is no toolchain involved. The package manifest shows how the plugin identifies itself to Zotero, and the config block is where the addon metadata lives:

json
    "addonName": "PDF Figure",
    "addonID": "[email protected]",
    "addonRef": "zoterofigure",
    "addonInstance": "ZoteroFigure",
    "prefsPrefix": "extensions.zotero.zoterofigure",

The preferences prefix is what makes the plugin's settings appear in Zotero's own preferences pane, and the update URL and update link are how the plugin checks for and fetches a new XPI. The main entry point is src/index.ts, and the build scripts are Node based, with a production build, a development build, a build check and a server start for development.

The version history shows the plugin is finding its footing. Release 1.0.1 is titled as compatible with Zotero 10, 1.0.2 followed in September 2026, and 1.0.3 came on 2026-09-18.

Four entry points, one of them a library across documents

The plugin reaches you in four ways, and the Entry Points section in the README is the map.

In the PDF Reader, you open a PDF, select the Zotero Figure icon in the left sidebar, and choose Analyze figures, tables, and formulae. That is the per-document path.

The Figure Library, opened from Tools, is the cross-document view. You browse results across documents, and you can double-click a card to open its source PDF. The features list describes it in detail: filters by document, year, category, type and caption, and two view modes, a remembered waterfall view and a document-column view. In the document-column view, results stay in stable page order across aligned and optionally named comparison rows.

That comparison arrangement is the most elaborate part of the plugin. You can drag document headers to reorder columns, and cards within a document to rearrange rows, or right-click an image to add it to a comparison group. When one document contributes several images to a group, its cell shows a primary image with thumbnails on the left, and selecting a thumbnail makes it primary. You dissolve a group to remove its comparison row, and a toolbar scale control resizes all the previews.

Batch processing is the third entry point. You select library items or PDF attachments, right-click, and open PDF Figure to analyze them, add results to notes, or create annotations. Selecting image annotations and choosing Add to Figure imports them in bulk.

The preferences pane is the fourth, and it manages the bundled model, annotation synchronisation, and SiliconFlow formula OCR, and opens the Figure Library directly. It also has a Convert existing formulae action that recognises uncached formulae across libraries.

Results become Zotero notes, annotations, and images you can correct

The per-result actions are where the plugin stops being a detector and starts being a library tool.

You can copy, save, or pin an image. You can edit its caption or correct its crop in a dialog sized to the PDF page, which matters because a detected figure boundary is often slightly wrong. You can open its PDF page, add it to a note, or remove it.

Notes are created with embedded PNG images that link back to the source PDF, so the note is self contained and still traceable. Optionally you can mirror local results to Zotero image annotations for synchronisation and interoperability, and the annotation path has a shortcut from the PDF Reader: right-click a selected image annotation to add it to the local figure analysis results, with existing Figure, Table, or Formula tags preserved.

Formula handling has its own pipeline, and it is the most feature-dense part of the description. You can optionally recognise formula LaTeX with SiliconFlow Qwen/Qwen3.6-35B-A3B, render it locally with KaTeX, and copy, re-recognise, or edit it with a CodeMirror source editor and live KaTeX preview. Captions can be translated when Zotero PDF Translate is installed.

So the plugin produces four kinds of output from one analysis: images, captions, table footnotes, and formula LaTeX, and it can push them into notes or annotations depending on how you want to work with them.

Comparison layouts live in a file that Zotero Sync will not carry

The comparison layouts are stored locally in zotero-figure/comparison-layouts.json inside the Zotero data directory, and this detail is spelled out because it has a practical consequence.

The file allows for large comparison tables, and existing layouts migrate automatically. You are told to include it in your backups. And layouts are not synchronised by Zotero Sync.

That is a deliberate trade, and it is consistent with the rest of the plugin. The privacy section says local results do not use Zotero Sync unless you enable annotation mirroring, so by default the plugin's output stays on the machine. The layouts file is the one place where a large piece of work could be lost to a device change, and the README's instruction to back it up separately is the mitigation.

The reasoning behind not syncing is worth stating for anyone weighing this against a cloud sync approach. The comparison layout is an arrangement of images across documents, and syncing it would mean syncing large image references and a structured layout document. Keeping it local means the plugin never has to reason about a partial sync of a partially syncing file.

The repository also carries a model-manifest.json at the root and an update.json, and the manifest scripts include dedicated model tooling, with benchmark:models and compare:models scripts pointing at a layout model benchmark and comparison script. That suggests the layout model is treated as a component that gets measured and swapped, not a fixed asset.

What the plugin does not do

It is worth being clear about the boundaries, because a figure extraction plugin invites assumptions.

First, it does not replace reading. The detection is layout based, so what you get is a set of candidate regions classified as figures, tables or formulae, with captions and table footnotes attached where the model finds them. A wrong crop or a misattributed caption still needs a human to look, and the crop dialog exists precisely because the model is not always right.

Second, it is not a bulk PDF tool. The analysis runs locally, which means it is bounded by your machine, and the batch processing entry point analyses selected items rather than running a document pipeline. For a library of a few hundred papers with figures worth extracting, that is the right trade. For a systematic sweep over a large archive, it is the wrong tool.

Third, the optional formula recognition is not the same thing as the local layout detection. Formula OCR needs a network call and an API key, it sends a crop rather than a page, and it may cost money. The README is explicit that SiliconFlow usage may incur charges.

And fourth, the licence is the one that needs attention. AGPL-3.0-or-later is a strong copyleft licence. For a personal Zotero plugin that is almost always fine, but if you plan to modify it and distribute the modification, or to run a modified version as a service, the obligations are real. The README links the AGPL-3.0-or-later license file, and the author is listed as Polygon.

Editorial conclusion

Adopt Zotero Figure if you read papers with figures and formulae and want them as assets in your Zotero library rather than as screenshots, and you are comfortable with a plugin that models are downloaded for and a licence that requires you to share modifications. Do not adopt it if you need batch figure extraction from hundreds of PDFs at speed, because the analysis is local and CPU or GPU bound, and do not deploy it in a setting where a SiliconFlow API key is not allowed. Before you install, check the licence terms, because it is AGPL-3.0-or-later, and note that Zotero Sync does not carry your comparison layouts, so they need backing up separately.

Frequently asked questions

How do I install Zotero Figure?

Download zotero-figure.xpi from the latest release, then in Zotero open Tools, then Plugins, choose Install Plugin From File and select the XPI, and restart Zotero if requested. You need Zotero 9 or Zotero 10, and Java and pdffigures2.jar are not required.

Does Zotero Figure upload my PDFs to a server?

No. PDF parsing, rendering, layout detection and local result storage stay on your computer, and local results do not use Zotero Sync unless you enable annotation mirroring. The optional formula OCR sends formula PNG crops, never full pages, to SiliconFlow, and API-key checking sends a text-only request.

What can I do with the figures and tables Zotero Figure detects?

You can copy, save or pin an image, edit its caption or correct its crop in a dialog sized to the PDF page, open its source PDF page, add it to a Zotero note, or remove it. Notes are created with embedded PNG images that link back to the source PDF, and results can optionally be mirrored to Zotero image annotations.

Are Zotero Figure comparison layouts synced between devices?

No. Comparison layouts are stored locally in zotero-figure/comparison-layouts.json inside the Zotero data directory, existing layouts migrate automatically, and the README asks you to include that file in your backups because Zotero Sync does not carry layouts.

Official sources

  1. Issues
  2. License: AGPL-3.0
  3. MuiseDestiny/zotero-figure on GitHub
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/muisedestiny-zotero-figure.svg)](https://hysenlabs.com/projects/muisedestiny-zotero-figure)

Was this useful?