{"_rev":"4-99a1d5271dbf37becb4cb617222f70bd","time":{"created":"2026-01-01T11:43:47.251Z","modified":"2026-01-01T11:43:47.767Z","1.0.0":"2026-01-01T11:06:35.245Z","1.0.1":"2026-01-01T11:43:47.482Z"},"_id":"@ali-husnain00/docforge","name":"@ali-husnain00/docforge","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.1":{"name":"@ali-husnain00/docforge","version":"1.0.1","description":"Pixel-perfect PDF generation from HTML using Puppeteer - No setup required","main":"client/index.js","browser":"client/index.js","exports":{".":"./client/index.js","./client":"./client/index.js"},"bin":{"docforge":"cli/index.js"},"scripts":{"build":"npm install && node scripts/postinstall.js","dev":"node scripts/start-backend.js","start":"node backend/index.js","cli":"node cli/index.js","example":"node examples/basic-example.js","postinstall":"node scripts/postinstall.js"},"keywords":["pdf","puppeteer","html-to-pdf","pdf-generation","tailwind","document","converter","cli","sdk"],"author":{"name":"Ali Husnain"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/ali-husnain00/docforge.git"},"engines":{"node":">=18.0.0"},"dependencies":{"axios":"^1.13.2","body-parser":"^2.2.1","commander":"^14.0.2","cors":"^2.8.5","dotenv":"^16.4.5","express":"^5.2.1","puppeteer":"^24.34.0"},"_id":"@ali-husnain00/docforge@1.0.1","gitHead":"0831ab5384a0ea103a3562ef3e015fd7e0f1db69","bugs":{"url":"https://github.com/ali-husnain00/docforge/issues"},"homepage":"https://github.com/ali-husnain00/docforge#readme","_nodeVersion":"20.19.4","_npmVersion":"10.8.2","dist":{"integrity":"sha512-ZujZyXRYaA5zXHmz8lrBPkpkRFUe6eGmZlQZehXYGYAmH0ijLOV5etMvVBP4LaYVOXk+if9luZLXMNe8z9wfnQ==","shasum":"e82016d0430dbbf0793a60973cbfe7fd8895edbc","tarball":"https://registry.npmjs.org/@ali-husnain00/docforge/-/docforge-1.0.1.tgz","fileCount":22,"unpackedSize":55326,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIDzK3rxYmOXw2eiJ9kqGKAUhO8E8URcW17BIu4dl0WHjAiEAp8/pUZ+v8szaYr59/UtTelQlC57UufUWsuvGlwaZZFc="}]},"_npmUser":{"name":"ali-husnain00","email":"alihusnain68786@gmail.com"},"directories":{},"maintainers":[{"name":"ali-husnain00","email":"alihusnain68786@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/docforge_1.0.1_1767267827329_0.927857743043923"},"_hasShrinkwrap":false}},"maintainers":[{"name":"ali-husnain00","email":"alihusnain68786@gmail.com"}],"description":"Pixel-perfect PDF generation from HTML using Puppeteer - No setup required","homepage":"https://github.com/ali-husnain00/docforge#readme","keywords":["pdf","puppeteer","html-to-pdf","pdf-generation","tailwind","document","converter","cli","sdk"],"repository":{"type":"git","url":"git+https://github.com/ali-husnain00/docforge.git"},"author":{"name":"Ali Husnain"},"bugs":{"url":"https://github.com/ali-husnain00/docforge/issues"},"license":"MIT","readme":"# DocForge\r\n\r\n> Pixel-perfect PDF generation from HTML using Puppeteer - No setup required.\r\n\r\n[![npm version](https://img.shields.io/npm/v/@ali-husnain00/docforge.svg?style=flat-square)](https://www.npmjs.com/package/@ali-husnain00/docforge)\r\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?style=flat-square)](https://opensource.org/licenses/MIT)\r\n\r\nDocForge solves common HTML/Tailwind → PDF issues (overflow, pagination, pixel mismatch) by providing a clean, browser-safe SDK and a hosted backend that handles all the complexity for you.\r\n\r\n## 🎯 What Problem Does This Solve?\r\n\r\n### Why html2canvas/jspdf Fail\r\n\r\n- **Overflow Issues**: Content gets cut off or doesn't fit properly\r\n- **Pagination Problems**: Multi-page content breaks incorrectly\r\n- **Pixel Mismatch**: Rendered output doesn't match your design\r\n- **CSS Limitations**: Limited support for modern CSS (Tailwind, Flexbox, Grid)\r\n- **Setup Complexity**: Requires managing browser instances and configurations\r\n\r\n### Why DocForge Works\r\n\r\n✅ **Pixel-Perfect Rendering**: Uses Puppeteer's headless Chrome for accurate rendering  \r\n✅ **Tailwind CSS Support**: Fully supports Tailwind classes (ensure CDN or styles are present)  \r\n✅ **Automatic Pagination**: Smartly handles page breaks for long content  \r\n✅ **Browser-Compatible**: Works seamlessly in React, Next.js, and any browser environment  \r\n✅ **Clean API**: Simple function call, no Puppeteer knowledge required  \r\n✅ **No Runtime Errors**: Browser-safe SDK with no Node.js APIs\r\n\r\n## 🚀 Installation\r\n\r\n```bash\r\nnpm install @ali-husnain00/docforge\r\n```\r\n\r\n## 📖 Usage\r\n\r\n### Frontend (React / Next.js / Browser)\r\n\r\nThe client SDK is 100% browser-safe - no Node.js APIs, no `process.env` access.\r\n\r\n```javascript\r\nimport { generatePdf } from \"@ali-husnain00/docforge/client\";\r\n\r\n// generatePdf returns a Uint8Array (PDF buffer)\r\nconst arrayBuffer = await generatePdf({\r\n  html: `\r\n    <div class=\"min-h-screen bg-blue-500 p-8\">\r\n      <h1 class=\"text-4xl font-bold text-white\">Hello World</h1>\r\n    </div>\r\n  `,\r\n  options: {\r\n    format: \"A4\",\r\n    printBackground: true,\r\n    margin: {\r\n      top: \"5mm\",\r\n      right: \"0\",\r\n      bottom: \"10mm\",\r\n      left: \"0\",\r\n    },\r\n  },\r\n});\r\n\r\n// Convert to Uint8Array and create Blob for download\r\nconst pdfBuffer = new Uint8Array(arrayBuffer);\r\nconst blob = new Blob([pdfBuffer], { type: \"application/pdf\" });\r\nconst url = URL.createObjectURL(blob);\r\nconst link = document.createElement(\"a\");\r\nlink.href = url;\r\nlink.download = \"document.pdf\";\r\nlink.click();\r\nURL.revokeObjectURL(url);\r\n```\r\n\r\n**Using a self-hosted backend:**\r\n\r\n```javascript\r\nimport { generatePdf } from \"@ali-husnain00/docforge/client\";\r\n\r\nconst pdf = await generatePdf({\r\n  html: \"<h1>Hello</h1>\",\r\n  options: { format: \"A4\" },\r\n  apiUrl: \"http://your-backend-url.com:5000\", // Optional: override default API URL\r\n});\r\n```\r\n\r\n### Node.js\r\n\r\nFor Node.js environments, you can use the CLI or call the backend API directly:\r\n\r\n```javascript\r\n// Using fetch (Node 18+)\r\nconst response = await fetch(\"http://localhost:5000/api/pdf/generate\", {\r\n  method: \"POST\",\r\n  headers: { \"Content-Type\": \"application/json\" },\r\n  body: JSON.stringify({\r\n    html: \"<h1>Hello</h1>\",\r\n    options: { format: \"A4\" },\r\n  }),\r\n});\r\n\r\nconst pdfBuffer = Buffer.from(await response.arrayBuffer());\r\nfs.writeFileSync(\"output.pdf\", pdfBuffer);\r\n```\r\n\r\n### CLI\r\n\r\n```bash\r\n# Generate PDF from HTML file\r\nnpx @ali-husnain00/docforge generate --input template.html --output output.pdf\r\n\r\n# With custom format and margins\r\nnpx @ali-husnain00/docforge generate \\\r\n  --input template.html \\\r\n  --output output.pdf \\\r\n  --format A4 \\\r\n  --margin \"0.5in,0.5in,0.5in,0.5in\"\r\n\r\n# Using custom backend URL\r\nnpx @ali-husnain00/docforge generate \\\r\n  --input template.html \\\r\n  --output output.pdf \\\r\n  --api-url http://localhost:5000\r\n```\r\n\r\n**CLI Options:**\r\n\r\n- `-i, --input <file>`: Input HTML file path (required)\r\n- `-o, --output <file>`: Output PDF file path (default: `output.pdf`)\r\n- `-f, --format <format>`: PDF format - A4, Letter, etc. (default: `A4`)\r\n- `-m, --margin <margins>`: Margins in format `top,right,bottom,left` (default: `0.5in,0.5in,0.5in,0.5in`)\r\n- `--print-background`: Print background graphics (default: true)\r\n- `--no-print-background`: Don't print background graphics\r\n- `--api-url <url>`: Backend API URL (default: `http://localhost:5000`)\r\n\r\n## 🏗️ Architecture\r\n\r\nDocForge is split into three clear parts:\r\n\r\n### 1️⃣ Backend (Node-only)\r\n\r\n- Contains Express + Puppeteer\r\n- Lives in `/backend`\r\n- Exposes HTTP API: `POST /api/pdf/generate`\r\n- Accepts `{ html, options }`\r\n- Returns generated PDF (buffer)\r\n- Uses environment variables only here\r\n\r\n### 2️⃣ Client SDK (Browser-safe)\r\n\r\n- Lives in `/client`\r\n- Pure JavaScript (fetch-based)\r\n- No Node APIs, no Puppeteer, no `process.env`\r\n- Exports: `generatePdf({ html, options, apiUrl? })`\r\n- Uses default hosted API URL (`http://185.208.206.3:5000`)\r\n- Allows optional `apiUrl` override for self-hosted users\r\n\r\n### 3️⃣ CLI (Node-only)\r\n\r\n- Lives in `/cli`\r\n- Uses backend API (same as client, but from Node)\r\n- No browser logic here\r\n\r\n## 🚀 Backend Setup\r\n\r\n### Option 1: Use Hosted Backend (Default)\r\n\r\nThe client SDK uses a hosted backend by default (`http://185.208.206.3:5000`). No setup required!\r\n\r\n### Option 2: Self-Hosted Backend\r\n\r\n1. **Deploy the backend:**\r\n\r\n```bash\r\ngit clone https://github.com/ali-husnain00/docforge.git\r\ncd docforge\r\nnpm install\r\nnpm start\r\n```\r\n\r\n2. **Use in your app:**\r\n\r\n```javascript\r\nimport { generatePdf } from \"@ali-husnain00/docforge/client\";\r\n\r\nconst arrayBuffer = await generatePdf({\r\n  html: \"<h1>Hello</h1>\",\r\n  options: { format: \"A4\" },\r\n  apiUrl: \"http://your-backend-url.com:5000\", // Your self-hosted backend\r\n});\r\n\r\n// Convert to Uint8Array and create Blob\r\nconst pdfBuffer = new Uint8Array(arrayBuffer);\r\nconst blob = new Blob([pdfBuffer], { type: \"application/pdf\" });\r\n```\r\n\r\n### Backend Environment Variables\r\n\r\n- `PORT`: Backend server port (default: `5000`)\r\n- `NODE_ENV`: Environment mode (`development` or `production`)\r\n- `PUPPETEER_EXECUTABLE_PATH`: Optional path to Chrome/Chromium executable\r\n\r\n### Backend Deployment (Docker / Linux)\r\n\r\nIf you deploy the backend in a Docker container, Puppeteer requires Chromium dependencies.\r\n\r\n**Solution:** Install Chromium dependencies in your Dockerfile:\r\n\r\n```dockerfile\r\nRUN apt-get update && apt-get install -y \\\r\n    gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 \\\r\n    libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 \\\r\n    libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 \\\r\n    libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 \\\r\n    libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 \\\r\n    libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 \\\r\n    libxtst6 ca-certificates fonts-liberation libappindicator1 \\\r\n    libnss3 lsb-release xdg-utils wget\r\n```\r\n\r\n## ⚙️ PDF Options\r\n\r\n```javascript\r\n{\r\n  format: \"A4\" | \"Letter\" | \"Legal\" | ...,\r\n  margin: {\r\n    top: \"0.5in\",\r\n    right: \"0.5in\",\r\n    bottom: \"0.5in\",\r\n    left: \"0.5in\"\r\n  },\r\n  printBackground: true,\r\n  displayHeaderFooter: false,\r\n  headerTemplate: \"<div>Header</div>\",\r\n  footerTemplate: \"<div>Footer</div>\",\r\n  css: \"/* Custom CSS to inject */\",\r\n  filename: \"document\"\r\n}\r\n```\r\n\r\n## 📁 Project Structure\r\n\r\n```\r\ndocforge/\r\n├── backend/        # Express + Puppeteer (Node only)\r\n├── client/         # Browser-safe SDK (fetch only)\r\n├── cli/            # CLI tool\r\n├── sdk/            # (Optional) Node SDK\r\n├── README.md\r\n├── CONTRIBUTING.md\r\n├── LICENSE\r\n└── package.json\r\n```\r\n\r\n## 🧪 Examples\r\n\r\nSee the `examples/` directory for complete examples:\r\n\r\n- `react-example.jsx`: React component example\r\n- `nextjs-api-route.js`: Next.js API route example\r\n- `basic-example.js`: Node.js usage example\r\n- `template.html`: Sample HTML template with Tailwind CSS\r\n\r\n## 🛠️ Development\r\n\r\n### Running Backend Locally\r\n\r\n```bash\r\nnpm start\r\n# Backend runs on http://localhost:5000\r\n```\r\n\r\n### Running CLI Locally\r\n\r\n```bash\r\nnpm run cli -- generate --input examples/template.html --output test.pdf\r\n```\r\n\r\n## 📋 Roadmap\r\n\r\n- [ ] Support for custom CSS files\r\n- [ ] WebSocket support for real-time generation\r\n- [ ] Batch PDF generation\r\n- [ ] PDF merging capabilities\r\n- [ ] Watermark support\r\n- [ ] Custom fonts support\r\n- [ ] Docker image for easy deployment\r\n\r\n## 🤝 Contributing\r\n\r\nSee [CONTRIBUTING.md](./CONTRIBUTING.md) for guidelines.\r\n\r\n## 📄 License\r\n\r\nMIT License - see [LICENSE](./LICENSE) file for details.\r\n\r\n## 🙏 Acknowledgments\r\n\r\n- Built with [Puppeteer](https://pptr.dev/)\r\n- Powered by [Express](https://expressjs.com/)\r\n- Inspired by the need for better PDF generation tools\r\n\r\n---\r\n\r\nMade with ❤️ for developers who just want PDFs to work.\r\n","readmeFilename":"README.md"}