@digicole/pdfmake-rtl 1.2.0 → 2.1.1

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.
Files changed (100) hide show
  1. package/.vscode/tasks.json +17 -0
  2. package/CHANGELOG.md +83 -128
  3. package/LICENSE +22 -22
  4. package/README.md +188 -681
  5. package/build/fonts/Cairo/Cairo-Black.ttf +0 -0
  6. package/build/fonts/Cairo/Cairo-Bold.ttf +0 -0
  7. package/build/fonts/Cairo/Cairo-ExtraLight.ttf +0 -0
  8. package/build/fonts/Cairo/Cairo-Light.ttf +0 -0
  9. package/build/fonts/Cairo/Cairo-Regular.ttf +0 -0
  10. package/build/fonts/Cairo/Cairo-SemiBold.ttf +0 -0
  11. package/build/fonts/Cairo.js +27 -0
  12. package/build/fonts/Roboto/Roboto-Italic.ttf +0 -0
  13. package/build/fonts/Roboto/Roboto-Medium.ttf +0 -0
  14. package/build/fonts/Roboto/Roboto-MediumItalic.ttf +0 -0
  15. package/build/fonts/Roboto/Roboto-Regular.ttf +0 -0
  16. package/build/fonts/Roboto.js +27 -0
  17. package/build/pdfmake.js +63736 -71285
  18. package/build/pdfmake.js.map +1 -1
  19. package/build/pdfmake.min.js +2 -2
  20. package/build/pdfmake.min.js.map +1 -1
  21. package/build/standard-fonts/Courier.js +27 -0
  22. package/build/standard-fonts/Helvetica.js +27 -0
  23. package/build/standard-fonts/Symbol.js +21 -0
  24. package/build/standard-fonts/Times.js +27 -0
  25. package/build/standard-fonts/ZapfDingbats.js +21 -0
  26. package/build/vfs_fonts.js +11 -7
  27. package/build-vfs.js +44 -44
  28. package/fonts/Cairo/Cairo-Black.ttf +0 -0
  29. package/fonts/Cairo/Cairo-Bold.ttf +0 -0
  30. package/fonts/Cairo/Cairo-ExtraLight.ttf +0 -0
  31. package/fonts/Cairo/Cairo-Light.ttf +0 -0
  32. package/fonts/Cairo/Cairo-Regular.ttf +0 -0
  33. package/fonts/Cairo/Cairo-SemiBold.ttf +0 -0
  34. package/fonts/Cairo.js +8 -0
  35. package/fonts/Roboto/Roboto-Italic.ttf +0 -0
  36. package/fonts/Roboto/Roboto-Medium.ttf +0 -0
  37. package/fonts/Roboto/Roboto-MediumItalic.ttf +0 -0
  38. package/fonts/Roboto/Roboto-Regular.ttf +0 -0
  39. package/fonts/Roboto.js +8 -0
  40. package/index.js +26 -26
  41. package/package.json +42 -39
  42. package/src/3rd-party/svg-to-pdfkit/LICENSE +9 -9
  43. package/src/3rd-party/svg-to-pdfkit/source.js +229 -36
  44. package/src/3rd-party/svg-to-pdfkit.js +3 -3
  45. package/src/OutputDocument.js +64 -0
  46. package/src/OutputDocumentServer.js +32 -0
  47. package/src/PDFDocument.js +174 -0
  48. package/src/PageSize.js +53 -0
  49. package/src/Renderer.js +445 -0
  50. package/src/TextBreaker.js +168 -0
  51. package/src/TextInlines.js +263 -0
  52. package/src/URLResolver.js +43 -0
  53. package/src/base.js +70 -0
  54. package/src/browser-extensions/OutputDocumentBrowser.js +80 -0
  55. package/src/browser-extensions/fonts/Cairo.js +27 -0
  56. package/src/browser-extensions/fonts/Roboto.js +27 -0
  57. package/src/browser-extensions/index.js +61 -0
  58. package/src/browser-extensions/pdfMake.js +1 -355
  59. package/src/browser-extensions/standard-fonts/Courier.js +27 -0
  60. package/src/browser-extensions/standard-fonts/Helvetica.js +27 -0
  61. package/src/browser-extensions/standard-fonts/Symbol.js +21 -0
  62. package/src/browser-extensions/standard-fonts/Times.js +27 -0
  63. package/src/browser-extensions/standard-fonts/ZapfDingbats.js +21 -0
  64. package/src/browser-extensions/virtual-fs-cjs.js +1 -0
  65. package/src/columnCalculator.js +154 -157
  66. package/src/docMeasure.js +802 -810
  67. package/src/docPreprocessor.js +306 -273
  68. package/src/documentContext.js +345 -340
  69. package/src/elementWriter.js +736 -411
  70. package/src/helpers/node.js +136 -0
  71. package/src/helpers/tools.js +44 -0
  72. package/src/helpers/variableType.js +50 -0
  73. package/src/index.js +16 -0
  74. package/src/layoutBuilder.js +1393 -1197
  75. package/src/line.js +122 -104
  76. package/src/pageElementWriter.js +187 -174
  77. package/src/printer.js +370 -727
  78. package/src/qrEnc.js +796 -791
  79. package/src/rtlUtils.js +500 -485
  80. package/src/standardPageSizes.js +52 -54
  81. package/src/styleContextStack.js +208 -138
  82. package/src/svgMeasure.js +109 -70
  83. package/src/tableLayouts.js +100 -0
  84. package/src/tableProcessor.js +620 -606
  85. package/src/textDecorator.js +175 -157
  86. package/src/virtual-fs.js +66 -0
  87. package/standard-fonts/Courier.js +8 -0
  88. package/standard-fonts/Helvetica.js +8 -0
  89. package/standard-fonts/Symbol.js +5 -0
  90. package/standard-fonts/Times.js +8 -0
  91. package/standard-fonts/ZapfDingbats.js +5 -0
  92. package/index.html +0 -396
  93. package/src/browser-extensions/URLBrowserResolver.js +0 -96
  94. package/src/browser-extensions/virtual-fs.js +0 -55
  95. package/src/fontProvider.js +0 -68
  96. package/src/helpers.js +0 -138
  97. package/src/imageMeasure.js +0 -62
  98. package/src/pdfKitEngine.js +0 -21
  99. package/src/textTools.js +0 -391
  100. package/src/traversalTracker.js +0 -47
