Synaplan
开源 AI 软件平台,面向企业:自托管 AI 代理,符合 GDPR 的聊天机器人小部件,RAG 知识库,WhatsApp 与 Outlook AI,MCP,多模型路由。支持 Docker、Kubernetes 或在 Germ 托管。
AI 翻译
尚未收集仓库信息。
尚未检测到更新。GitHub 发布版本后会显示在这里。
Free, open-source construction takeoff software in your browser. Quantity takeoff from PDF drawings, scans and DXF files: set the scale, measure lengths and areas, auto-count symbols, export to Excel, save markups that open in Bluebeam. Drawings never upload. CLI and MCP server for AI agents.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗PDF in, quantities out.
pdf2takeoff is free, open-source (Apache-2.0) construction takeoff software that measures and counts PDF drawings, scans and DXF files in your browser at pdf2takeoff.com, without uploading them, plus a headless Node CLI and an MCP server for AI agents built on the same engine.
Try it
npx github:ajflow/pdf2takeoff info drawing.pdfclaude mcp add pdf2takeoff -- npx -y github:ajflow/pdf2takeoff mcppdf2takeoff is quantity takeoff software for estimators, quantity surveyors, builders and trades. Open a drawing, set its scale, and measure lengths, areas, perimeters, volumes, angles and counts. Totals group by label and export to CSV or Excel. Markups save back into the PDF as standard annotations that open in Bluebeam Revu and Adobe Acrobat, so a takeoff moves between pdf2takeoff and the tools a team already uses.
It is free: no account, no file limits and no paid tier. Processing is local: drawings are never uploaded, the app has no telemetry (the website counts page visits with cookie-free Cloudflare Web Analytics, which never sees a drawing), and the app keeps working offline once the page has loaded, so it suits confidential tender documents. It is made by Flowtivity on the Gold Coast, Australia.
For PDF takeoff, yes: pdf2takeoff is a free, open-source alternative to paid takeoff tools such as Bluebeam Revu, PlanSwift and On-Screen Takeoff. It does not match every feature of those products. The feature-by-feature position against Bluebeam Revu, including what we deliberately won't build, is in docs/feature-comparison.md.
The licence is Apache-2.0. To our knowledge pdf2takeoff is the only permissively licensed takeoff engine in a field of AGPL competitors, so you can embed and bundle it.
We publish what the engine scores, how every number was produced, and what it is still bad at, including a benchmark we built and gave away (CC BY 4.0, usable by anyone, including to beat us):
Everything regenerates from this repo with one command per table; see evals/README.md.
Phase plan: the Roadmap below. Feature-by-feature position against Bluebeam Revu, and what we deliberately won't build: docs/feature-comparison.md. Hosting cost model: docs/hosting-cost-controls.md. Licensing rationale: Why open source?.
$INSUNITS, so its scale is set with no calibration (MCP open_document reports it and pre-sets it too). Blocks are expanded through their inserts, so Scan counts doors and fittings exactly; TEXT and MTEXT become real text wrapped to its box; hatches show as tones beneath the linework; frozen and off layers and paper space are left out. DWG gets a plain "export DXF or PDF" message.S and click one instance of a repeated symbol: a local computer-vision pass (rasterize → binarize → connected components → shape matching) finds and counts every match on the page in ~100 ms, no model download and nothing uploaded. Hits land as flagged proposals (⚑) — confirm (✓) or delete them, and the totals show a live kept-rate per label (kept/proposed: every deletion is a judged false positive), so the tool's accuracy on your symbols is always visible. A trained v1 detector ships with the site (five classes: downlight, GPO, switch, smoke alarm, diffuser — manifest in ): on cluttered sheets the same click upgrades automatically to an in-browser ONNX detector (, WASM) that labels hits by class, with automatic fallback to the CV pass if the model can't load. The ~76 MB model is fetched once from GitHub and cached; drawings still never leave your machine. Self-hosting or retraining: drop your own + into — the pipeline is in .npm install
npm run dev # http://localhost:5173
Then hit ▶ Watch the demo: the tool drives itself through a full takeoff on the sample drawing (calibrate → measure → area → scan-count) and shows the output summary with working export buttons. Or skip straight to "Try the sample drawing" and do it yourself.
npm run build # type-check + production build in dist/
npm run sample # regenerate public/examples/sample-floor-plan.pdf
npm run bench # takeoff accuracy bench on synthetic sheets (rooms, counts, scales)
npm run bench:rooms -- --dir <folder> scores Magic Fill room areas against the ResPlan floor-plan dataset (setup in scripts/bench/README.md). npm run bench:ledger runs the fast benches and appends their headline numbers, with the commit, to bench/results/ledger.jsonl (--compare prints the delta against the previous run).
Deploy dist/ to any static host. Cloudflare Pages is the reference target (public/_headers is included).
The same engine runs headless on Node (22.13+) — no browser, no bundler, and
no network calls except two: the first ocr run on a scan downloads a ~3 MB
language pack (cached; see PDF2TAKEOFF_TESSDATA below), and ai-count
sends the page you choose to the AI provider you choose:
npx github:ajflow/pdf2takeoff info drawing.pdf # run straight from GitHub, nothing installed
npx github:ajflow/pdf2takeoff scan drawing.pdf --page 1 --at 88,271
npm install -g github:ajflow/pdf2takeoff # or install the commands once
The first ocr use fetches the ~3 MB English pack described above, whatever
install route you took.
npm run cli -- info drawing.pdf # pages, sizes, annotation counts
npm run cli -- compare r2.pdf r3.pdf --png diff.png # per-sheet change fractions + regions
npm run cli -- compare r2/ r3/ --png-dir ov/ # folders: batch the whole set, pair by filename
npm run cli -- scan drawing.pdf --page 1 --at 88,271 # click-point auto-count, JSON hits
npm run cli -- scan plan.png --page 1 --at 318,447 # PNG/JPG input (every command): one page of W/3 x H/3 points
npm run cli -- export drawing.pdf --scale 1:100 # annotations → quantities CSV
npm run cli -- annotate drawing.pdf --spec takeoff.yaml -o marked.pdf
npm run cli -- run takeoff.yaml --prev run-a.json # regenerate + diff quantities
npm run cli -- set tender/ -o current-issue.pdf # slip-sheet: newest per sheet, sorted
npm run cli -- ocr scan.pdf --page 1 [--region x,y,w,h] # scanned sheet: OCR words, scale note, room labels by class
One command asks a vision model to inventory a sheet:
export OPENROUTER_API_KEY=... # or set it in your shell profile
npm run cli -- ai-count drawing.pdf --model google/gemini-3.5-flash
An OpenRouter key gets you any vision model with one
account; OpenAI, Google Gemini and Z.ai keys work directly (--provider openai|gemini|zai). Prefer nothing to leave the machine? --provider ollama
or lmstudio talks to a local server, and any other OpenAI-compatible
endpoint works through --base-url. Keys come from environment variables
only (OPENROUTER_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY,
ZAI_API_KEY, or PDF2TAKEOFF_AI_KEY for any provider) — never command
lines or files.
What comes back is the model's proposals as flagged count markups (the same
review flow as scan proposals) plus quantities counted under a preset
(--preset aecv or schedule): switching the preset recounts instantly,
with no new model call. --items lists every proposal as JSON; -o marked.pdf writes them into the PDF, types included, so a human can confirm
or delete each one and a later run replaces only the unconfirmed ones. Accuracy depends entirely on the model you point it at — review the
flags before trusting a number.
run is takeoff-as-code: the spec names the scale, one click-point per
symbol type (a class: field is reserved for when the ONNX detector runs
headless; today the CLI scans with the CV tier), and the exports. Re-run it on
every revision with --prev to see exactly which quantities changed — the
CI-friendly revision loop.
Every <file.pdf> above also takes an image directly (PNG, JPG, TIFF, WebP,
GIF, BMP, AVIF or SVG; the MCP open_document included), as well as
image-only (scanned) PDFs, including CCITT fax, JBIG2 and JPEG 2000 images: an image is
one page of width/3 by height/3 points, so a click at pixel (px, py) is
--at px/3,(H - py)/3 and the scan sees the native pixels. compare --json
is designed for pipelines (jq '.changedSheets'); scan
returns the same hits the web Scan tool finds. This is the substrate for the
agent API (MCP) — see specs/headless-engine.md.
Environment variables: PDF2TAKEOFF_MODEL_DIR (or scan --model <dir>)
selects a trained ONNX detector directory — without it the scan stays on the
CV tier; PDF2TAKEOFF_TESSDATA points the OCR language pack at an
offline/frozen copy instead of downloading it; PDF2TAKEOFF_OCR_DUMP
writes the binarised OCR crops to a folder for debugging.
pdf2takeoff mcp starts a local MCP server on stdio with fifteen tools —
open_document, render_page (the agent's eyes: a PNG of any sheet),
read_text (the sanctioned way to read printed scales/dimensions/labels —
exact, positioned, never off the rendered image), set_scale, measure,
fill_area, scan_symbol, propose_items, count_items,
compare_revisions, list_markups, set_status, delete_markup,
export, save_annotated — so an AI agent can run a whole takeoff and hand
the marked-up PDF to a human for review. Local process, local files, nothing
uploaded.
Proposed doors, Windows and spaces land as flagged count markups a human can
confirm or delete, and count_items derives every quantity from those items
under a counting preset (aecv, schedule) — switching the counting
convention recounts instantly, with no new detection pass.
Register it with any MCP client (ZCode, Claude Desktop, Cursor), straight from GitHub:
{
"mcpServers": {
"pdf2takeoff": {
"command": "npx",
"args": ["-y", "github:ajflow/pdf2takeoff", "mcp"]
}
}
}
Claude Code: claude mcp add pdf2takeoff -- npx -y github:ajflow/pdf2takeoff mcp.
No public benchmark tests measuring a length or an area from a scaled drawing,
so the repo ships one. bench/scaled-drawing-bench
is a deterministic, CC BY 4.0 set of 200 synthetic floor-plan sheets (half
born-digital, half degraded 150 dpi scans; five scale notations; A3, A1 and
ARCH D; some rotated; some with a revision B) and about 2,000 estimator-style
questions with exact answers: scale, wall lengths, room areas and perimeters,
symbol counts, printed dimensions and revision changes. npm run bench:scaled -- generate
builds it from a seed, score grades a predictions file (within 2 and 5
percent, MAPE, exact counts, change-set F1, hallucination rate) and
reference runs pdf2takeoff's own deterministic solver, whose table is in the
benchmark README: near perfect on the vector half, with the raster half
showing where the engine's scan and OCR paths still fall short.
evals/ is a public, reproducible benchmark suite: room-area fill scored against analytic ground truth, detector precision/recall with every miss attributed to the gate that dropped it, an MCP workflow conformance bench, a perf bench, and a committed baseline that fails CI on any regression — plus a manual anchor on the external AEC-Geometric-Bench. Numbers are published with their run logs under evals/runs/.
src/engine/ — the takeoff engine: measurement geometry, scan CV + ONNX decode, compare blend, PDF annotation IO, quantity export. Pure TypeScript with zero DOM/bundler imports (enforced in CI via a no-DOM typecheck + import guard) so the same code runs in the browser and headless in Node.src/app/ — the browser UI: PDF.js viewer, tools, markups table, report, persistence. Wires the engine's ports (RasterPage, DetectorSession) to browser adapters.src/headless/ — the Node side: the CLI (cli.ts, launched by bin/pdf2takeoff.js), the MCP server (mcp.ts), the takeoff-as-code spec loader, and the PDF.js/raster adapters that wire the engine's ports to Node. Design: specs/headless-engine.md.| Key | Action |
|---|---|
V / C / W / L / A / N / P / O / G / T / D / S | pan · calibrate · viewport · length · area · count · perimeter · volume · angle · note · fill · scan |
F | fit width |
+ / − | zoom |
← / → | previous / next page |
Double-click or Enter | finish a measurement |
Backspace | remove last vertex while drawing |
Delete | remove selected markup |
Ctrl/Cmd+Z | undo last measurement |
Esc | cancel / deselect |
There is no real open-source Bluebeam for construction yet. An open core lets builders and developers add trade-specific tools (HVAC, rebar, electrical) and AI takeoff helpers without asking permission. Permissive dependencies only (PDF.js is Apache-2.0, pdf-lib is MIT); we deliberately avoid AGPL components.
Issues and PRs welcome; read CONTRIBUTING.md first (short version: issue before PR, small scoped changes, CI green, and the contributor licence terms under Licensing your contribution). Trade-specific feature ideas (what does your takeoff actually look like?) are the most valuable input of all.
Apache-2.0 © pdf2takeoff contributors
onnxruntime-websymbols.onnxsymbols.jsonpublic/models/value * 1.1 style, no codeexport takes template for the same summary.propose_walls with include "all"). Drawings that draw walls as plain outlines say so instead of guessing.sample-floor-plan.pdf vs sample-floor-plan-rev-b.pdf.