@digicole/pdfmake-rtl 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,675 @@
1
+ # PDFMake RTL [![npm version](https://badge.fury.io/js/@digicole/pdfmake-rtl.svg)](https://badge.fury.io/js/@digicole/pdfmake-rtl) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
2
+
3
+ **PDFMake RTL** is an enhanced version of PDFMake with **automatic RTL (Right-to-Left) language support** for Arabic, Persian (Farsi), Urdu, and other RTL scripts. No manual configuration needed - just write your content and the library automatically detects and handles RTL text!
4
+
5
+ ## 🚀 Key Features
6
+
7
+ - ✅ **Automatic RTL Detection** - No need to set `supportRTL` flags
8
+ - ✅ **Smart Table Column Reversal** - Arabic/Persian/Urdu tables automatically reverse columns
9
+ - ✅ **Unicode Script Detection** - Supports Arabic, Persian, Urdu, and extensions
10
+ - ✅ **Automatic Font Selection** - Uses appropriate fonts per language
11
+ - ✅ **Proper Text Alignment** - RTL text aligns right, LTR text aligns left
12
+ - ✅ **List Bullet Positioning** - Bullets positioned correctly for RTL lists
13
+ - ✅ **Mixed Content Support** - Handles Arabic/Persian/Urdu/English mixed content
14
+ - ✅ **100% PDFMake Compatible** - Drop-in replacement for PDFMake
15
+
16
+ ## 📦 Installation
17
+
18
+ ```bash
19
+ npm install @digicole/pdfmake-rtl
20
+ ```
21
+
22
+ ## 🎯 Quick Start
23
+
24
+ ```javascript
25
+ const PdfPrinter = require('@digicole/pdfmake-rtl');
26
+
27
+ const fonts = {
28
+ Roboto: {
29
+ normal: './fonts/Roboto-Regular.ttf',
30
+ bold: './fonts/Roboto-Medium.ttf',
31
+ },
32
+ Amiri: {
33
+ normal: './fonts/Amiri-Regular.ttf',
34
+ bold: './fonts/Amiri-Bold.ttf',
35
+ }
36
+ };
37
+
38
+ const printer = new PdfPrinter(fonts);
39
+
40
+ const docDefinition = {
41
+ content: [
42
+ // English text - automatically aligned left
43
+ 'This English text will automatically align left',
44
+
45
+ // Arabic text - automatically aligned right
46
+ 'هذا النص العربي سيظهر تلقائياً من اليمين إلى اليسار',
47
+
48
+ // Arabic table - columns automatically reversed
49
+ {
50
+ table: {
51
+ body: [
52
+ ['الاسم الأول', 'الاسم الأخير', 'العمر'],
53
+ ['أحمد', 'محمد', '٢٥'],
54
+ ['فاطمة', 'علي', '٣٠']
55
+ ]
56
+ }
57
+ }
58
+ ]
59
+ };
60
+
61
+ const pdfDoc = printer.createPdfKitDocument(docDefinition);
62
+ pdfDoc.pipe(fs.createWriteStream('document.pdf'));
63
+ pdfDoc.end();
64
+ ```
65
+
66
+ ## 🌍 Language Support
67
+
68
+ ### Automatically Detected Scripts
69
+
70
+ | Language | Unicode Range | Status |
71
+ |----------|---------------|--------|
72
+ | Arabic | U+0600–U+06FF | ✅ |
73
+ | Persian (Farsi) | U+06A9–U+06AF, U+06C0–U+06C3 | ✅ |
74
+ | Urdu | U+0679, U+067E, U+0686, U+0688, U+0691, U+0698, U+06A9, U+06BA, U+06BB, U+06BE, U+06C1, U+06C3, U+06CC, U+06D2, U+06D3 | ✅ |
75
+ | Arabic Supplement | U+0750–U+077F | ✅ |
76
+ | Arabic Extended-A | U+08A0–U+08FF | ✅ |
77
+ | Arabic Presentation Forms | U+FB50–U+FDFF, U+FE70–U+FEFF | ✅ |
78
+ | Persian/Urdu Special Chars | U+200C–U+200D (ZWNJ/ZWJ) | ✅ |
79
+
80
+ ## 🎨 Language-Specific Examples
81
+
82
+ ### Arabic Document
83
+ ```javascript
84
+ const arabicDoc = {
85
+ content: [
86
+ { text: 'تقرير شهري', style: 'title' },
87
+ { text: 'إعداد: أحمد محمد', style: 'subtitle' },
88
+ {
89
+ table: {
90
+ widths: ['*', '*', '*'],
91
+ body: [
92
+ ['الاسم', 'المنصب', 'الراتب'],
93
+ ['أحمد علي', 'مطور', '٥٠٠٠'],
94
+ ['فاطمة حسن', 'مديرة', '٧٠٠٠']
95
+ ]
96
+ }
97
+ },
98
+ {
99
+ ul: [
100
+ 'النقطة الأولى',
101
+ 'النقطة الثانية',
102
+ 'النقطة الثالثة'
103
+ ]
104
+ }
105
+ ]
106
+ };
107
+ ```
108
+
109
+ ### Long Text Table Example
110
+ ```javascript
111
+ const longTextTableDoc = {
112
+ content: [
113
+ { text: 'تقرير مفصل - گزارش تفصیلی - تفصیلی رپورٹ', style: 'title' },
114
+
115
+ // Table with long text content - automatic text wrapping and RTL alignment
116
+ {
117
+ table: {
118
+ widths: ['25%', '35%', '40%'],
119
+ headerRows: 1,
120
+ body: [
121
+ // Headers
122
+ [
123
+ { text: 'القسم\nDepartment\nشعبہ', style: 'tableHeader' },
124
+ { text: 'الوصف المفصل\nDetailed Description\nتفصیلی تشریح', style: 'tableHeader' },
125
+ { text: 'الملاحظات والتوصيات\nNotes & Recommendations\nنوٹس اور سفارشات', style: 'tableHeader' }
126
+ ],
127
+
128
+ // Arabic row with long content
129
+ [
130
+ 'قسم تطوير البرمجيات',
131
+ 'هذا القسم مسؤول عن تطوير وصيانة جميع التطبيقات والأنظمة البرمجية المستخدمة في الشركة، بما في ذلك أنظمة إدارة قواعد البيانات وتطبيقات الويب والتطبيقات المحمولة',
132
+ 'يُنصح بزيادة عدد المطورين في هذا القسم نظراً للزيادة المتوقعة في المشاريع خلال العام القادم. كما يُفضل الاستثمار في التدريب على التقنيات الحديثة مثل الذكاء الاصطناعي والحوسبة السحابية'
133
+ ],
134
+
135
+ // Persian row with long content
136
+ [
137
+ 'بخش توسعه نرم‌افزار',
138
+ 'این بخش مسئول توسعه و نگهداری تمام برنامه‌ها و سیستم‌های نرم‌افزاری مورد استفاده در شرکت است، از جمله سیستم‌های مدیریت پایگاه داده، برنامه‌های وب و برنامه‌های موبایل',
139
+ 'توصیه می‌شود تعداد توسعه‌دهندگان در این بخش افزایش یابد با توجه به افزایش مورد انتظار پروژه‌ها در سال آینده. همچنین بهتر است روی آموزش تکنولوژی‌های جدید مانند هوش مصنوعی و رایانش ابری سرمایه‌گذاری شود'
140
+ ],
141
+
142
+ // Urdu row with long content
143
+ [
144
+ 'سافٹ ویئر ڈیولپمنٹ شعبہ',
145
+ 'یہ شعبہ کمپنی میں استعمال ہونے والے تمام ایپلیکیشنز اور سافٹ ویئر سسٹمز کی ترقی اور دیکھ بھال کا ذمہ دار ہے، جن میں ڈیٹا بیس مینجمنٹ سسٹمز، ویب ایپلیکیشنز اور موبائل ایپلیکیشنز شامل ہیں',
146
+ 'آئندہ سال متوقع پروجیکٹس میں اضافے کے پیش نظر اس شعبے میں ڈیولپرز کی تعداد بڑھانے کی سفارش کی جاتی ہے۔ نیز جدید ٹیکنالوجیز جیسے مصنوعی ذہانت اور کلاؤڈ کمپیوٹنگ کی تربیت میں سرمایہ کاری کرنا بہتر ہوگا'
147
+ ],
148
+
149
+ // Mixed languages row
150
+ [
151
+ 'Quality Assurance\nضمان الجودة\nتضمین کیفیت\nکوالٹی ایشورنس',
152
+ 'This department ensures software quality through comprehensive testing. يضمن هذا القسم جودة البرمجيات من خلال الاختبار الشامل. این بخش از طریق تست جامع کیفیت نرم‌افزار را تضمین می‌کند. یہ شعبہ جامع ٹیسٹنگ کے ذریعے سافٹ ویئر کی کوالٹی کو یقینی بناتا ہے۔',
153
+ 'Implement automated testing frameworks. تنفيذ إطارات الاختبار التلقائية. چارچوب‌های تست خودکار را پیاده‌سازی کنید. خودکار ٹیسٹنگ فریم ورک کو نافذ کریں۔'
154
+ ]
155
+ ]
156
+ },
157
+ layout: {
158
+ hLineWidth: function (i, node) {
159
+ return (i === 0 || i === node.table.body.length) ? 2 : 1;
160
+ },
161
+ vLineWidth: function (i, node) {
162
+ return (i === 0 || i === node.table.widths.length) ? 2 : 1;
163
+ },
164
+ hLineColor: function (i, node) {
165
+ return (i === 0 || i === node.table.body.length) ? 'black' : 'gray';
166
+ },
167
+ vLineColor: function (i, node) {
168
+ return (i === 0 || i === node.table.widths.length) ? 'black' : 'gray';
169
+ }
170
+ }
171
+ },
172
+
173
+ // Performance metrics table with numeric data
174
+ {
175
+ text: 'مقاييس الأداء - معیارهای عملکرد - کارکردگی کے معیار',
176
+ style: 'sectionHeader',
177
+ margin: [0, 20, 0, 10]
178
+ },
179
+ {
180
+ table: {
181
+ widths: ['*', '*', '*', '*'],
182
+ body: [
183
+ ['المقياس\nMetric\nمعیار', 'الهدف\nTarget\nہدف', 'الفعلي\nActual\nحقیقی', 'التقييم\nEvaluation\nتشخیص'],
184
+ ['نسبة إنجاز المشاريع\nProject Completion Rate\nپروجیکٹ تکمیل کی شرح', '٩٠٪', '٨٥٪', 'جيد - Good - اچھا'],
185
+ ['رضا العملاء\nCustomer Satisfaction\nکسٹمر کی اطمینان', '٩٥٪', '٩٨٪', 'ممتاز - Excellent - بہترین'],
186
+ ['زمن الاستجابة\nResponse Time\nجوابی وقت', '< ٢ ساعة\n< 2 hours\n< ۲ گھنٹے', '١.٥ ساعة\n1.5 hours\n۱.۵ گھنٹے', 'ممتاز - Excellent - بہترین']
187
+ ]
188
+ }
189
+ }
190
+ ],
191
+
192
+ styles: {
193
+ title: {
194
+ fontSize: 22,
195
+ bold: true,
196
+ margin: [0, 0, 0, 20],
197
+ alignment: 'center'
198
+ },
199
+ sectionHeader: {
200
+ fontSize: 16,
201
+ bold: true,
202
+ color: '#2c3e50'
203
+ },
204
+ tableHeader: {
205
+ bold: true,
206
+ fontSize: 12,
207
+ color: 'white',
208
+ fillColor: '#3498db'
209
+ }
210
+ },
211
+
212
+ defaultStyle: {
213
+ fontSize: 10,
214
+ lineHeight: 1.3
215
+ }
216
+ };
217
+ ```
218
+
219
+ ### Persian (Farsi) Document
220
+ ```javascript
221
+ const persianDoc = {
222
+ content: [
223
+ { text: 'گزارش ماهانه', style: 'title' },
224
+ { text: 'تهیه کننده: علی احمدی', style: 'subtitle' },
225
+ {
226
+ table: {
227
+ widths: ['*', '*', '*'],
228
+ body: [
229
+ ['نام', 'سمت', 'حقوق'],
230
+ ['علی رضا', 'برنامه نویس', '۵۰۰۰'],
231
+ ['فاطمه کریمی', 'مدیر', '۷۰۰۰']
232
+ ]
233
+ }
234
+ },
235
+ {
236
+ ol: [
237
+ 'مورد اول',
238
+ 'مورد دوم',
239
+ 'مورد سوم'
240
+ ]
241
+ }
242
+ ]
243
+ };
244
+ ```
245
+
246
+ ### Urdu Document
247
+ ```javascript
248
+ const urduDoc = {
249
+ content: [
250
+ { text: 'ماہانہ رپورٹ', style: 'title' },
251
+ { text: 'تیار کنندہ: احمد علی', style: 'subtitle' },
252
+ {
253
+ table: {
254
+ widths: ['*', '*', '*'],
255
+ body: [
256
+ ['نام', 'عہدہ', 'تنخواہ'],
257
+ ['احمد حسن', 'ڈویلپر', '۵۰۰۰'],
258
+ ['فاطمہ خان', 'منیجر', '۷۰۰۰']
259
+ ]
260
+ }
261
+ },
262
+ {
263
+ ul: [
264
+ 'پہلا نکتہ',
265
+ 'دوسرا نکتہ',
266
+ 'تیسرا نکتہ'
267
+ ]
268
+ }
269
+ ]
270
+ };
271
+ ```
272
+
273
+ ### Mixed Languages Document
274
+ ```javascript
275
+ const multilingualDoc = {
276
+ content: [
277
+ // Headers in all languages
278
+ { text: 'Project Report - تقرير المشروع - گزارش پروژه - پروجیکٹ رپورٹ', style: 'title' },
279
+
280
+ // Multi-language table
281
+ {
282
+ table: {
283
+ widths: ['*', '*', '*', '*'],
284
+ body: [
285
+ ['English', 'العربية', 'فارسی', 'اردو'],
286
+ ['Name', 'الاسم', 'نام', 'نام'],
287
+ ['Project', 'المشروع', 'پروژه', 'منصوبہ'],
288
+ ['Report', 'التقرير', 'گزارش', 'رپورٹ'],
289
+ ['Complete', 'مكتمل', 'کامل', 'مکمل']
290
+ ]
291
+ }
292
+ },
293
+
294
+ // Mixed content paragraphs
295
+ { text: 'Status: مكتمل - کامل - مکمل (Complete)', margin: [0, 10] },
296
+ { text: 'Team: الفريق - تیم - ٹیم (Team Members)', margin: [0, 10] }
297
+ ]
298
+ };
299
+ ```
300
+
301
+ ### Advanced Long Text Table with Page Breaks
302
+ ```javascript
303
+ const advancedLongTableDoc = {
304
+ content: [
305
+ { text: 'تقرير شامل للمشاريع - جامع پروژه رپورٹ', style: 'mainTitle' },
306
+
307
+ // Large table that spans multiple pages with long text content
308
+ {
309
+ table: {
310
+ headerRows: 2,
311
+ widths: ['15%', '25%', '30%', '30%'],
312
+ body: [
313
+ // Main header
314
+ [
315
+ { text: 'المشروع\nProject\nپروژه', style: 'headerStyle', rowSpan: 2 },
316
+ { text: 'التفاصيل الفنية\nTechnical Details\nتکنیکی تفصیلات', style: 'headerStyle', colSpan: 2 },
317
+ {},
318
+ { text: 'الحالة والملاحظات\nStatus & Notes\nحالت اور نوٹس', style: 'headerStyle', rowSpan: 2 }
319
+ ],
320
+ // Sub header
321
+ [
322
+ {},
323
+ { text: 'التقنيات المستخدمة\nTechnologies\nٹیکنالوجیز', style: 'subHeaderStyle' },
324
+ { text: 'المتطلبات والمواصفات\nRequirements\nضروریات', style: 'subHeaderStyle' },
325
+ {}
326
+ ],
327
+
328
+ // Project 1 - Very long content
329
+ [
330
+ 'نظام إدارة المحتوى الإلكتروني\n\nContent Management System\n\nمواد کا نظام',
331
+ 'تم تطوير هذا النظام باستخدام تقنيات حديثة مثل React.js للواجهة الأمامية و Node.js للخادم الخلفي، مع استخدام قاعدة بيانات MongoDB لتخزين البيانات بكفاءة عالية.\n\nDeveloped using modern technologies including React.js for frontend and Node.js for backend, with MongoDB database for efficient data storage.\n\nجدید ٹیکنالوجیز جیسے React.js فرنٹ اینڈ کے لیے اور Node.js بیک اینڈ کے لیے استعمال کرکے تیار کیا گیا، ڈیٹا کو مؤثر طریقے سے محفوظ کرنے کے لیے MongoDB ڈیٹابیس کا استعمال کیا گیا۔',
332
+ 'يجب أن يدعم النظام ما لا يقل عن ١٠٠٠ مستخدم متزامن، مع إمكانية رفع ملفات بحجم يصل إلى ١٠٠ ميجابايت، وتوفير واجهات برمجة تطبيقات RESTful للتكامل مع الأنظمة الأخرى.\n\nSystem must support at least 1000 concurrent users, file uploads up to 100MB, and provide RESTful APIs for integration.\n\nسسٹم کو کم از کم ۱۰۰۰ بیک وقت صارفین کی حمایت کرنی چاہیے، ۱۰۰ میگابائٹ تک فائل اپ لوڈ، اور انٹیگریشن کے لیے RESTful APIs فراہم کرنا چاہیے۔',
333
+ 'المشروع مكتمل بنسبة ٩٥٪ ويتوقع إطلاقه في نهاية هذا الشهر. تم اجتياز جميع اختبارات الأداء والأمان بنجاح.\n\nProject is 95% complete and expected to launch by end of month. All performance and security tests passed successfully.\n\nپروجیکٹ ۹۵٪ مکمل ہے اور اس مہینے کے آخر تک لانچ ہونے کی توقع ہے۔ تمام کارکردگی اور سیکیورٹی ٹیسٹ کامیابی سے پاس ہوئے۔'
334
+ ],
335
+
336
+ // Project 2
337
+ [
338
+ 'تطبيق التجارة الإلكترونية\n\nE-commerce Application\n\nای کامرس ایپلیکیشن',
339
+ 'يستخدم التطبيق تقنيات متقدمة مثل Vue.js و Express.js مع قاعدة بيانات PostgreSQL وخدمات الدفع الآمنة مثل Stripe و PayPal.\n\nApplication uses advanced technologies like Vue.js and Express.js with PostgreSQL database and secure payment services like Stripe and PayPal.\n\nایپلیکیشن جدید ٹیکنالوجیز جیسے Vue.js اور Express.js استعمال کرتی ہے PostgreSQL ڈیٹابیس اور محفوظ پیمنٹ سروسز جیسے Stripe اور PayPal کے ساتھ۔',
340
+ 'التطبيق يحتاج إلى دعم عدة عملات ولغات، مع نظام إدارة المخزون المتقدم وتتبع الطلبات في الوقت الفعلي، بالإضافة إلى تحليلات مفصلة للمبيعات.\n\nApplication needs multi-currency and multi-language support, advanced inventory management, real-time order tracking, and detailed sales analytics.\n\nایپلیکیشن کو کئی کرنسیوں اور زبانوں کی حمایت، ایڈوانسڈ انوینٹری منیجمنٹ، ریئل ٹائم آرڈر ٹریکنگ، اور تفصیلی سیلز ایڈالٹکس کی ضرورت ہے۔',
341
+ 'التطوير في المرحلة النهائية مع اكتمال ٨٥٪ من الوظائف الأساسية. يجري حالياً اختبار نظام الدفع والأمان.\n\nDevelopment in final phase with 85% of core features complete. Currently testing payment system and security.\n\nبنیادی فیچرز کے ۸۵٪ مکمل ہونے کے ساتھ ڈیولپمنٹ حتمی مرحلے میں ہے۔ فی الوقت پیمنٹ سسٹم اور سیکیورٹی کو ٹیسٹ کیا جا رہا ہے۔'
342
+ ],
343
+
344
+ // Project 3
345
+ [
346
+ 'نظام إدارة الموارد البشرية\n\nHR Management System\n\nHR منیجمنٹ سسٹم',
347
+ 'النظام مبني على تقنيات السحابة مع استخدام Docker للنشر و Kubernetes للتوسع التلقائي، مع قاعدة بيانات MySQL المحسنة للأداء العالي.\n\nSystem built on cloud technologies using Docker for deployment and Kubernetes for auto-scaling, with optimized MySQL database for high performance.\n\nسسٹم کلاؤڈ ٹیکنالوجیز پر بنایا گیا ہے Docker کا استعمال کرتے ہوئے deployment کے لیے اور Kubernetes auto-scaling کے لیے، high performance کے لیے optimized MySQL database کے ساتھ۔',
348
+ 'يجب أن يتضمن النظام إدارة الحضور والانصراف، حساب الرواتب التلقائي، تقييم الأداء، وإدارة الإجازات مع التكامل مع أنظمة المحاسبة الموجودة.\n\nSystem must include attendance management, automatic payroll calculation, performance evaluation, and leave management with integration to existing accounting systems.\n\nسسٹم میں حاضری کا نظام، خودکار تنخواہ کیلکولیشن، کارکردگی کی تشخیص، اور چھٹی کا نظام شامل ہونا چاہیے موجودہ اکاؤنٹنگ سسٹمز کے ساتھ انٹیگریشن کے ساتھ۔',
349
+ 'المشروع في مرحلة التطوير المتوسطة مع اكتمال ٦٠٪ من المتطلبات. تم إنهاء تصميم قاعدة البيانات وواجهات المستخدم.\n\nProject in middle development phase with 60% of requirements complete. Database design and user interfaces completed.\n\nپروجیکٹ درمیانی ڈیولپمنٹ مرحلے میں ہے ۶۰٪ ضروریات مکمل کے ساتھ۔ ڈیٹابیس ڈیزائن اور یوزر انٹرفیسز مکمل۔'
350
+ ]
351
+ ]
352
+ },
353
+ layout: {
354
+ hLineWidth: function (i, node) {
355
+ if (i === 0 || i === node.table.body.length) return 2;
356
+ if (i === 2) return 1.5; // After header
357
+ return 0.5;
358
+ },
359
+ vLineWidth: function (i, node) {
360
+ return (i === 0 || i === node.table.widths.length) ? 2 : 1;
361
+ },
362
+ hLineColor: function (i, node) {
363
+ return (i === 0 || i === node.table.body.length) ? '#2c3e50' : '#bdc3c7';
364
+ },
365
+ vLineColor: function (i, node) {
366
+ return (i === 0 || i === node.table.widths.length) ? '#2c3e50' : '#bdc3c7';
367
+ },
368
+ paddingLeft: function(i, node) { return 8; },
369
+ paddingRight: function(i, node) { return 8; },
370
+ paddingTop: function(i, node) { return 6; },
371
+ paddingBottom: function(i, node) { return 6; }
372
+ }
373
+ }
374
+ ],
375
+
376
+ styles: {
377
+ mainTitle: {
378
+ fontSize: 24,
379
+ bold: true,
380
+ margin: [0, 0, 0, 30],
381
+ alignment: 'center',
382
+ color: '#2c3e50'
383
+ },
384
+ headerStyle: {
385
+ bold: true,
386
+ fontSize: 12,
387
+ color: 'white',
388
+ fillColor: '#3498db',
389
+ alignment: 'center'
390
+ },
391
+ subHeaderStyle: {
392
+ bold: true,
393
+ fontSize: 10,
394
+ color: 'white',
395
+ fillColor: '#5dade2',
396
+ alignment: 'center'
397
+ }
398
+ },
399
+
400
+ defaultStyle: {
401
+ fontSize: 9,
402
+ lineHeight: 1.4
403
+ },
404
+
405
+ pageMargins: [40, 60, 40, 60]
406
+ };
407
+ ```
408
+
409
+ ## 🔄 Migration from PDFMake
410
+
411
+ This is a **drop-in replacement** for PDFMake:
412
+
413
+ ```javascript
414
+ // Before
415
+ const PdfPrinter = require('pdfmake');
416
+
417
+ // After
418
+ const PdfPrinter = require('@digicole/pdfmake-rtl');
419
+ ```
420
+
421
+ All existing PDFMake code works unchanged, with automatic RTL support added!
422
+
423
+ ## 💻 Client-Side Usage
424
+
425
+ ### Browser Integration
426
+
427
+ Include the RTL-enabled PDFMake in your HTML:
428
+
429
+ ```html
430
+ <!DOCTYPE html>
431
+ <html>
432
+ <head>
433
+ <title>PDFMake RTL Client Example</title>
434
+ <script src="https://unpkg.com/@digicole/pdfmake-rtl/build/pdfmake.min.js"></script>
435
+ <script src="https://unpkg.com/@digicole/pdfmake-rtl/build/vfs_fonts.js"></script>
436
+ </head>
437
+ <body>
438
+ <script>
439
+ // Arabic/Persian/Urdu content with automatic RTL detection
440
+ const docDefinition = {
441
+ content: [
442
+ // English text (auto-detected as LTR)
443
+ { text: 'English Title', style: 'header' },
444
+
445
+ // Arabic text (auto-detected as RTL)
446
+ { text: 'العنوان العربي', style: 'header' },
447
+
448
+ // Persian text (auto-detected as RTL)
449
+ { text: 'عنوان فارسی', style: 'header' },
450
+
451
+ // Urdu text (auto-detected as RTL)
452
+ { text: 'اردو عنوان', style: 'header' },
453
+
454
+ // Mixed content table (auto-detects direction per cell)
455
+ {
456
+ table: {
457
+ widths: ['*', '*', '*'],
458
+ body: [
459
+ ['Name', 'الاسم', 'نام'], // Headers
460
+ ['Ahmed', 'أحمد', 'احمد'], // Arabic/Persian names
461
+ ['Fatima', 'فاطمة', 'فاطمہ'], // Mixed scripts
462
+ ['Hassan', 'حسن', 'حسن'] // Common across languages
463
+ ]
464
+ }
465
+ },
466
+
467
+ // RTL list (bullets auto-positioned)
468
+ {
469
+ ul: [
470
+ 'Arabic: العنصر الأول',
471
+ 'Persian: مورد اول',
472
+ 'Urdu: پہلا آئٹم',
473
+ 'Mixed: Item واحد'
474
+ ]
475
+ }
476
+ ],
477
+
478
+ styles: {
479
+ header: {
480
+ fontSize: 18,
481
+ bold: true,
482
+ margin: [0, 0, 0, 10]
483
+ }
484
+ }
485
+ };
486
+
487
+ // Generate and download PDF
488
+ function createPDF() {
489
+ pdfMake.createPdf(docDefinition).download('rtl-document.pdf');
490
+ }
491
+
492
+ // Or open in new window
493
+ function openPDF() {
494
+ pdfMake.createPdf(docDefinition).open();
495
+ }
496
+ </script>
497
+
498
+ <button onclick="createPDF()">Download RTL PDF</button>
499
+ <button onclick="openPDF()">Open RTL PDF</button>
500
+ </body>
501
+ </html>
502
+ ```
503
+
504
+ ### Advanced Client-Side Features
505
+
506
+ ```javascript
507
+ // Custom font configuration for better RTL support
508
+ pdfMake.fonts = {
509
+ Roboto: {
510
+ normal: 'https://fonts.googleapis.com/css2?family=Roboto',
511
+ bold: 'https://fonts.googleapis.com/css2?family=Roboto:wght@700'
512
+ },
513
+ Amiri: {
514
+ normal: 'https://fonts.googleapis.com/css2?family=Amiri',
515
+ bold: 'https://fonts.googleapis.com/css2?family=Amiri:wght@700'
516
+ },
517
+ Vazir: { // Persian font
518
+ normal: 'https://fonts.googleapis.com/css2?family=Vazir',
519
+ bold: 'https://fonts.googleapis.com/css2?family=Vazir:wght@700'
520
+ }
521
+ };
522
+
523
+ // RTL-aware document with automatic detection
524
+ const advancedDoc = {
525
+ content: [
526
+ // Automatic language detection and appropriate styling
527
+ {
528
+ text: 'تقرير شهري - گزارش ماهانه - ماہانہ رپورٹ',
529
+ style: 'title',
530
+ // RTL auto-detected, right-aligned automatically
531
+ },
532
+
533
+ // Dynamic content with RTL detection
534
+ {
535
+ columns: [
536
+ {
537
+ width: '*',
538
+ text: [
539
+ 'Statistics:\n',
540
+ 'المبيعات: ١٢٣٤\n', // Arabic
541
+ 'فروش: ۱۲۳۴\n', // Persian
542
+ 'فروخت: ۱۲۳۴' // Urdu
543
+ ]
544
+ },
545
+ {
546
+ width: '*',
547
+ text: [
548
+ 'Performance:\n',
549
+ 'الأداء: ممتاز\n', // Arabic
550
+ 'عملکرد: عالی\n', // Persian
551
+ 'کارکردگی: بہترین' // Urdu
552
+ ]
553
+ }
554
+ ]
555
+ }
556
+ ],
557
+
558
+ styles: {
559
+ title: {
560
+ fontSize: 20,
561
+ bold: true,
562
+ margin: [0, 0, 0, 20]
563
+ // alignment automatically set based on content direction
564
+ }
565
+ },
566
+
567
+ defaultStyle: {
568
+ // RTL languages get Amiri/Vazir, LTR gets Roboto automatically
569
+ font: 'Roboto'
570
+ }
571
+ };
572
+ ```
573
+
574
+ ### React/Vue Integration
575
+
576
+ ```javascript
577
+ // React component example
578
+ import pdfMake from '@digicole/pdfmake-rtl/build/pdfmake';
579
+ import pdfFonts from '@digicole/pdfmake-rtl/build/vfs_fonts';
580
+
581
+ pdfMake.vfs = pdfFonts.pdfMake.vfs;
582
+
583
+ const RTLPDFGenerator = () => {
584
+ const generateRTLReport = () => {
585
+ const docDef = {
586
+ content: [
587
+ { text: 'تقرير المشروع', style: 'header' }, // Arabic
588
+ { text: 'گزارش پروژه', style: 'header' }, // Persian
589
+ { text: 'منصوبہ رپورٹ', style: 'header' }, // Urdu
590
+
591
+ // Auto-detecting table
592
+ {
593
+ table: {
594
+ body: [
595
+ ['المرحلة', 'مرحله', 'مرحلہ', 'Status'],
596
+ ['التخطيط', 'طراحی', 'منصوبہ بندی', 'Complete'],
597
+ ['التنفيذ', 'اجرا', 'عمل درآمد', 'In Progress'],
598
+ ['الاختبار', 'تست', 'جانچ', 'Pending']
599
+ ]
600
+ }
601
+ }
602
+ ]
603
+ };
604
+
605
+ pdfMake.createPdf(docDef).open();
606
+ };
607
+
608
+ return <button onClick={generateRTLReport}>Generate RTL Report</button>;
609
+ };
610
+ ```
611
+
612
+
613
+ PDF document generation library for server-side and client-side usage in pure JavaScript.
614
+
615
+ Check out [the playground](http://bpampuch.github.io/pdfmake/playground.html) and [examples](https://github.com/bpampuch/pdfmake/tree/0.1/examples).
616
+
617
+ ### Features
618
+
619
+ * line-wrapping,
620
+ * text-alignments (left, right, centered, justified),
621
+ * numbered and bulleted lists,
622
+ * tables and columns
623
+ * auto/fixed/star-sized widths,
624
+ * col-spans and row-spans,
625
+ * headers automatically repeated in case of a page-break,
626
+ * images and vector graphics,
627
+ * convenient styling and style inheritance,
628
+ * page headers and footers:
629
+ * static or dynamic content,
630
+ * access to current page number and page count,
631
+ * background-layer,
632
+ * page dimensions and orientations,
633
+ * margins,
634
+ * custom page breaks,
635
+ * font embedding,
636
+ * support for complex, multi-level (nested) structures,
637
+ * table of contents,
638
+ * helper methods for opening/printing/downloading the generated PDF,
639
+ * setting of PDF metadata (e.g. author, subject).
640
+
641
+ ## Documentation
642
+
643
+ Documentation URL: https://pdfmake.github.io/docs/
644
+
645
+ ## Building from sources version 0.2.x
646
+
647
+ using npm:
648
+ ```
649
+ git clone --branch 0.2 https://github.com/bpampuch/pdfmake.git
650
+ cd pdfmake
651
+ npm install
652
+ npm run build
653
+ ```
654
+
655
+ using yarn:
656
+ ```
657
+ git clone --branch 0.2 https://github.com/bpampuch/pdfmake.git
658
+ cd pdfmake
659
+ yarn
660
+ yarn run build
661
+ ```
662
+
663
+ ## License
664
+ MIT
665
+
666
+ ## Authors pdfmake-rtl
667
+ *[@aysnet1](httpss://github.com/aysnet1)
668
+
669
+ ## Authors pdfmake
670
+ * [@bpampuch](https://github.com/bpampuch) (founder)
671
+ * [@liborm85](https://github.com/liborm85)
672
+
673
+ pdfmake is based on a truly amazing library [pdfkit](https://github.com/devongovett/pdfkit) (credits to [@devongovett](https://github.com/devongovett)).
674
+
675
+ Thanks to all contributors.