package/index.html DELETED
@@ -1,396 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>PDFMake RTL Client Example</title>
5
- <meta charset="UTF-8">
6
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
- <script src="https://unpkg.com/@digicole/pdfmake-rtl/build/pdfmake.min.js"></script>
8
- <script src="https://unpkg.com/@digicole/pdfmake-rtl/build/vfs_fonts.js"></script>
9
- <style>
10
- body {
11
- font-family: 'Roboto', sans-serif;
12
- margin: 20px;
13
- }
14
- button {
15
- margin: 5px;
16
- padding: 10px 15px;
17
- font-size: 16px;
18
- cursor: pointer;
19
- }
20
-
21
- </style>
22
- </head>
23
- <body>
24
- <script>
25
- pdfMake.vfs = vfs;
26
- pdfMake.fonts = {
27
- Nillima: {
28
- normal: 'Nillima.ttf',
29
- bold: 'Nillima.ttf',
30
- italics: 'Nillima.ttf',
31
- bolditalics: 'Nillima.ttf',
32
- },
33
- Roboto: {
34
- normal: 'Roboto-Regular.ttf',
35
- bold: 'Roboto-Medium.ttf',
36
- italics: 'Roboto-Italic.ttf',
37
- bolditalics: 'Roboto-MediumItalic.ttf',
38
- },
39
- };
40
- // Arabic/Persian/Urdu content with automatic RTL detection
41
- const docDefinition = {
42
- content: [
43
- { text: 'Multilingual Tables', style: 'title' },
44
-
45
- { text: 'This document demonstrates the use of multilingual tables with automatic RTL (Right-to-Left) text detection. It includes examples in English, Arabic, Persian, and Urdu.', style: 'paragraph' },
46
- { text: 'يوضح هذا المستند استخدام الجداول متعددة اللغات مع الكشف التلقائي عن النصوص من اليمين إلى اليسار. يتضمن أمثلة باللغات الإنجليزية والعربية والفارسية والأردية.', style: 'paragraph' },
47
- { text: 'این سند استفاده از جداول چندزبانه با تشخیص خودکار متن راست به چپ را نشان می‌دهد. شامل مثال‌هایی به زبان‌های انگلیسی، عربی، فارسی و اردو است.', style: 'paragraph' },
48
- { text: 'یہ دستاویز کثیر لسانی جدولوں کے استعمال کو خودکار دائیں سے بائیں متن کی شناخت کے ساتھ ظاہر کرتی ہے۔ اس میں انگریزی، عربی، فارسی اور اردو میں مثالیں شامل ہیں۔', style: 'paragraph' },
49
-
50
- // English Table
51
- { text: '\nEnglish Table:\n', style: 'header' },
52
- {
53
- table: {
54
- headerRows: 1,
55
- widths: ['*', '*', '*'],
56
- body: [
57
- [
58
- { text: 'Freedom', style: 'tableHeader' },
59
- { text: 'Courage', style: 'tableHeader' },
60
- { text: 'Humanity', style: 'tableHeader' },
61
- ],
62
- [
63
- {
64
- text: 'Freedom allows individuals to make decisions without restrictions, enhancing their sense of responsibility towards themselves and others.',
65
- style: 'tableCell',
66
- },
67
- {
68
- text: 'Courage enables us to confront risks with confidence, helping us achieve our goals and overcome obstacles.',
69
- style: 'tableCell',
70
- },
71
- {
72
- text: 'Humanity means standing by those in need and supporting them during tough times, fostering solidarity and compassion.',
73
- style: 'tableCell',
74
- },
75
- ],
76
- [
77
- {
78
- text: 'Freedom is priceless, as it is the essence of a dignified life that every person strives for.',
79
- style: 'tableCell',
80
- },
81
- {
82
- text: 'Courage is speaking the truth even when it is difficult, distinguishing individuals who are confident and principled.',
83
- style: 'tableCell',
84
- },
85
- {
86
- text: 'Supporting the weak reflects the morals and human values of a society, showcasing the strength of collective spirit.',
87
- style: 'tableCell',
88
- },
89
- ],
90
- [
91
- {
92
- text: 'Freedom gives life more meaning, providing individuals with a sense of belonging and the ability to innovate.',
93
- style: 'tableCell',
94
- },
95
- {
96
- text: 'Courage is standing against injustice and defending the truth, even at a great cost.',
97
- style: 'tableCell',
98
- },
99
- {
100
- text: 'Humanity is the essence of life, enabling us to live in peace and harmony with others.',
101
- style: 'tableCell',
102
- },
103
- ],
104
- ],
105
- },
106
-
107
- layout: {
108
- defaultBorder: true,
109
- },
110
- },
111
-
112
- // Arabic Table
113
- { text: '\nArabic Table:\n', style: 'header' },
114
- {
115
- table: {
116
- headerRows: 1,
117
- widths: ['*', '*', '*'],
118
- body: [
119
- [
120
- { text: 'الحرية', style: 'tableHeader' },
121
- { text: 'الشجاعة', style: 'tableHeader' },
122
- { text: 'نصرة الضعيف', style: 'tableHeader' },
123
- ],
124
- [
125
- {
126
- text: 'الحرية تمنح الإنسان القدرة على اتخاذ قراراته بحرية دون قيود، مما يعزز من شعوره بالمسؤولية تجاه نفسه وتجاه الآخرين',
127
- style: 'tableCell',
128
- },
129
- {
130
- text: 'الشجاعة تجعلنا نواجه المخاطر بشجاعة وثقة، مما يساعدنا على تحقيق أهدافنا وتجاوز العقبات',
131
- style: 'tableCell',
132
- },
133
- {
134
- text: 'الإنسانية تعني الوقوف بجانب المحتاجين ودعمهم في أوقات الشدة، مما يعزز من روح التضامن والتكافل',
135
- style: 'tableCell',
136
- },
137
- ],
138
- [
139
- { text: 'الحرية لا تقدر بثمن، فهي جوهر الحياة الكريمة التي يسعى إليها كل إنسان', style: 'tableCell' },
140
- {
141
- text: 'الشجاعة هي أن تقول الحق ولو كان صعبًا، فهي التي تميز الإنسان الواثق بنفسه والمتمسك بمبادئه',
142
- style: 'tableCell',
143
- },
144
- {
145
- text: 'نصرة الضعيف تعكس أخلاق المجتمع وقيمه الإنسانية، وهي دليل على قوة الروح الجماعية',
146
- style: 'tableCell',
147
- },
148
- ],
149
- [
150
- {
151
- text: 'الحرية تجعل الحياة أكثر معنى، فهي التي تمنح الإنسان الشعور بالانتماء والقدرة على الإبداع',
152
- style: 'tableCell',
153
- },
154
- { text: 'الشجاعة هي أن تواجه الظلم وتدافع عن الحق، حتى لو كان الثمن غاليًا', style: 'tableCell' },
155
- {
156
- text: 'الإنسانية هي جوهر الحياة، فهي التي تجعلنا نعيش في سلام ووئام مع الآخرين',
157
- style: 'tableCell',
158
- },
159
- ],
160
- ],
161
- },
162
- layout: {
163
- defaultBorder: true,
164
- },
165
- },
166
-
167
- // Persian Table
168
- { text: '\nPersian Table:\n', style: 'header' },
169
- {
170
- table: {
171
- headerRows: 1,
172
- widths: ['*', '*', '*'],
173
- body: [
174
- [
175
- { text: 'آزادی', style: 'tableHeader' },
176
- { text: 'شجاعت', style: 'tableHeader' },
177
- { text: 'حمایت از ضعیف', style: 'tableHeader' },
178
- ],
179
- [
180
- {
181
- text: 'آزادی به انسان امکان تصمیم‌گیری بدون محدودیت را می‌دهد و حس مسئولیت‌پذیری او را تقویت می‌کند.',
182
- style: 'tableCell',
183
- },
184
- {
185
- text: 'شجاعت به ما کمک می‌کند تا با اطمینان به خطرات روبرو شویم و اهداف خود را محقق کنیم.',
186
- style: 'tableCell',
187
- },
188
- {
189
- text: 'انسانیت به معنای ایستادن در کنار نیازمندان و حمایت از آن‌ها در زمان‌های سخت است.',
190
- style: 'tableCell',
191
- },
192
- ],
193
- [
194
- {
195
- text: 'آزادی بی‌قیمت است، زیرا جوهر زندگی با کرامت است که هر انسانی به دنبال آن است.',
196
- style: 'tableCell',
197
- },
198
- {
199
- text: 'شجاعت یعنی گفتن حقیقت حتی زمانی که دشوار است، و این ویژگی افراد با اعتماد به نفس و اصولی است.',
200
- style: 'tableCell',
201
- },
202
- {
203
- text: 'حمایت از ضعیف اخلاق و ارزش‌های انسانی جامعه را نشان می‌دهد و قدرت روح جمعی را به نمایش می‌گذارد.',
204
- style: 'tableCell',
205
- },
206
- ],
207
- [
208
- {
209
- text: 'آزادی به زندگی معنا می‌بخشد و حس تعلق و توانایی خلاقیت را به انسان می‌دهد.',
210
- style: 'tableCell',
211
- },
212
- {
213
- text: 'شجاعت یعنی ایستادن در برابر ظلم و دفاع از حقیقت، حتی اگر هزینه زیادی داشته باشد.',
214
- style: 'tableCell',
215
- },
216
- {
217
- text: 'انسانیت جوهر زندگی است که به ما امکان می‌دهد با دیگران در صلح و هماهنگی زندگی کنیم.',
218
- style: 'tableCell',
219
- },
220
- ],
221
- ],
222
- },
223
-
224
- layout: {
225
- defaultBorder: true,
226
- },
227
- },
228
-
229
- // Urdu Table
230
- { text: '\nUrdu Table:\n', style: 'header' },
231
- {
232
- table: {
233
- headerRows: 1,
234
- widths: ['*', '*', '*'],
235
- body: [
236
- [
237
- { text: 'آزادی', style: 'tableHeader' },
238
- { text: 'شجاعت', style: 'tableHeader' },
239
- { text: 'انسانیت', style: 'tableHeader' },
240
- ],
241
- [
242
- { text: 'آزادی انسان کو اپنی زندگی کے فیصلے خود کرنے کا حق دیتی ہے۔', style: 'tableCell' },
243
- { text: 'شجاعت ہمیں مشکلات کا سامنا کرنے کی ہمت دیتی ہے۔', style: 'tableCell' },
244
- { text: 'انسانیت دوسروں کی مدد کرنے اور ان کے ساتھ ہمدردی کرنے کا درس دیتی ہے۔', style: 'tableCell' },
245
- ],
246
- [
247
- { text: 'آزادی زندگی کو بامعنی بناتی ہے۔', style: 'tableCell' },
248
- { text: 'شجاعت سچ بولنے کی طاقت ہے۔', style: 'tableCell' },
249
- { text: 'انسانیت معاشرتی انصاف کی بنیاد ہے۔', style: 'tableCell' },
250
- ],
251
- [
252
- { text: 'آزادی ہر انسان کا بنیادی حق ہے۔', style: 'tableCell' },
253
- { text: 'شجاعت ہمیں اپنے اصولوں پر قائم رہنے کا حوصلہ دیتی ہے۔', style: 'tableCell' },
254
- { text: 'انسانیت ہمیں دوسروں کے ساتھ امن اور محبت سے رہنے کا سبق دیتی ہے۔', style: 'tableCell' },
255
- ],
256
- ],
257
- },
258
-
259
- layout: {
260
- defaultBorder: true,
261
- },
262
- },
263
- ],
264
- defaultStyle: {
265
- font: 'Roboto',
266
- fontSize: 11,
267
- },
268
- styles: {
269
- title: {
270
- fontSize: 18,
271
- bold: true,
272
- margin: [0, 0, 0, 10],
273
- },
274
- header: {
275
- fontSize: 14,
276
- bold: true,
277
- margin: [0, 10, 0, 5],
278
- },
279
- tableHeader: {
280
- bold: true,
281
- fillColor: '#f0f0f0',
282
- fontSize: 12,
283
- margin: [5, 5, 5, 5],
284
- },
285
- tableCell: {
286
- margin: [5, 5, 5, 5],
287
- },
288
- paragraph: {
289
- margin: [0, 5, 0, 5],
290
- fontSize: 12,
291
- },
292
- },
293
- };
294
-
295
- // Generate and download PDF
296
- function createPDF() {
297
- pdfMake.createPdf(docDefinition).download('rtl-document.pdf');
298
- }
299
-
300
- // Or open in new window
301
- function openPDF() {
302
- pdfMake.createPdf(docDefinition).open();
303
- }
304
- </script>
305
- <div style="text-align: center; margin-top: 20px;"></div>
306
- <button onclick="createPDF()" style="padding: 10px 20px; font-size: 16px; margin-right: 10px; cursor: pointer; background-color: #4CAF50; color: white; border: none; border-radius: 5px;">Download RTL PDF</button>
307
- <button onclick="openPDF()" style="padding: 10px 20px; font-size: 16px; cursor: pointer; background-color: #008CBA; color: white; border: none; border-radius: 5px;">Open RTL PDF</button>
308
- </div>
309
- <div style="max-width: 100%; background: #f8f9fa; border: 1px solid #ddd; border-radius: 6px; overflow: auto; padding: 4rem; padding-top: 0; font-family: monospace;">
310
- <pre style="margin: 0;"><code style="white-space: pre; font-size: 14px; line-height: 1.5; color: #212529;">
311
- &lt;script&gt;
312
- pdfMake.vfs = vfs;
313
- pdfMake.fonts = {
314
- Nillima: {
315
- normal: 'Nillima.ttf',
316
- bold: 'Nillima.ttf',
317
- italics: 'Nillima.ttf',
318
- bolditalics: 'Nillima.ttf',
319
- },
320
- Roboto: {
321
- normal: 'Roboto-Regular.ttf',
322
- bold: 'Roboto-Medium.ttf',
323
- italics: 'Roboto-Italic.ttf',
324
- bolditalics: 'Roboto-MediumItalic.ttf',
325
- },
326
- };
327
-
328
- const docDefinition = {
329
- content: [
330
- { text: 'Multilingual Tables', style: 'title' },
331
-
332
- { text: 'This document demonstrates the use of multilingual tables with automatic RTL (Right-to-Left) text detection. It includes examples in English, Arabic, Persian, and Urdu.', style: 'paragraph' },
333
- { text: 'يوضح هذا المستند استخدام الجداول متعددة اللغات مع الكشف التلقائي عن النصوص من اليمين إلى اليسار. يتضمن أمثلة باللغات الإنجليزية والعربية والفارسية والأردية.', style: 'paragraph' },
334
- { text: 'این سند استفاده از جداول چندزبانه با تشخیص خودکار متن راست به چپ را نشان می‌دهد. شامل مثال‌هایی به زبان‌های انگلیسی، عربی، فارسی و اردو است.', style: 'paragraph' },
335
- { text: 'یہ دستاویز کثیر لسانی جدولوں کے استعمال کو خودکار دائیں سے بائیں متن کی شناخت کے ساتھ ظاہر کرتی ہے۔ اس میں انگریزی، عربی، فارسی اور اردو میں مثالیں شامل ہیں۔', style: 'paragraph' },
336
-
337
- { text: '\nEnglish Table:\n', style: 'header' },
338
- {
339
- table: {
340
- headerRows: 1,
341
- widths: ['*', '*', '*'],
342
- body: [
343
- [
344
- { text: 'Freedom', style: 'tableHeader' },
345
- { text: 'Courage', style: 'tableHeader' },
346
- { text: 'Humanity', style: 'tableHeader' }
347
- ],
348
- [
349
- {
350
- text: 'Freedom allows individuals to make decisions without restrictions...',
351
- style: 'tableCell'
352
- },
353
- {
354
- text: 'Courage enables us to confront risks with confidence...',
355
- style: 'tableCell'
356
- },
357
- {
358
- text: 'Humanity means standing by those in need...',
359
- style: 'tableCell'
360
- }
361
- ]
362
- // More rows...
363
- ]
364
- },
365
- layout: { defaultBorder: true }
366
- }
367
- // Arabic, Persian, Urdu tables...
368
- ],
369
- defaultStyle: {
370
- font: 'Roboto',
371
- fontSize: 11,
372
- },
373
- styles: {
374
- title: { fontSize: 18, bold: true, margin: [0, 0, 0, 10] },
375
- header: { fontSize: 14, bold: true, margin: [0, 10, 0, 5] },
376
- tableHeader: { bold: true, fillColor: '#f0f0f0', fontSize: 12, margin: [5, 5, 5, 5] },
377
- tableCell: { margin: [5, 5, 5, 5] }
378
- }
379
- };
380
-
381
- // Generate PDF
382
- function createPDF() {
383
- pdfMake.createPdf(docDefinition).download('rtl-document.pdf');
384
- }
385
-
386
- // Or open in new window
387
- function openPDF() {
388
- pdfMake.createPdf(docDefinition).open();
389
- }
390
- &lt;/script&gt;
391
- </code></pre>
392
- </div>
393
-
394
-
395
- </body>
396
- </html>
@@ -1,96 +0,0 @@
1
- 'use strict';
2
-
3
- // Internet Explorer polyfills
4
- if (typeof window !== 'undefined' && !window.Promise) {
5
- require('core-js/features/promise');
6
- }
7
- require('core-js/es/object/values');
8
-
9
- var fetchUrl = function (url, headers) {
10
- return new Promise(function (resolve, reject) {
11
- var xhr = new XMLHttpRequest();
12
- xhr.open('GET', url, true);
13
- for (var headerName in headers) {
14
- xhr.setRequestHeader(headerName, headers[headerName]);
15
- }
16
- xhr.responseType = 'arraybuffer';
17
-
18
- xhr.onreadystatechange = function () {
19
- if (xhr.readyState !== 4) {
20
- return;
21
- }
22
-
23
- var ok = xhr.status >= 200 && xhr.status < 300;
24
- if (!ok) {
25
- setTimeout(function () {
26
- reject(new TypeError('Failed to fetch (url: "' + url + '")'));
27
- }, 0);
28
- }
29
- };
30
-
31
- xhr.onload = function () {
32
- var ok = xhr.status >= 200 && xhr.status < 300;
33
- if (ok) {
34
- resolve(xhr.response);
35
- }
36
- };
37
-
38
- xhr.onerror = function () {
39
- setTimeout(function () {
40
- reject(new TypeError('Network request failed (url: "' + url + '")'));
41
- }, 0);
42
- };
43
-
44
- xhr.ontimeout = function () {
45
- setTimeout(function () {
46
- reject(new TypeError('Network request failed (url: "' + url + '")'));
47
- }, 0);
48
- };
49
-
50
- xhr.send();
51
- });
52
- };
53
-
54
- function URLBrowserResolver(fs) {
55
- this.fs = fs;
56
- this.resolving = {};
57
- }
58
-
59
- URLBrowserResolver.prototype.resolve = function (url, headers) {
60
- if (!this.resolving[url]) {
61
- var _this = this;
62
- this.resolving[url] = new Promise(function (resolve, reject) {
63
- if (url.toLowerCase().indexOf('https://') === 0 || url.toLowerCase().indexOf('http://') === 0) {
64
- if (_this.fs.existsSync(url)) {
65
- // url was downloaded earlier
66
- resolve();
67
- } else {
68
- fetchUrl(url, headers).then(function (buffer) {
69
- _this.fs.writeFileSync(url, buffer);
70
- resolve();
71
- }, function (result) {
72
- reject(result);
73
- });
74
- }
75
- } else {
76
- // cannot be resolved
77
- resolve();
78
- }
79
- });
80
- }
81
-
82
- return this.resolving[url];
83
- };
84
-
85
- URLBrowserResolver.prototype.resolved = function () {
86
- var _this = this;
87
- return new Promise(function (resolve, reject) {
88
- Promise.all(Object.values(_this.resolving)).then(function () {
89
- resolve();
90
- }, function (result) {
91
- reject(result);
92
- });
93
- });
94
- };
95
-
96
- module.exports = URLBrowserResolver;
@@ -1,55 +0,0 @@
1
- 'use strict';
2
-
3
- function VirtualFileSystem() {
4
- this.fileSystem = {};
5
- this.dataSystem = {};
6
- }
7
-
8
- VirtualFileSystem.prototype.existsSync = function (filename) {
9
- filename = fixFilename(filename);
10
- return typeof this.fileSystem[filename] !== 'undefined'
11
- || typeof this.dataSystem[filename] !== 'undefined';
12
- };
13
-
14
- VirtualFileSystem.prototype.readFileSync = function (filename, options) {
15
- filename = fixFilename(filename);
16
-
17
- var dataContent = this.dataSystem[filename];
18
- if (typeof dataContent === 'string' && options === 'utf8') {
19
- return dataContent;
20
- }
21
-
22
- if (dataContent) {
23
- return new Buffer(dataContent, typeof dataContent === 'string' ? 'base64' : undefined);
24
- }
25
-
26
- var content = this.fileSystem[filename];
27
- if (content) {
28
- return content;
29
- }
30
-
31
- throw 'File \'' + filename + '\' not found in virtual file system';
32
- };
33
-
34
- VirtualFileSystem.prototype.writeFileSync = function (filename, content) {
35
- this.fileSystem[fixFilename(filename)] = content;
36
- };
37
-
38
- VirtualFileSystem.prototype.bindFS = function (data) {
39
- this.dataSystem = data || {};
40
- };
41
-
42
-
43
- function fixFilename(filename) {
44
- if (filename.indexOf(__dirname) === 0) {
45
- filename = filename.substring(__dirname.length);
46
- }
47
-
48
- if (filename.indexOf('/') === 0) {
49
- filename = filename.substring(1);
50
- }
51
-
52
- return filename;
53
- }
54
-
55
- module.exports = new VirtualFileSystem();
@@ -1,68 +0,0 @@
1
- 'use strict';
2
-
3
- var isArray = require('./helpers').isArray;
4
-
5
- function typeName(bold, italics) {
6
- var type = 'normal';
7
- if (bold && italics) {
8
- type = 'bolditalics';
9
- } else if (bold) {
10
- type = 'bold';
11
- } else if (italics) {
12
- type = 'italics';
13
- }
14
- return type;
15
- }
16
-
17
- function FontProvider(fontDescriptors, pdfKitDoc) {
18
- this.fonts = {};
19
- this.pdfKitDoc = pdfKitDoc;
20
- this.fontCache = {};
21
-
22
- for (var font in fontDescriptors) {
23
- if (fontDescriptors.hasOwnProperty(font)) {
24
- var fontDef = fontDescriptors[font];
25
-
26
- this.fonts[font] = {
27
- normal: fontDef.normal,
28
- bold: fontDef.bold,
29
- italics: fontDef.italics,
30
- bolditalics: fontDef.bolditalics
31
- };
32
- }
33
- }
34
- }
35
-
36
- FontProvider.prototype.getFontType = function (bold, italics) {
37
- return typeName(bold, italics);
38
- };
39
-
40
- FontProvider.prototype.getFontFile = function (familyName, bold, italics) {
41
- var type = this.getFontType(bold, italics);
42
- if (!this.fonts[familyName] || !this.fonts[familyName][type]) {
43
- return null;
44
- }
45
-
46
- return this.fonts[familyName][type];
47
- };
48
-
49
- FontProvider.prototype.provideFont = function (familyName, bold, italics) {
50
- var type = this.getFontType(bold, italics);
51
- if (this.getFontFile(familyName, bold, italics) === null) {
52
- throw new Error('Font \'' + familyName + '\' in style \'' + type + '\' is not defined in the font section of the document definition.');
53
- }
54
-
55
- this.fontCache[familyName] = this.fontCache[familyName] || {};
56
-
57
- if (!this.fontCache[familyName][type]) {
58
- var def = this.fonts[familyName][type];
59
- if (!isArray(def)) {
60
- def = [def];
61
- }
62
- this.fontCache[familyName][type] = this.pdfKitDoc.font.apply(this.pdfKitDoc, def)._font;
63
- }
64
-
65
- return this.fontCache[familyName][type];
66
- };
67
-
68
- module.exports = FontProvider;