尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
I free pdf editor and signing tool
翻譯準備中
正在載入完整 README。 以下為已儲存的摘錄。
Fill forms, add text, tick boxes, draw shapes and sign PDFs in the browser.
Everything runs on the user's device: files are never uploaded, so hosting is a
plain static site (free on Vercel) with no server, storage, or per-use cost.
Sejda and Smallpdf are the reference products. Their most-used editing features are the same
small set: add text, fill form fie檢視完整 README ↗Fill forms, add text, tick boxes, draw shapes and sign PDFs in the browser. Everything runs on the user's device: files are never uploaded, so hosting is a plain static site (free on Vercel) with no server, storage, or per-use cost.
| Area | What you get |
|---|---|
| Fillable forms | Detects AcroForm fields (text, multiline, checkbox, radio, dropdown) and fills them natively. Optional "Flatten form" on download. |
| Text | Click anywhere to type. 5 fonts across categories: Helvetica (sans), Times (serif), Courier (mono), Kalam (handwriting), Dancing Script (script). Size, bold, italic, colour. Date stamp. |
| Form marks | Tick ✓, cross ✗ and radio dot ● for printed (non-fillable) forms. Resizable, recolourable. |
| Shapes | Box, circle/ellipse, line, arrow — stroke colour, stroke width, fill on/off, fill colour, opacity. Shift = square / circle / 45° snap. |
| Markup | Freehand pen, highlighter (multiply blend), whiteout. |
| Images | Insert PNG / JPEG / WebP / GIF. |
| Signatures & initials | Draw, type (4 signature fonts) or upload (with white-background removal). Black / blue / red ink. Saved on the device for reuse. |
| Editing | Move, resize, duplicate, bring to front / send to back, delete, undo / redo, arrow-key nudge, zoom. |
| Robustness | Handles rotated pages, crop-box offsets, and pages whose content leaks graphics state. Password-protected PDFs open after entering the password; encrypted PDFs export as a flattened copy. |
Keyboard: V select · T text · D date · K tick · X cross · O dot · R box · E circle · L line · A arrow · P draw · H highlight · W whiteout · I image · S sign · N initials · Ctrl/⌘+Z undo · Ctrl/⌘+Shift+Z redo · Ctrl/⌘+D duplicate · Ctrl/⌘+S download · Del delete · Esc cancel.
Sejda and Smallpdf are the reference products. Their most-used editing features are the same small set: add text, fill form fields, checkmarks, shapes/whiteout, highlight and draw, images, and signatures (type / draw / upload) plus initials and dates. Both process files on their servers and cap free use (Sejda: 3 tasks per hour, 50 pages, 50 MB; Smallpdf: limited free tasks, and editing the PDF's original text requires Pro).
FreePDF covers that core set with no limits, because the work happens locally in the browser. Not included (yet): editing text that's already in the PDF, adding links or new form fields, and page tools (merge/split/rotate/reorder).
src/shapes.js produces the SVG path for each shape; the same path is
drawn on screen and written to the PDF, so output matches what you see.src/
main.js app shell: toolbar, property bar, shortcuts, open/download
viewer.js pdf.js loading, page rendering, form-field detection
overlay.js annotation rendering, selection, drag/resize, tools, form inputs
exporter.js pdf-lib export (+ flattened fallback for encrypted files)
shapes.js geometry shared by screen and export
signature.js signature/initials dialog
fonts.js font registry and text metrics
state.js state + undo/redo
sample.js generates the demo form
pdf-lib's font subsetter drops glyphs from many fonts (Kalam, Caveat). Fonts are therefore
embedded whole unless subsetting is known to work for that file (Dancing Script, which
can't be embedded whole). The subset flag lives on each font in src/fonts.js. If you add
a font, check the exported PDF in a second viewer (e.g. Preview or Chrome).
The three standard fonts only cover Western European characters. Other characters are
replaced with ? in the exported file. Arabic/Urdu etc. would need an embedded Unicode font.
npm install
npm run dev
npm run build # production build into dist/
npm run preview # serves dist/ on localhost with the same security headers as Vercel
vercel.json sets a strict Content-Security-Policy (everything from the same origin, no third-party
requests), HSTS, no-referrer, clickjacking protection, and long-lived caching for hashed assets.
npm run preview applies the same headers, so a policy change that breaks the app shows up locally.
If you add a CDN, analytics or an embedded iframe, update the policy in vercel.json first.
main is the live website. Never work on it directly. Every other branch gets its own private
preview link from Vercel, so you can review changes on a real URL before they go live.
git switch -c short-name-of-change # 1. new branch from main
npm run dev # 2. build and test locally
git add -A && git commit -m "What I changed"
git push # 3. publish the branch (first push sets up tracking)
以上為 README 的開頭部分。其餘內容請閱讀原文。 檢視完整 README ↗