A client-side PDF to Excel/CSV converter built with vanilla JavaScript. It specializes in extracting tables from PDF documents, processes everything locally in the browser, and supports right-to-left (Hebrew and Arabic) text.
A project by NX1X Lab.
This is a small personal project, maintained on an as-needed basis. It is not accepting external contributions or feature requests.
EasyConvert reads a PDF entirely in the browser using PDF.js, detects tabular data, and exports it as an .xlsx (via SheetJS) or .csv file. No file ever leaves the device: there is no server, no upload, and no data collection. It is deployed as a static site on Cloudflare Pages and installable as a Progressive Web App.
- Client-side processing - files are never uploaded to a server
- Table-focused extraction with multiple detection methods
- Excel (
.xlsx) and CSV export - Right-to-left support for Hebrew and Arabic
- Bilingual interface (English and Hebrew)
- Installable PWA with offline caching
- No signup, no file-size limit, no tracking of file content
| Area | Choice |
|---|---|
| PDF parsing | PDF.js (cdnjs, Subresource Integrity pinned) |
| Spreadsheet export | SheetJS / xlsx (cdnjs, SRI pinned) |
| Application code | Vanilla JavaScript, no framework |
| Styling | Plain CSS (Grid and Flexbox) |
| PWA | Service Worker + Web App Manifest |
| Bot protection | Cloudflare Turnstile |
| Hosting | Cloudflare Pages (static) |
EasyConvert/
├── public/ # The deployable site (Cloudflare output directory)
│ ├── index.html # Markup
│ ├── style.css # Styles
│ ├── app.js # Application logic
│ ├── sw.js # Service worker
│ ├── manifest.json # PWA manifest
│ ├── _headers # Cloudflare Pages response headers (CSP etc.)
│ ├── _redirects # Cloudflare Pages redirects
│ ├── _worker.js # Asset allowlist worker
│ └── *.svg / *.png / *.ico
├── .github/
│ ├── renovate.json # Dependency automation
│ └── workflows/ # CodeQL, Gitleaks, dependency review, CI
├── scripts/ # Version + release helpers, CDN version check
├── package.json
├── CHANGELOG.md
└── LICENSE
- Content Security Policy with no
'unsafe-inline'(all JS and CSS are external files, no inline handlers). - Subresource Integrity on the CDN-hosted PDF.js and SheetJS libraries.
- Strict response headers: HSTS (preload),
X-Content-Type-Options,Referrer-Policy,Permissions-Policy,Cross-Origin-Opener-Policy,Cross-Origin-Resource-Policy. - Spreadsheet formula-injection guard on CSV and XLSX export.
- Supply chain: committed lockfile, GitHub Actions pinned to commit SHAs, Renovate with a 14-day release cooldown, and CI that scans for secrets (Gitleaks), reviews dependencies, runs CodeQL, and verifies CDN versions stay in sync.
The site is static; serve the public/ directory with any static file server:
# Python
python -m http.server 8000 -d public
# Node
npx serve publicThen open http://localhost:8000.
The repository is deployed as a static site. To serve only the site directory and keep the rest of the repository private, set the build output directory to public.
- In the Cloudflare dashboard, create a Pages project and connect this repository.
- Build settings:
- Framework preset: None
- Build command: (leave empty)
- Build output directory:
public - Root directory:
/
- Deploy. Only the contents of
public/are published; everything else in the repository (docs, CI config, package files) is never served.
public/_headers applies the security headers and public/_redirects handles routing. No environment variables are required.
- Upload a PDF (drag and drop, or click to browse).
- Choose an extraction method and options.
- Review the extracted data in the preview table.
- Download as Excel or CSV.
Extraction methods: Smart Table Detection, Text Extraction, Structured Data, and Advanced Table Detection.
This project follows Semantic Versioning. See CHANGELOG.md for release notes.
- PDF.js - PDF parsing
- SheetJS - spreadsheet generation
- Cloudflare Pages - hosting
Licensed under the Apache License 2.0. See LICENSE for details.