dompdf.js 1.1.0 → 1.2.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/.versionrc +8 -0
- package/CHANGELOG.md +32 -543
- package/README.md +201 -155
- package/README_CN.md +233 -238
- package/dist/dompdf.esm.js +26010 -14837
- package/dist/dompdf.esm.js.map +1 -1
- package/dist/dompdf.js +40542 -29369
- package/dist/dompdf.js.map +1 -1
- package/dist/dompdf.min.js +67 -0
- package/dist/index.d.ts +7 -6
- package/dist/lib/dom/node-parser.js +0 -62
- package/dist/lib/dom/node-parser.js.map +1 -1
- package/dist/lib/index.js +41 -34
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/render/canvas/pdf-renderer.js +358 -228
- package/dist/lib/render/canvas/pdf-renderer.js.map +1 -1
- package/dist/lib/render/paginate copy 2.js +178 -0
- package/dist/lib/render/paginate copy 2.js.map +1 -0
- package/dist/lib/render/paginate.js +68 -29
- package/dist/lib/render/paginate.js.map +1 -1
- package/dist/lib/utils/css-utils.js +19 -0
- package/dist/lib/utils/css-utils.js.map +1 -0
- package/dist/lib/utils/element-utils.js +25 -0
- package/dist/lib/utils/element-utils.js.map +1 -0
- package/dist/lib/utils/font-utils.js +70 -0
- package/dist/lib/utils/font-utils.js.map +1 -0
- package/dist/lib/utils/index.js +22 -0
- package/dist/lib/utils/index.js.map +1 -0
- package/dist/lib/utils/type-utils.js +40 -0
- package/dist/lib/utils/type-utils.js.map +1 -0
- package/dist/lib/utils/url-path.js +22 -0
- package/dist/lib/utils/url-path.js.map +1 -0
- package/dist/render/canvas/pdf-renderer.d.ts +29 -24
- package/dist/render/paginate copy 2.d.ts +3 -0
- package/dist/render/paginate.d.ts +1 -1
- package/dist/types/index.d.ts +7 -6
- package/dist/types/render/canvas/pdf-renderer.d.ts +29 -24
- package/dist/types/render/paginate copy 2.d.ts +3 -0
- package/dist/types/render/paginate.d.ts +1 -1
- package/dist/types/utils/css-utils.d.ts +2 -0
- package/dist/types/utils/element-utils.d.ts +7 -0
- package/dist/types/utils/font-utils.d.ts +9 -0
- package/dist/types/utils/index.d.ts +5 -0
- package/dist/types/utils/type-utils.d.ts +4 -0
- package/dist/types/utils/url-path.d.ts +7 -0
- package/dist/utils/css-utils.d.ts +2 -0
- package/dist/utils/element-utils.d.ts +7 -0
- package/dist/utils/font-utils.d.ts +9 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/type-utils.d.ts +4 -0
- package/dist/utils/url-path.d.ts +7 -0
- package/fontconverter/FileSaver.js +2 -0
- package/fontconverter/filereader.js +432 -0
- package/fontconverter/fontconverter.html +66 -0
- package/fontconverter/pure-min.css +11 -0
- package/package.json +135 -135
- package/page_sizes.md +50 -0
- package/.vscode/settings.json +0 -5
- package/html2pdf-userscript.js +0 -936
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
FileReader.js - v0.99
|
|
3
|
+
A lightweight wrapper for common FileReader usage.
|
|
4
|
+
Copyright 2014 Brian Grinstead - MIT License.
|
|
5
|
+
See http://github.com/bgrins/filereader.js for documentation.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
(function(window, document) {
|
|
9
|
+
|
|
10
|
+
var FileReader = window.FileReader;
|
|
11
|
+
var FileReaderSyncSupport = false;
|
|
12
|
+
var workerScript = "self.addEventListener('message', function(e) { var data=e.data; try { var reader = new FileReaderSync; postMessage({ result: reader[data.readAs](data.file), extra: data.extra, file: data.file})} catch(e){ postMessage({ result:'error', extra:data.extra, file:data.file}); } }, false);";
|
|
13
|
+
var syncDetectionScript = "onmessage = function(e) { postMessage(!!FileReaderSync); };";
|
|
14
|
+
var fileReaderEvents = ['loadstart', 'progress', 'load', 'abort', 'error', 'loadend'];
|
|
15
|
+
var sync = false;
|
|
16
|
+
var FileReaderJS = window.FileReaderJS = {
|
|
17
|
+
enabled: false,
|
|
18
|
+
setupInput: setupInput,
|
|
19
|
+
setupDrop: setupDrop,
|
|
20
|
+
setupClipboard: setupClipboard,
|
|
21
|
+
setSync: function (value) {
|
|
22
|
+
sync = value;
|
|
23
|
+
|
|
24
|
+
if (sync && !FileReaderSyncSupport) {
|
|
25
|
+
checkFileReaderSyncSupport();
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
getSync: function() {
|
|
29
|
+
return sync && FileReaderSyncSupport;
|
|
30
|
+
},
|
|
31
|
+
output: [],
|
|
32
|
+
opts: {
|
|
33
|
+
dragClass: "drag",
|
|
34
|
+
accept: false,
|
|
35
|
+
readAsDefault: 'DataURL',
|
|
36
|
+
readAsMap: {
|
|
37
|
+
},
|
|
38
|
+
on: {
|
|
39
|
+
loadstart: noop,
|
|
40
|
+
progress: noop,
|
|
41
|
+
load: noop,
|
|
42
|
+
abort: noop,
|
|
43
|
+
error: noop,
|
|
44
|
+
loadend: noop,
|
|
45
|
+
skip: noop,
|
|
46
|
+
groupstart: noop,
|
|
47
|
+
groupend: noop,
|
|
48
|
+
beforestart: noop
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
// Setup jQuery plugin (if available)
|
|
54
|
+
if (typeof(jQuery) !== "undefined") {
|
|
55
|
+
jQuery.fn.fileReaderJS = function(opts) {
|
|
56
|
+
return this.each(function() {
|
|
57
|
+
if (jQuery(this).is("input")) {
|
|
58
|
+
setupInput(this, opts);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
setupDrop(this, opts);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
jQuery.fn.fileClipboard = function(opts) {
|
|
67
|
+
return this.each(function() {
|
|
68
|
+
setupClipboard(this, opts);
|
|
69
|
+
});
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Not all browsers support the FileReader interface. Return with the enabled bit = false.
|
|
74
|
+
if (!FileReader) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
// makeWorker is a little wrapper for generating web workers from strings
|
|
80
|
+
function makeWorker(script) {
|
|
81
|
+
var URL = window.URL || window.webkitURL;
|
|
82
|
+
var Blob = window.Blob;
|
|
83
|
+
var Worker = window.Worker;
|
|
84
|
+
|
|
85
|
+
if (!URL || !Blob || !Worker || !script) {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
var blob = new Blob([script]);
|
|
90
|
+
var worker = new Worker(URL.createObjectURL(blob));
|
|
91
|
+
return worker;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// setupClipboard: bind to clipboard events (intended for document.body)
|
|
95
|
+
function setupClipboard(element, opts) {
|
|
96
|
+
|
|
97
|
+
if (!FileReaderJS.enabled) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
var instanceOptions = extend(extend({}, FileReaderJS.opts), opts);
|
|
101
|
+
|
|
102
|
+
element.addEventListener("paste", onpaste, false);
|
|
103
|
+
|
|
104
|
+
function onpaste(e) {
|
|
105
|
+
var files = [];
|
|
106
|
+
var clipboardData = e.clipboardData || {};
|
|
107
|
+
var items = clipboardData.items || [];
|
|
108
|
+
|
|
109
|
+
for (var i = 0; i < items.length; i++) {
|
|
110
|
+
var file = items[i].getAsFile();
|
|
111
|
+
|
|
112
|
+
if (file) {
|
|
113
|
+
|
|
114
|
+
// Create a fake file name for images from clipboard, since this data doesn't get sent
|
|
115
|
+
var matches = new RegExp("/\(.*\)").exec(file.type);
|
|
116
|
+
if (!file.name && matches) {
|
|
117
|
+
var extension = matches[1];
|
|
118
|
+
file.name = "clipboard" + i + "." + extension;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
files.push(file);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if (files.length) {
|
|
126
|
+
processFileList(e, files, instanceOptions);
|
|
127
|
+
e.preventDefault();
|
|
128
|
+
e.stopPropagation();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// setupInput: bind the 'change' event to an input[type=file]
|
|
134
|
+
function setupInput(input, opts) {
|
|
135
|
+
|
|
136
|
+
if (!FileReaderJS.enabled) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
var instanceOptions = extend(extend({}, FileReaderJS.opts), opts);
|
|
140
|
+
|
|
141
|
+
input.addEventListener("change", inputChange, false);
|
|
142
|
+
input.addEventListener("drop", inputDrop, false);
|
|
143
|
+
|
|
144
|
+
function inputChange(e) {
|
|
145
|
+
processFileList(e, input.files, instanceOptions);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function inputDrop(e) {
|
|
149
|
+
e.stopPropagation();
|
|
150
|
+
e.preventDefault();
|
|
151
|
+
processFileList(e, e.dataTransfer.files, instanceOptions);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// setupDrop: bind the 'drop' event for a DOM element
|
|
156
|
+
function setupDrop(dropbox, opts) {
|
|
157
|
+
|
|
158
|
+
if (!FileReaderJS.enabled) {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
var instanceOptions = extend(extend({}, FileReaderJS.opts), opts);
|
|
162
|
+
var dragClass = instanceOptions.dragClass;
|
|
163
|
+
var initializedOnBody = false;
|
|
164
|
+
|
|
165
|
+
// Bind drag events to the dropbox to add the class while dragging, and accept the drop data transfer.
|
|
166
|
+
dropbox.addEventListener("dragenter", onlyWithFiles(dragenter), false);
|
|
167
|
+
dropbox.addEventListener("dragleave", onlyWithFiles(dragleave), false);
|
|
168
|
+
dropbox.addEventListener("dragover", onlyWithFiles(dragover), false);
|
|
169
|
+
dropbox.addEventListener("drop", onlyWithFiles(drop), false);
|
|
170
|
+
|
|
171
|
+
// Bind to body to prevent the dropbox events from firing when it was initialized on the page.
|
|
172
|
+
document.body.addEventListener("dragstart", bodydragstart, true);
|
|
173
|
+
document.body.addEventListener("dragend", bodydragend, true);
|
|
174
|
+
document.body.addEventListener("drop", bodydrop, false);
|
|
175
|
+
|
|
176
|
+
function bodydragend(e) {
|
|
177
|
+
initializedOnBody = false;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function bodydragstart(e) {
|
|
181
|
+
initializedOnBody = true;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function bodydrop(e) {
|
|
185
|
+
if (e.dataTransfer.files && e.dataTransfer.files.length ){
|
|
186
|
+
e.stopPropagation();
|
|
187
|
+
e.preventDefault();
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
function onlyWithFiles(fn) {
|
|
192
|
+
return function() {
|
|
193
|
+
if (!initializedOnBody) {
|
|
194
|
+
fn.apply(this, arguments);
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
function drop(e) {
|
|
200
|
+
e.stopPropagation();
|
|
201
|
+
e.preventDefault();
|
|
202
|
+
if (dragClass) {
|
|
203
|
+
removeClass(dropbox, dragClass);
|
|
204
|
+
}
|
|
205
|
+
processFileList(e, e.dataTransfer.files, instanceOptions);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
function dragenter(e) {
|
|
209
|
+
e.stopPropagation();
|
|
210
|
+
e.preventDefault();
|
|
211
|
+
if (dragClass) {
|
|
212
|
+
addClass(dropbox, dragClass);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
function dragleave(e) {
|
|
217
|
+
if (dragClass) {
|
|
218
|
+
removeClass(dropbox, dragClass);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
function dragover(e) {
|
|
223
|
+
e.stopPropagation();
|
|
224
|
+
e.preventDefault();
|
|
225
|
+
if (dragClass) {
|
|
226
|
+
addClass(dropbox, dragClass);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// setupCustomFileProperties: modify the file object with extra properties
|
|
232
|
+
function setupCustomFileProperties(files, groupID) {
|
|
233
|
+
for (var i = 0; i < files.length; i++) {
|
|
234
|
+
var file = files[i];
|
|
235
|
+
file.extra = {
|
|
236
|
+
nameNoExtension: file.name.substring(0, file.name.lastIndexOf('.')),
|
|
237
|
+
extension: file.name.substring(file.name.lastIndexOf('.') + 1),
|
|
238
|
+
fileID: i,
|
|
239
|
+
uniqueID: getUniqueID(),
|
|
240
|
+
groupID: groupID,
|
|
241
|
+
prettySize: prettySize(file.size)
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// getReadAsMethod: return method name for 'readAs*' - http://www.w3.org/TR/FileAPI/#reading-a-file
|
|
247
|
+
function getReadAsMethod(type, readAsMap, readAsDefault) {
|
|
248
|
+
for (var r in readAsMap) {
|
|
249
|
+
if (type.match(new RegExp(r))) {
|
|
250
|
+
return 'readAs' + readAsMap[r];
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return 'readAs' + readAsDefault;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// processFileList: read the files with FileReader, send off custom events.
|
|
257
|
+
function processFileList(e, files, opts) {
|
|
258
|
+
|
|
259
|
+
var filesLeft = files.length;
|
|
260
|
+
var group = {
|
|
261
|
+
groupID: getGroupID(),
|
|
262
|
+
files: files,
|
|
263
|
+
started: new Date()
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
function groupEnd() {
|
|
267
|
+
group.ended = new Date();
|
|
268
|
+
opts.on.groupend(group);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
function groupFileDone() {
|
|
272
|
+
if (--filesLeft === 0) {
|
|
273
|
+
groupEnd();
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
FileReaderJS.output.push(group);
|
|
278
|
+
setupCustomFileProperties(files, group.groupID);
|
|
279
|
+
|
|
280
|
+
opts.on.groupstart(group);
|
|
281
|
+
|
|
282
|
+
// No files in group - end immediately
|
|
283
|
+
if (!files.length) {
|
|
284
|
+
groupEnd();
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
var supportsSync = sync && FileReaderSyncSupport;
|
|
289
|
+
var syncWorker;
|
|
290
|
+
|
|
291
|
+
// Only initialize the synchronous worker if the option is enabled - to prevent the overhead
|
|
292
|
+
if (supportsSync) {
|
|
293
|
+
syncWorker = makeWorker(workerScript);
|
|
294
|
+
syncWorker.onmessage = function(e) {
|
|
295
|
+
var file = e.data.file;
|
|
296
|
+
var result = e.data.result;
|
|
297
|
+
|
|
298
|
+
// Workers seem to lose the custom property on the file object.
|
|
299
|
+
if (!file.extra) {
|
|
300
|
+
file.extra = e.data.extra;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
file.extra.ended = new Date();
|
|
304
|
+
|
|
305
|
+
// Call error or load event depending on success of the read from the worker.
|
|
306
|
+
opts.on[result === "error" ? "error" : "load"]({ target: { result: result } }, file);
|
|
307
|
+
groupFileDone();
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
Array.prototype.forEach.call(files, function(file) {
|
|
312
|
+
|
|
313
|
+
file.extra.started = new Date();
|
|
314
|
+
|
|
315
|
+
if (opts.accept && !file.type.match(new RegExp(opts.accept))) {
|
|
316
|
+
opts.on.skip(file);
|
|
317
|
+
groupFileDone();
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
if (opts.on.beforestart(file) === false) {
|
|
322
|
+
opts.on.skip(file);
|
|
323
|
+
groupFileDone();
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
var readAs = getReadAsMethod(file.type, opts.readAsMap, opts.readAsDefault);
|
|
328
|
+
|
|
329
|
+
if (syncWorker) {
|
|
330
|
+
syncWorker.postMessage({
|
|
331
|
+
file: file,
|
|
332
|
+
extra: file.extra,
|
|
333
|
+
readAs: readAs
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
|
|
338
|
+
var reader = new FileReader();
|
|
339
|
+
reader.originalEvent = e;
|
|
340
|
+
|
|
341
|
+
fileReaderEvents.forEach(function(eventName) {
|
|
342
|
+
reader['on' + eventName] = function(e) {
|
|
343
|
+
if (eventName == 'load' || eventName == 'error') {
|
|
344
|
+
file.extra.ended = new Date();
|
|
345
|
+
}
|
|
346
|
+
opts.on[eventName](e, file);
|
|
347
|
+
if (eventName == 'loadend') {
|
|
348
|
+
groupFileDone();
|
|
349
|
+
}
|
|
350
|
+
};
|
|
351
|
+
});
|
|
352
|
+
reader[readAs](file);
|
|
353
|
+
}
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
// checkFileReaderSyncSupport: Create a temporary worker and see if FileReaderSync exists
|
|
358
|
+
function checkFileReaderSyncSupport() {
|
|
359
|
+
var worker = makeWorker(syncDetectionScript);
|
|
360
|
+
if (worker) {
|
|
361
|
+
worker.onmessage =function(e) {
|
|
362
|
+
FileReaderSyncSupport = e.data;
|
|
363
|
+
};
|
|
364
|
+
worker.postMessage({});
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
// noop: do nothing
|
|
369
|
+
function noop() {
|
|
370
|
+
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
// extend: used to make deep copies of options object
|
|
374
|
+
function extend(destination, source) {
|
|
375
|
+
for (var property in source) {
|
|
376
|
+
if (source[property] && source[property].constructor &&
|
|
377
|
+
source[property].constructor === Object) {
|
|
378
|
+
destination[property] = destination[property] || {};
|
|
379
|
+
arguments.callee(destination[property], source[property]);
|
|
380
|
+
}
|
|
381
|
+
else {
|
|
382
|
+
destination[property] = source[property];
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
return destination;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
// hasClass: does an element have the css class?
|
|
389
|
+
function hasClass(el, name) {
|
|
390
|
+
return new RegExp("(?:^|\\s+)" + name + "(?:\\s+|$)").test(el.className);
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
// addClass: add the css class for the element.
|
|
394
|
+
function addClass(el, name) {
|
|
395
|
+
if (!hasClass(el, name)) {
|
|
396
|
+
el.className = el.className ? [el.className, name].join(' ') : name;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
// removeClass: remove the css class from the element.
|
|
401
|
+
function removeClass(el, name) {
|
|
402
|
+
if (hasClass(el, name)) {
|
|
403
|
+
var c = el.className;
|
|
404
|
+
el.className = c.replace(new RegExp("(?:^|\\s+)" + name + "(?:\\s+|$)", "g"), " ").replace(/^\s\s*/, '').replace(/\s\s*$/, '');
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
// prettySize: convert bytes to a more readable string.
|
|
409
|
+
function prettySize(bytes) {
|
|
410
|
+
var s = ['bytes', 'kb', 'MB', 'GB', 'TB', 'PB'];
|
|
411
|
+
var e = Math.floor(Math.log(bytes)/Math.log(1024));
|
|
412
|
+
return (bytes/Math.pow(1024, Math.floor(e))).toFixed(2)+" "+s[e];
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
// getGroupID: generate a unique int ID for groups.
|
|
416
|
+
var getGroupID = (function(id) {
|
|
417
|
+
return function() {
|
|
418
|
+
return id++;
|
|
419
|
+
};
|
|
420
|
+
})(0);
|
|
421
|
+
|
|
422
|
+
// getUniqueID: generate a unique int ID for files
|
|
423
|
+
var getUniqueID = (function(id) {
|
|
424
|
+
return function() {
|
|
425
|
+
return id++;
|
|
426
|
+
};
|
|
427
|
+
})(0);
|
|
428
|
+
|
|
429
|
+
// The interface is supported, bind the FileReaderJS callbacks
|
|
430
|
+
FileReaderJS.enabled = true;
|
|
431
|
+
|
|
432
|
+
})(this, document);
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
<html>
|
|
2
|
+
|
|
3
|
+
<head>
|
|
4
|
+
<script type='text/javascript' src='filereader.js'></script>
|
|
5
|
+
<script type='text/javascript' src='FileSaver.js'></script>
|
|
6
|
+
<link rel='stylesheet' href='pure-min.css'>
|
|
7
|
+
</head>
|
|
8
|
+
|
|
9
|
+
<body>
|
|
10
|
+
<form id='file-form' method='post' action='javascript:generateJsPDFFontFile()' enctype='multipart/form-data'
|
|
11
|
+
class='pure-form pure-form-aligned'>
|
|
12
|
+
<fieldset>
|
|
13
|
+
<div class='pure-control-group'>
|
|
14
|
+
<label for='fontName'>fontName</label>
|
|
15
|
+
<input type='text' name='fontName' id='fontName' placeholder='fontName' />
|
|
16
|
+
</div>
|
|
17
|
+
<div class='pure-control-group'>
|
|
18
|
+
<label for='fontStyle'>fontStyle</label>
|
|
19
|
+
<select name='fontStyle' id='fontStyle'>
|
|
20
|
+
<option value='normal'>normal</option>
|
|
21
|
+
<option value='bold'>bold</option>
|
|
22
|
+
<option value='italic'>italic</option>
|
|
23
|
+
<option value='bolditalic'>bolditalic</option>
|
|
24
|
+
</select>
|
|
25
|
+
</div>
|
|
26
|
+
<div class='pure-control-group'>
|
|
27
|
+
<label for='file-input'>File</label>
|
|
28
|
+
<input type='hidden' name='extra-data' multiple />
|
|
29
|
+
<input type='file' id='file-input' name='file-input' multiple />
|
|
30
|
+
</div>
|
|
31
|
+
<div class='pure-controls'>
|
|
32
|
+
<button type='submit' value='Create' id='createFile' class='pure-button pure-button-primary'>Create</button>
|
|
33
|
+
</div>
|
|
34
|
+
</fieldset>
|
|
35
|
+
</form>
|
|
36
|
+
<script>
|
|
37
|
+
var opts = {
|
|
38
|
+
on: {
|
|
39
|
+
load: function (e, file) {
|
|
40
|
+
window.loadedFile = file;
|
|
41
|
+
document.getElementById('fontName').value = file.extra.nameNoExtension;
|
|
42
|
+
|
|
43
|
+
var fileReader = new FileReader();
|
|
44
|
+
fileReader.onload = function (e) {
|
|
45
|
+
window.loadedFileContents = e.target.result;
|
|
46
|
+
window.loadedFileContents = window.loadedFileContents.substr(window.loadedFileContents.indexOf('base64,') + 7)
|
|
47
|
+
};
|
|
48
|
+
fileReader.readAsDataURL(file);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
FileReaderJS.setupInput(document.getElementById('file-input'), opts);
|
|
53
|
+
|
|
54
|
+
function generateJsPDFFontFile() {
|
|
55
|
+
var jsFile = '';
|
|
56
|
+
var fontName = document.getElementById('fontName').value;
|
|
57
|
+
var fontStyle = document.getElementById('fontStyle').value;
|
|
58
|
+
var createdFileName = fontName + '-' + fontStyle + '.ttf';
|
|
59
|
+
jsFile += 'window. ' + fontName + ' = \'' + window.loadedFileContents + '\';\n';
|
|
60
|
+
// jsFile += 'window.' + fontBase64 + ' = ' + fontName + ';\n';
|
|
61
|
+
|
|
62
|
+
var newJsfile = new File([jsFile], fontName + '-' + fontStyle + '.js', { type: 'text/plain;charset=utf-8' });
|
|
63
|
+
saveAs(newJsfile);
|
|
64
|
+
}
|
|
65
|
+
</script>
|
|
66
|
+
</body>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
Pure v1.0.0
|
|
3
|
+
Copyright 2013 Yahoo!
|
|
4
|
+
Licensed under the BSD License.
|
|
5
|
+
https://github.com/yahoo/pure/blob/master/LICENSE.md
|
|
6
|
+
*/
|
|
7
|
+
/*!
|
|
8
|
+
normalize.css v^3.0 | MIT License | git.io/normalize
|
|
9
|
+
Copyright (c) Nicolas Gallagher and Jonathan Neal
|
|
10
|
+
*/
|
|
11
|
+
/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */.pure-button:focus,a:active,a:hover{outline:0}.pure-table,table{border-collapse:collapse;border-spacing:0}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}abbr[title]{border-bottom:1px dotted}b,optgroup,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre,textarea{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}.pure-button,input{line-height:normal}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}.pure-button,.pure-form input:not([type]),.pure-menu{box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend,td,th{padding:0}legend{border:0}.hidden,[hidden]{display:none!important}.pure-img{max-width:100%;height:auto;display:block}.pure-g{letter-spacing:-.31em;text-rendering:optimizespeed;font-family:FreeSans,Arimo,"Droid Sans",Helvetica,Arial,sans-serif;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-align-content:flex-start;-ms-flex-line-pack:start;align-content:flex-start}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){table .pure-g{display:block}}.opera-only :-o-prefocus,.pure-g{word-spacing:-.43em}.pure-u,.pure-u-1,.pure-u-1-1,.pure-u-1-12,.pure-u-1-2,.pure-u-1-24,.pure-u-1-3,.pure-u-1-4,.pure-u-1-5,.pure-u-1-6,.pure-u-1-8,.pure-u-10-24,.pure-u-11-12,.pure-u-11-24,.pure-u-12-24,.pure-u-13-24,.pure-u-14-24,.pure-u-15-24,.pure-u-16-24,.pure-u-17-24,.pure-u-18-24,.pure-u-19-24,.pure-u-2-24,.pure-u-2-3,.pure-u-2-5,.pure-u-20-24,.pure-u-21-24,.pure-u-22-24,.pure-u-23-24,.pure-u-24-24,.pure-u-3-24,.pure-u-3-4,.pure-u-3-5,.pure-u-3-8,.pure-u-4-24,.pure-u-4-5,.pure-u-5-12,.pure-u-5-24,.pure-u-5-5,.pure-u-5-6,.pure-u-5-8,.pure-u-6-24,.pure-u-7-12,.pure-u-7-24,.pure-u-7-8,.pure-u-8-24,.pure-u-9-24{letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto;display:inline-block;zoom:1}.pure-g [class*=pure-u]{font-family:sans-serif}.pure-u-1-24{width:4.1667%}.pure-u-1-12,.pure-u-2-24{width:8.3333%}.pure-u-1-8,.pure-u-3-24{width:12.5%}.pure-u-1-6,.pure-u-4-24{width:16.6667%}.pure-u-1-5{width:20%}.pure-u-5-24{width:20.8333%}.pure-u-1-4,.pure-u-6-24{width:25%}.pure-u-7-24{width:29.1667%}.pure-u-1-3,.pure-u-8-24{width:33.3333%}.pure-u-3-8,.pure-u-9-24{width:37.5%}.pure-u-2-5{width:40%}.pure-u-10-24,.pure-u-5-12{width:41.6667%}.pure-u-11-24{width:45.8333%}.pure-u-1-2,.pure-u-12-24{width:50%}.pure-u-13-24{width:54.1667%}.pure-u-14-24,.pure-u-7-12{width:58.3333%}.pure-u-3-5{width:60%}.pure-u-15-24,.pure-u-5-8{width:62.5%}.pure-u-16-24,.pure-u-2-3{width:66.6667%}.pure-u-17-24{width:70.8333%}.pure-u-18-24,.pure-u-3-4{width:75%}.pure-u-19-24{width:79.1667%}.pure-u-4-5{width:80%}.pure-u-20-24,.pure-u-5-6{width:83.3333%}.pure-u-21-24,.pure-u-7-8{width:87.5%}.pure-u-11-12,.pure-u-22-24{width:91.6667%}.pure-u-23-24{width:95.8333%}.pure-u-1,.pure-u-1-1,.pure-u-24-24,.pure-u-5-5{width:100%}.pure-button{display:inline-block;zoom:1;white-space:nowrap;vertical-align:middle;text-align:center;cursor:pointer;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pure-button::-moz-focus-inner{padding:0;border:0}.pure-button-group{letter-spacing:-.31em;text-rendering:optimizespeed}.opera-only :-o-prefocus,.pure-button-group{word-spacing:-.43em}.pure-button{font-family:inherit;font-size:100%;padding:.5em 1em;color:#444;color:rgba(0,0,0,.8);border:1px solid #999;border:transparent;background-color:#E6E6E6;text-decoration:none;border-radius:2px}.pure-button-hover,.pure-button:focus,.pure-button:hover{filter:alpha(opacity=90);background-image:-webkit-linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1));background-image:linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1))}.pure-button-active,.pure-button:active{box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 0 6px rgba(0,0,0,.2) inset;border-color:#000\9}.pure-button-disabled,.pure-button-disabled:active,.pure-button-disabled:focus,.pure-button-disabled:hover,.pure-button[disabled]{border:none;background-image:none;filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none;pointer-events:none}.pure-button-hidden{display:none}.pure-button-primary,.pure-button-selected,a.pure-button-primary,a.pure-button-selected{background-color:#0078e7;color:#fff}.pure-button-group .pure-button{letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto;margin:0;border-radius:0;border-right:1px solid #111;border-right:1px solid rgba(0,0,0,.2)}.pure-button-group .pure-button:first-child{border-top-left-radius:2px;border-bottom-left-radius:2px}.pure-button-group .pure-button:last-child{border-top-right-radius:2px;border-bottom-right-radius:2px;border-right:none}.pure-form input[type=password],.pure-form input[type=email],.pure-form input[type=url],.pure-form input[type=date],.pure-form input[type=month],.pure-form input[type=time],.pure-form input[type=datetime],.pure-form input[type=datetime-local],.pure-form input[type=week],.pure-form input[type=tel],.pure-form input[type=color],.pure-form input[type=number],.pure-form input[type=search],.pure-form input[type=text],.pure-form select,.pure-form textarea{padding:.5em .6em;display:inline-block;border:1px solid #ccc;box-shadow:inset 0 1px 3px #ddd;border-radius:4px;vertical-align:middle;box-sizing:border-box}.pure-form input:not([type]){padding:.5em .6em;display:inline-block;border:1px solid #ccc;box-shadow:inset 0 1px 3px #ddd;border-radius:4px}.pure-form input[type=color]{padding:.2em .5em}.pure-form input:not([type]):focus,.pure-form input[type=password]:focus,.pure-form input[type=email]:focus,.pure-form input[type=url]:focus,.pure-form input[type=date]:focus,.pure-form input[type=month]:focus,.pure-form input[type=time]:focus,.pure-form input[type=datetime]:focus,.pure-form input[type=datetime-local]:focus,.pure-form input[type=week]:focus,.pure-form input[type=tel]:focus,.pure-form input[type=color]:focus,.pure-form input[type=number]:focus,.pure-form input[type=search]:focus,.pure-form input[type=text]:focus,.pure-form select:focus,.pure-form textarea:focus{outline:0;border-color:#129FEA}.pure-form input[type=file]:focus,.pure-form input[type=checkbox]:focus,.pure-form input[type=radio]:focus{outline:#129FEA auto 1px}.pure-form .pure-checkbox,.pure-form .pure-radio{margin:.5em 0;display:block}.pure-form input:not([type])[disabled],.pure-form input[type=password][disabled],.pure-form input[type=email][disabled],.pure-form input[type=url][disabled],.pure-form input[type=date][disabled],.pure-form input[type=month][disabled],.pure-form input[type=time][disabled],.pure-form input[type=datetime][disabled],.pure-form input[type=datetime-local][disabled],.pure-form input[type=week][disabled],.pure-form input[type=tel][disabled],.pure-form input[type=color][disabled],.pure-form input[type=number][disabled],.pure-form input[type=search][disabled],.pure-form input[type=text][disabled],.pure-form select[disabled],.pure-form textarea[disabled]{cursor:not-allowed;background-color:#eaeded;color:#cad2d3}.pure-form input[readonly],.pure-form select[readonly],.pure-form textarea[readonly]{background-color:#eee;color:#777;border-color:#ccc}.pure-form input:focus:invalid,.pure-form select:focus:invalid,.pure-form textarea:focus:invalid{color:#b94a48;border-color:#e9322d}.pure-form input[type=file]:focus:invalid:focus,.pure-form input[type=checkbox]:focus:invalid:focus,.pure-form input[type=radio]:focus:invalid:focus{outline-color:#e9322d}.pure-form select{height:2.25em;border:1px solid #ccc;background-color:#fff}.pure-form select[multiple]{height:auto}.pure-form label{margin:.5em 0 .2em}.pure-form fieldset{margin:0;padding:.35em 0 .75em;border:0}.pure-form legend{display:block;width:100%;padding:.3em 0;margin-bottom:.3em;color:#333;border-bottom:1px solid #e5e5e5}.pure-form-stacked input:not([type]),.pure-form-stacked input[type=password],.pure-form-stacked input[type=email],.pure-form-stacked input[type=url],.pure-form-stacked input[type=date],.pure-form-stacked input[type=month],.pure-form-stacked input[type=time],.pure-form-stacked input[type=datetime],.pure-form-stacked input[type=datetime-local],.pure-form-stacked input[type=week],.pure-form-stacked input[type=tel],.pure-form-stacked input[type=color],.pure-form-stacked input[type=file],.pure-form-stacked input[type=number],.pure-form-stacked input[type=search],.pure-form-stacked input[type=text],.pure-form-stacked label,.pure-form-stacked select,.pure-form-stacked textarea{display:block;margin:.25em 0}.pure-form-aligned .pure-help-inline,.pure-form-aligned input,.pure-form-aligned select,.pure-form-aligned textarea,.pure-form-message-inline{display:inline-block;vertical-align:middle}.pure-form-aligned textarea{vertical-align:top}.pure-form-aligned .pure-control-group{margin-bottom:.5em}.pure-form-aligned .pure-control-group label{text-align:right;display:inline-block;vertical-align:middle;width:10em;margin:0 1em 0 0}.pure-form-aligned .pure-controls{margin:1.5em 0 0 11em}.pure-form .pure-input-rounded,.pure-form input.pure-input-rounded{border-radius:2em;padding:.5em 1em}.pure-form .pure-group fieldset{margin-bottom:10px}.pure-form .pure-group input,.pure-form .pure-group textarea{display:block;padding:10px;margin:0 0 -1px;border-radius:0;position:relative;top:-1px}.pure-form .pure-group input:focus,.pure-form .pure-group textarea:focus{z-index:3}.pure-form .pure-group input:first-child,.pure-form .pure-group textarea:first-child{top:1px;border-radius:4px 4px 0 0;margin:0}.pure-form .pure-group input:first-child:last-child,.pure-form .pure-group textarea:first-child:last-child{top:1px;border-radius:4px;margin:0}.pure-form .pure-group input:last-child,.pure-form .pure-group textarea:last-child{top:-2px;border-radius:0 0 4px 4px;margin:0}.pure-form .pure-group button{margin:.35em 0}.pure-form .pure-input-1{width:100%}.pure-form .pure-input-3-4{width:75%}.pure-form .pure-input-2-3{width:66%}.pure-form .pure-input-1-2{width:50%}.pure-form .pure-input-1-3{width:33%}.pure-form .pure-input-1-4{width:25%}.pure-form .pure-help-inline,.pure-form-message-inline{display:inline-block;padding-left:.3em;color:#666;vertical-align:middle;font-size:.875em}.pure-form-message{display:block;color:#666;font-size:.875em}@media only screen and (max-width :480px){.pure-form button[type=submit]{margin:.7em 0 0}.pure-form input:not([type]),.pure-form input[type=password],.pure-form input[type=email],.pure-form input[type=url],.pure-form input[type=date],.pure-form input[type=month],.pure-form input[type=time],.pure-form input[type=datetime],.pure-form input[type=datetime-local],.pure-form input[type=week],.pure-form input[type=tel],.pure-form input[type=color],.pure-form input[type=number],.pure-form input[type=search],.pure-form input[type=text],.pure-form label{margin-bottom:.3em;display:block}.pure-group input:not([type]),.pure-group input[type=password],.pure-group input[type=email],.pure-group input[type=url],.pure-group input[type=date],.pure-group input[type=month],.pure-group input[type=time],.pure-group input[type=datetime],.pure-group input[type=datetime-local],.pure-group input[type=week],.pure-group input[type=tel],.pure-group input[type=color],.pure-group input[type=number],.pure-group input[type=search],.pure-group input[type=text]{margin-bottom:0}.pure-form-aligned .pure-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.pure-form-aligned .pure-controls{margin:1.5em 0 0}.pure-form .pure-help-inline,.pure-form-message,.pure-form-message-inline{display:block;font-size:.75em;padding:.2em 0 .8em}}.pure-menu-fixed{position:fixed;left:0;top:0;z-index:3}.pure-menu-item,.pure-menu-list{position:relative}.pure-menu-list{list-style:none;margin:0;padding:0}.pure-menu-item{padding:0;margin:0;height:100%}.pure-menu-heading,.pure-menu-link{display:block;text-decoration:none;white-space:nowrap}.pure-menu-horizontal{width:100%;white-space:nowrap}.pure-menu-horizontal .pure-menu-list{display:inline-block}.pure-menu-horizontal .pure-menu-heading,.pure-menu-horizontal .pure-menu-item,.pure-menu-horizontal .pure-menu-separator{display:inline-block;zoom:1;vertical-align:middle}.pure-menu-item .pure-menu-item{display:block}.pure-menu-children{display:none;position:absolute;left:100%;top:0;margin:0;padding:0;z-index:3}.pure-menu-horizontal .pure-menu-children{left:0;top:auto;width:inherit}.pure-menu-active>.pure-menu-children,.pure-menu-allow-hover:hover>.pure-menu-children{display:block;position:absolute}.pure-menu-has-children>.pure-menu-link:after{padding-left:.5em;content:"\25B8";font-size:small}.pure-menu-horizontal .pure-menu-has-children>.pure-menu-link:after{content:"\25BE"}.pure-menu-scrollable{overflow-y:scroll;overflow-x:hidden}.pure-menu-scrollable .pure-menu-list{display:block}.pure-menu-horizontal.pure-menu-scrollable .pure-menu-list{display:inline-block}.pure-menu-horizontal.pure-menu-scrollable{white-space:nowrap;overflow-y:hidden;overflow-x:auto;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;padding:.5em 0}.pure-menu-horizontal.pure-menu-scrollable::-webkit-scrollbar{display:none}.pure-menu-horizontal .pure-menu-children .pure-menu-separator,.pure-menu-separator{background-color:#ccc;height:1px;margin:.3em 0}.pure-menu-horizontal .pure-menu-separator{width:1px;height:1.3em;margin:0 .3em}.pure-menu-horizontal .pure-menu-children .pure-menu-separator{display:block;width:auto}.pure-menu-heading{text-transform:uppercase;color:#565d64}.pure-menu-link{color:#777}.pure-menu-children{background-color:#fff}.pure-menu-disabled,.pure-menu-heading,.pure-menu-link{padding:.5em 1em}.pure-menu-disabled{opacity:.5}.pure-menu-disabled .pure-menu-link:hover{background-color:transparent}.pure-menu-active>.pure-menu-link,.pure-menu-link:focus,.pure-menu-link:hover{background-color:#eee}.pure-menu-selected .pure-menu-link,.pure-menu-selected .pure-menu-link:visited{color:#000}.pure-table{empty-cells:show;border:1px solid #cbcbcb}.pure-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.pure-table td,.pure-table th{border-left:1px solid #cbcbcb;border-width:0 0 0 1px;font-size:inherit;margin:0;overflow:visible;padding:.5em 1em}.pure-table td:first-child,.pure-table th:first-child{border-left-width:0}.pure-table thead{background-color:#e0e0e0;color:#000;text-align:left;vertical-align:bottom}.pure-table td{background-color:transparent}.pure-table-odd td,.pure-table-striped tr:nth-child(2n-1) td{background-color:#f2f2f2}.pure-table-bordered td{border-bottom:1px solid #cbcbcb}.pure-table-bordered tbody>tr:last-child>td{border-bottom-width:0}.pure-table-horizontal td,.pure-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #cbcbcb}.pure-table-horizontal tbody>tr:last-child>td{border-bottom-width:0}
|