تحويل ملفات Markdown إلى PDF باحترافية، مع دعم كامل للعربية وواجهة RTL ونظام حفظ ملفات للمستخدمين.
https://md.futuresolutionsdev.com
- رفع سهل للملفات عبر السحب والإفلات أو الاختيار المباشر من المتصفح.
- تتبع حي للتحويل عبر SSE مع progress bar وسجل رسائل أثناء التحويل.
- حفظ الملفات للمستخدمين مع صفحة
filesلعرض الملفات المحفوظة وإدارتها. - تنزيل داخل الصفحة للملفات المحفوظة مع مؤشر تقدم داخل الصف نفسه، بدون فتح تبويب أو صفحة جديدة.
- دعم عربي كامل مع RTL وخط Cairo وتنسيق مناسب للمحتوى العربي.
- تنسيق PDF احترافي للعناوين والجداول وكتل الأكواد والاقتباسات.
- الاحتفاظ باسم الملف بحيث يخرج الـ PDF باسم مناسب مشتق من الملف الأصلي.
| Layer | Technology |
|---|---|
| Runtime | Bun |
| Framework | Hono |
| PDF Engine | Puppeteer Core |
| Markdown Parser | markdown-it + anchor + TOC |
| Storage | SQLite + ملفات PDF محلية داخل storage/ |
| Frontend | HTML + CSS + Vanilla JavaScript |
- Bun
- متصفح Chromium / Google Chrome / Microsoft Edge متاح على الجهاز
- يمكن ضبط
CHROME_PATHإذا لم يتم اكتشاف المتصفح تلقائياً
bun installbun run startللتشغيل أثناء التطوير:
bun run devوللتشغيل عبر PM2:
pm2 start ecosystem.config.jsافتح المتصفح على:
http://localhost:3050
يمكن تغيير المنفذ عبر المتغير:
PORT=3050التطبيق يعتمد على Puppeteer Core، لذلك يجب أن يكون Chrome / Edge / Chromium مثبتاً على الخادم أو الجهاز الذي يشغّل التطبيق. إذا لم يتم العثور عليه تلقائياً، عيّن:
CHROME_PATH=/path/to/chromeعلى Windows يمكن أن يعمل تلقائياً مع:
C:\Program Files\Google\Chrome\Application\chrome.exeC:\Program Files\Microsoft\Edge\Application\msedge.exe
md-to-pdf/
├── server.js # Hono server + routes + SSE + download endpoints
├── convert.js # Markdown → HTML → PDF
├── auth.js # الجلسات والمصادقة
├── files.js # منطق الملفات المحفوظة والتخزين
├── db.js # الاتصال بقاعدة البيانات
├── public/
│ ├── assets/
│ │ ├── css/
│ │ └── js/
│ └── pages/
│ ├── convert.html
│ ├── files.html
│ ├── login.html
│ └── register.html
├── src/
│ └── i18n/ # ملفات الترجمة
├── uploads/ # ملفات التحويل المؤقتة
├── storage/ # ملفات PDF المحفوظة للمستخدمين
├── screenshots/
├── ecosystem.config.js
└── package.json
| Method | Endpoint | الوصف |
|---|---|---|
POST |
/convert |
رفع ملف .md وبدء التحويل، ويرجع { jobId } |
GET |
/stream/:jobId |
SSE stream للـ progress والـ logs |
GET |
/download/:jobId |
تنزيل الـ PDF بعد اكتمال التحويل |
| Method | Endpoint | الوصف |
|---|---|---|
POST |
/api/auth/register |
إنشاء حساب جديد |
POST |
/api/auth/login |
تسجيل الدخول |
POST |
/api/auth/logout |
تسجيل الخروج |
GET |
/api/auth/me |
جلب بيانات المستخدم الحالي |
| Method | Endpoint | الوصف |
|---|---|---|
POST |
/api/files/save/:jobId |
حفظ ملف PDF الناتج ضمن ملفات المستخدم |
GET |
/api/files |
جلب قائمة الملفات المحفوظة |
GET |
/api/files/:id |
جلب بيانات ملف محفوظ واحد |
GET |
/api/files/:id/download |
تنزيل ملف محفوظ مع Content-Length ومؤشر تقدم داخل الصفحة |
DELETE |
/api/files/:id |
حذف ملف محفوظ |
GET |
/api/storage |
جلب حالة التخزين وعدد الملفات |
- الحد الأقصى لحجم الملف المرفوع:
10 MB - الحد الأقصى للملفات المحفوظة لكل مستخدم:
20ملفاً - الحد الأقصى للتخزين لكل مستخدم:
100 MB - تنظيف ملفات التحويل المؤقتة: بعد
10دقائق تقريباً
صفحة files تدعم حالياً:
- عرض الملفات المحفوظة مع الاسم والتاريخ والحجم.
- تنزيل الملف المحفوظ بدون navigation.
- إظهار progress bar داخل صف الملف أثناء التنزيل.
- حذف الملفات مع نافذة تأكيد.
- عرض حالة التخزين المستخدمة وعدد الملفات.
تنسيق الـ PDF موجود داخل convert.js في كتلة الـ <style>، ويتضمن:
h1بخلفية متدرجةh2وh3بتنسيق عربي واضح- جداول مناسبة للطباعة
- دعم
blockquote - تنسيق خاص لكتل الأكواد
- التطبيق يعتمد على اتصال إنترنت إذا كنت تستخدم خطوطاً أو أصولاً خارجية أثناء التصيير.
- مسار
/download/:jobIdخاص بنتيجة التحويل المؤقتة. - مسار
/api/files/:id/downloadخاص بالملفات المحفوظة للمستخدمين.

