blitz-pdf 0.1.0 → 0.1.2

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 (114) hide show
  1. package/README.md +300 -10
  2. package/THIRD_PARTY_NOTICES.md +4 -2
  3. package/dist/browser.d.ts +1 -1
  4. package/dist/browser.d.ts.map +1 -1
  5. package/dist/document-options.d.ts +36 -0
  6. package/dist/document-options.d.ts.map +1 -0
  7. package/dist/document-options.js +236 -0
  8. package/dist/document-options.js.map +1 -0
  9. package/dist/node.d.ts +1 -1
  10. package/dist/node.d.ts.map +1 -1
  11. package/dist/options.d.ts +35 -1
  12. package/dist/options.d.ts.map +1 -1
  13. package/dist/options.js +21 -14
  14. package/dist/options.js.map +1 -1
  15. package/dist/types.d.ts +71 -1
  16. package/dist/types.d.ts.map +1 -1
  17. package/dist/validation.d.ts +2 -0
  18. package/dist/validation.d.ts.map +1 -0
  19. package/dist/validation.js +7 -0
  20. package/dist/validation.js.map +1 -0
  21. package/examples/zugferd.mjs +41 -0
  22. package/licenses/RUST_DEPENDENCIES.txt +27 -0
  23. package/package.json +3 -2
  24. package/src/browser.ts +1 -1
  25. package/src/document-options.ts +218 -0
  26. package/src/node.ts +1 -1
  27. package/src/options.ts +18 -13
  28. package/src/types.ts +76 -1
  29. package/src/validation.ts +6 -0
  30. package/vendor/README.md +27 -2
  31. package/vendor/krilla/.cargo-ok +1 -0
  32. package/vendor/krilla/.cargo_vcs_info.json +6 -0
  33. package/vendor/krilla/Cargo.lock +1357 -0
  34. package/vendor/krilla/Cargo.toml +165 -0
  35. package/vendor/krilla/LICENSE_APACHE +202 -0
  36. package/vendor/krilla/LICENSE_MIT +21 -0
  37. package/vendor/krilla/README.md +156 -0
  38. package/vendor/krilla/examples/basic.rs +117 -0
  39. package/vendor/krilla/examples/empty_document.rs +25 -0
  40. package/vendor/krilla/examples/parley.rs +174 -0
  41. package/vendor/krilla/examples/simple_text.rs +118 -0
  42. package/vendor/krilla/examples/stream_builder.rs +93 -0
  43. package/vendor/krilla/icc/LICENSE +116 -0
  44. package/vendor/krilla/icc/README.md +1 -0
  45. package/vendor/krilla/icc/sGrey-v2-magic.icc +0 -0
  46. package/vendor/krilla/icc/sGrey-v4.icc +0 -0
  47. package/vendor/krilla/icc/sRGB-v2-magic.icc +0 -0
  48. package/vendor/krilla/icc/sRGB-v4.icc +0 -0
  49. package/vendor/krilla/src/chunk_container.rs +503 -0
  50. package/vendor/krilla/src/configure/PDF_A1.md +227 -0
  51. package/vendor/krilla/src/configure/PDF_A2.md +269 -0
  52. package/vendor/krilla/src/configure/PDF_A3.md +31 -0
  53. package/vendor/krilla/src/configure/PDF_A4.md +211 -0
  54. package/vendor/krilla/src/configure/PDF_UA1.md +202 -0
  55. package/vendor/krilla/src/configure/README.md +23 -0
  56. package/vendor/krilla/src/configure/mod.rs +197 -0
  57. package/vendor/krilla/src/configure/validate.rs +1244 -0
  58. package/vendor/krilla/src/configure/version.rs +134 -0
  59. package/vendor/krilla/src/content.rs +1352 -0
  60. package/vendor/krilla/src/data.rs +49 -0
  61. package/vendor/krilla/src/document.rs +156 -0
  62. package/vendor/krilla/src/error.rs +170 -0
  63. package/vendor/krilla/src/geom.rs +341 -0
  64. package/vendor/krilla/src/graphics/blend.rs +46 -0
  65. package/vendor/krilla/src/graphics/color.rs +552 -0
  66. package/vendor/krilla/src/graphics/graphic.rs +30 -0
  67. package/vendor/krilla/src/graphics/graphics_state.rs +251 -0
  68. package/vendor/krilla/src/graphics/icc.rs +218 -0
  69. package/vendor/krilla/src/graphics/image.rs +835 -0
  70. package/vendor/krilla/src/graphics/mask.rs +128 -0
  71. package/vendor/krilla/src/graphics/mod.rs +14 -0
  72. package/vendor/krilla/src/graphics/paint.rs +434 -0
  73. package/vendor/krilla/src/graphics/separation.rs +86 -0
  74. package/vendor/krilla/src/graphics/shading_function.rs +865 -0
  75. package/vendor/krilla/src/graphics/shading_pattern.rs +60 -0
  76. package/vendor/krilla/src/graphics/tiling_pattern.rs +119 -0
  77. package/vendor/krilla/src/graphics/xobject.rs +150 -0
  78. package/vendor/krilla/src/interactive/action.rs +68 -0
  79. package/vendor/krilla/src/interactive/annotation.rs +283 -0
  80. package/vendor/krilla/src/interactive/destination.rs +289 -0
  81. package/vendor/krilla/src/interactive/mod.rs +3 -0
  82. package/vendor/krilla/src/interchange/embed.rs +240 -0
  83. package/vendor/krilla/src/interchange/metadata.rs +564 -0
  84. package/vendor/krilla/src/interchange/mod.rs +4 -0
  85. package/vendor/krilla/src/interchange/outline.rs +263 -0
  86. package/vendor/krilla/src/interchange/tagging/fmt.rs +733 -0
  87. package/vendor/krilla/src/interchange/tagging/generate.toml +474 -0
  88. package/vendor/krilla/src/interchange/tagging/generated.rs +4754 -0
  89. package/vendor/krilla/src/interchange/tagging/mod.rs +1324 -0
  90. package/vendor/krilla/src/interchange/tagging/tag.rs +686 -0
  91. package/vendor/krilla/src/lib.rs +179 -0
  92. package/vendor/krilla/src/num.rs +26 -0
  93. package/vendor/krilla/src/page.rs +612 -0
  94. package/vendor/krilla/src/pdf.rs +313 -0
  95. package/vendor/krilla/src/resource.rs +436 -0
  96. package/vendor/krilla/src/serialize.rs +1101 -0
  97. package/vendor/krilla/src/stream.rs +368 -0
  98. package/vendor/krilla/src/surface.rs +664 -0
  99. package/vendor/krilla/src/text/cid.rs +488 -0
  100. package/vendor/krilla/src/text/font.rs +351 -0
  101. package/vendor/krilla/src/text/glyph/bitmap.rs +81 -0
  102. package/vendor/krilla/src/text/glyph/colr.rs +581 -0
  103. package/vendor/krilla/src/text/glyph/mod.rs +205 -0
  104. package/vendor/krilla/src/text/glyph/outline.rs +72 -0
  105. package/vendor/krilla/src/text/glyph/svg.rs +34 -0
  106. package/vendor/krilla/src/text/group.rs +463 -0
  107. package/vendor/krilla/src/text/mod.rs +232 -0
  108. package/vendor/krilla/src/text/shape.rs +102 -0
  109. package/vendor/krilla/src/text/type3.rs +514 -0
  110. package/vendor/krilla/src/util.rs +286 -0
  111. package/vendor/stylo/properties/longhands.toml +0 -1
  112. package/vendor/stylo/stylesheets/rule_parser.rs +1 -1
  113. package/wasm/blitz_pdf.js +10 -5
  114. package/wasm/blitz_pdf_bg.wasm +0 -0
@@ -0,0 +1,436 @@
1
+ use std::collections::HashMap;
2
+ use std::fmt::Debug;
3
+ use std::hash::Hash;
4
+ use std::marker::PhantomData;
5
+
6
+ use pdf_writer::types::ProcSet;
7
+ use pdf_writer::writers;
8
+ use pdf_writer::{Chunk, Dict, Finish, Name, Ref};
9
+
10
+ use crate::serialize::{Cacheable, SerializeContext};
11
+ use crate::util::NameExt;
12
+
13
+ pub(crate) trait Resource {
14
+ fn new(ref_: Ref) -> Self;
15
+ fn get_ref(&self) -> Ref;
16
+ fn get_dict<'a>(resources: &'a mut writers::Resources) -> Dict<'a>;
17
+ fn get_prefix() -> &'static str;
18
+ fn get_mapper(b: &mut ResourceDictionaryBuilder) -> &mut ResourceMapper<Self>;
19
+ }
20
+
21
+ pub(crate) trait Resourceable: Cacheable {
22
+ type Resource: Resource;
23
+ }
24
+
25
+ #[derive(Debug, Eq, PartialEq, Hash, Clone)]
26
+ pub(crate) struct ExtGState(Ref);
27
+
28
+ impl Resource for ExtGState {
29
+ fn new(ref_: Ref) -> Self {
30
+ Self(ref_)
31
+ }
32
+
33
+ fn get_ref(&self) -> Ref {
34
+ self.0
35
+ }
36
+
37
+ fn get_dict<'a>(resources: &'a mut writers::Resources) -> Dict<'a> {
38
+ resources.ext_g_states()
39
+ }
40
+
41
+ fn get_prefix() -> &'static str {
42
+ "g"
43
+ }
44
+
45
+ fn get_mapper(b: &mut ResourceDictionaryBuilder) -> &mut ResourceMapper<ExtGState> {
46
+ &mut b.ext_g_states
47
+ }
48
+ }
49
+
50
+ #[derive(Debug, Eq, PartialEq, Hash, Clone)]
51
+ pub(crate) struct ColorSpace(Ref);
52
+
53
+ impl Resource for ColorSpace {
54
+ fn new(ref_: Ref) -> Self {
55
+ Self(ref_)
56
+ }
57
+
58
+ fn get_ref(&self) -> Ref {
59
+ self.0
60
+ }
61
+
62
+ fn get_dict<'a>(resources: &'a mut writers::Resources) -> Dict<'a> {
63
+ resources.color_spaces()
64
+ }
65
+
66
+ fn get_prefix() -> &'static str {
67
+ "c"
68
+ }
69
+
70
+ fn get_mapper(b: &mut ResourceDictionaryBuilder) -> &mut ResourceMapper<ColorSpace> {
71
+ &mut b.color_spaces
72
+ }
73
+ }
74
+
75
+ #[derive(Debug, Eq, PartialEq, Hash, Clone)]
76
+ pub(crate) struct Shading(Ref);
77
+
78
+ impl Resource for Shading {
79
+ fn new(ref_: Ref) -> Self {
80
+ Self(ref_)
81
+ }
82
+
83
+ fn get_ref(&self) -> Ref {
84
+ self.0
85
+ }
86
+
87
+ fn get_dict<'a>(resources: &'a mut writers::Resources) -> Dict<'a> {
88
+ resources.shadings()
89
+ }
90
+
91
+ fn get_prefix() -> &'static str {
92
+ "s"
93
+ }
94
+
95
+ fn get_mapper(b: &mut ResourceDictionaryBuilder) -> &mut ResourceMapper<Shading> {
96
+ &mut b.shadings
97
+ }
98
+ }
99
+
100
+ #[derive(Debug, Eq, PartialEq, Hash, Clone)]
101
+ pub(crate) struct XObject(Ref);
102
+
103
+ impl Resource for XObject {
104
+ fn new(ref_: Ref) -> Self {
105
+ Self(ref_)
106
+ }
107
+
108
+ fn get_ref(&self) -> Ref {
109
+ self.0
110
+ }
111
+
112
+ fn get_dict<'a>(resources: &'a mut writers::Resources) -> Dict<'a> {
113
+ resources.x_objects()
114
+ }
115
+
116
+ fn get_prefix() -> &'static str {
117
+ "x"
118
+ }
119
+
120
+ fn get_mapper(b: &mut ResourceDictionaryBuilder) -> &mut ResourceMapper<XObject> {
121
+ &mut b.x_objects
122
+ }
123
+ }
124
+
125
+ #[derive(Debug, Eq, PartialEq, Hash, Clone)]
126
+ pub(crate) struct Pattern(Ref);
127
+
128
+ impl Resource for Pattern {
129
+ fn new(ref_: Ref) -> Self {
130
+ Self(ref_)
131
+ }
132
+
133
+ fn get_ref(&self) -> Ref {
134
+ self.0
135
+ }
136
+
137
+ fn get_dict<'a>(resources: &'a mut writers::Resources) -> Dict<'a> {
138
+ resources.patterns()
139
+ }
140
+
141
+ fn get_prefix() -> &'static str {
142
+ "p"
143
+ }
144
+
145
+ fn get_mapper(b: &mut ResourceDictionaryBuilder) -> &mut ResourceMapper<Pattern> {
146
+ &mut b.patterns
147
+ }
148
+ }
149
+
150
+ #[derive(Debug, Eq, PartialEq, Hash, Clone)]
151
+ pub(crate) struct Font(Ref);
152
+
153
+ impl Resource for Font {
154
+ fn new(ref_: Ref) -> Self {
155
+ Self(ref_)
156
+ }
157
+
158
+ fn get_ref(&self) -> Ref {
159
+ self.0
160
+ }
161
+
162
+ fn get_dict<'a>(resources: &'a mut writers::Resources) -> Dict<'a> {
163
+ resources.fonts()
164
+ }
165
+
166
+ fn get_prefix() -> &'static str {
167
+ "f"
168
+ }
169
+
170
+ fn get_mapper(b: &mut ResourceDictionaryBuilder) -> &mut ResourceMapper<Font> {
171
+ &mut b.fonts
172
+ }
173
+ }
174
+
175
+ #[derive(Debug)]
176
+ pub(crate) struct ResourceDictionaryBuilder {
177
+ pub(crate) color_spaces: ResourceMapper<ColorSpace>,
178
+ pub(crate) ext_g_states: ResourceMapper<ExtGState>,
179
+ pub(crate) patterns: ResourceMapper<Pattern>,
180
+ pub(crate) x_objects: ResourceMapper<XObject>,
181
+ pub(crate) shadings: ResourceMapper<Shading>,
182
+ pub(crate) fonts: ResourceMapper<Font>,
183
+ }
184
+
185
+ impl ResourceDictionaryBuilder {
186
+ pub(crate) fn new() -> Self {
187
+ Self {
188
+ color_spaces: ResourceMapper::new(),
189
+ ext_g_states: ResourceMapper::new(),
190
+ patterns: ResourceMapper::new(),
191
+ x_objects: ResourceMapper::new(),
192
+ shadings: ResourceMapper::new(),
193
+ fonts: ResourceMapper::new(),
194
+ }
195
+ }
196
+
197
+ pub(crate) fn register_resource<T>(&mut self, obj: T) -> String
198
+ where
199
+ T: Resource,
200
+ {
201
+ T::get_mapper(self).remap_with_name(obj.get_ref())
202
+ }
203
+
204
+ pub(crate) fn finish(self) -> ResourceDictionary {
205
+ ResourceDictionary {
206
+ color_spaces: self.color_spaces.into_resource_list(),
207
+ ext_g_states: self.ext_g_states.into_resource_list(),
208
+ patterns: self.patterns.into_resource_list(),
209
+ x_objects: self.x_objects.into_resource_list(),
210
+ shadings: self.shadings.into_resource_list(),
211
+ fonts: self.fonts.into_resource_list(),
212
+ }
213
+ }
214
+ }
215
+
216
+ #[derive(Debug, Eq, PartialEq, Hash, Clone)]
217
+ pub(crate) struct ResourceDictionary {
218
+ pub(crate) color_spaces: ResourceList<ColorSpace>,
219
+ pub(crate) ext_g_states: ResourceList<ExtGState>,
220
+ pub(crate) patterns: ResourceList<Pattern>,
221
+ pub(crate) x_objects: ResourceList<XObject>,
222
+ pub(crate) shadings: ResourceList<Shading>,
223
+ pub(crate) fonts: ResourceList<Font>,
224
+ }
225
+
226
+ impl Default for ResourceDictionary {
227
+ fn default() -> Self {
228
+ Self {
229
+ color_spaces: ResourceList::empty(),
230
+ ext_g_states: ResourceList::empty(),
231
+ patterns: ResourceList::empty(),
232
+ x_objects: ResourceList::empty(),
233
+ shadings: ResourceList::empty(),
234
+ fonts: ResourceList::empty(),
235
+ }
236
+ }
237
+ }
238
+
239
+ pub(crate) type ResourceNumber = u32;
240
+
241
+ impl ResourceDictionary {
242
+ pub fn to_pdf_resources<T>(
243
+ &self,
244
+ parent: &mut T,
245
+ sc: &mut SerializeContext,
246
+ resources_chunk: &mut Chunk,
247
+ ) where
248
+ T: ResourcesExt,
249
+ {
250
+ let write_proc_sets = !sc.serialize_settings().pdf_version().deprecates_proc_sets();
251
+ let has_resource_entries = self.color_spaces.len() > 0
252
+ || self.ext_g_states.len() > 0
253
+ || self.patterns.len() > 0
254
+ || self.x_objects.len() > 0
255
+ || self.shadings.len() > 0
256
+ || self.fonts.len() > 0;
257
+
258
+ if !write_proc_sets && !has_resource_entries {
259
+ // `Resources` dictionary is mandatory (or rather, it's mandatory if
260
+ // there isn't a parent resource dictionary to inherit from, but we just
261
+ // assume it is always mandatory), so just write an empty one as a direct
262
+ // object instead of an indirect object, for aesthetic reasons.
263
+ parent.resources().finish();
264
+ return;
265
+ }
266
+
267
+ let resources_ref = sc.new_ref();
268
+ let mut resources = resources_chunk
269
+ .indirect(resources_ref)
270
+ .start::<writers::Resources>();
271
+ if write_proc_sets {
272
+ resources.proc_sets([
273
+ ProcSet::Pdf,
274
+ ProcSet::Text,
275
+ ProcSet::ImageColor,
276
+ ProcSet::ImageGrayscale,
277
+ ]);
278
+ }
279
+ write_resource_type::<ColorSpace>(&mut resources, &self.color_spaces);
280
+ write_resource_type::<ExtGState>(&mut resources, &self.ext_g_states);
281
+ write_resource_type::<Pattern>(&mut resources, &self.patterns);
282
+ write_resource_type::<XObject>(&mut resources, &self.x_objects);
283
+ write_resource_type::<Shading>(&mut resources, &self.shadings);
284
+ write_resource_type::<Font>(&mut resources, &self.fonts);
285
+ parent.set_resources(resources_ref);
286
+ }
287
+ }
288
+
289
+ fn write_resource_type<T>(resources: &mut writers::Resources, resource_list: &ResourceList<T>)
290
+ where
291
+ T: Resource,
292
+ {
293
+ if resource_list.len() > 0 {
294
+ let mut dict = T::get_dict(resources);
295
+
296
+ for (name, entry) in resource_list.get_entries() {
297
+ dict.pair(name.to_pdf_name(), entry);
298
+ }
299
+
300
+ dict.finish();
301
+ }
302
+ }
303
+
304
+ #[derive(Debug, Eq, PartialEq, Hash, Clone, Default)]
305
+ pub(crate) struct ResourceList<V> {
306
+ entries: Vec<Ref>,
307
+ phantom: PhantomData<V>,
308
+ }
309
+
310
+ impl<T> ResourceList<T>
311
+ where
312
+ T: Resource,
313
+ {
314
+ pub(crate) fn empty() -> ResourceList<T> {
315
+ Self {
316
+ entries: vec![],
317
+ phantom: Default::default(),
318
+ }
319
+ }
320
+
321
+ pub(crate) fn len(&self) -> u32 {
322
+ self.entries.len() as u32
323
+ }
324
+
325
+ fn name_from_number(num: ResourceNumber) -> String {
326
+ format!("{}{}", T::get_prefix(), num)
327
+ }
328
+
329
+ pub(crate) fn get_entries(&self) -> impl Iterator<Item = (String, Ref)> + '_ {
330
+ self.entries
331
+ .iter()
332
+ .enumerate()
333
+ .map(|(i, r)| (Self::name_from_number(i as ResourceNumber), *r))
334
+ }
335
+ }
336
+
337
+ #[derive(Debug, Eq, PartialEq)]
338
+ pub(crate) struct ResourceMapper<T: ?Sized> {
339
+ forward: Vec<Ref>,
340
+ backward: HashMap<Ref, ResourceNumber>,
341
+ phantom: PhantomData<T>,
342
+ }
343
+
344
+ impl<T> ResourceMapper<T>
345
+ where
346
+ T: Resource,
347
+ {
348
+ pub(crate) fn new() -> Self {
349
+ Self {
350
+ forward: Vec::new(),
351
+ backward: HashMap::new(),
352
+ phantom: PhantomData,
353
+ }
354
+ }
355
+
356
+ pub(crate) fn remap(&mut self, ref_: Ref) -> ResourceNumber {
357
+ let forward = &mut self.forward;
358
+ let backward = &mut self.backward;
359
+
360
+ *backward.entry(ref_).or_insert_with(|| {
361
+ let old = forward.len();
362
+ forward.push(ref_);
363
+ old as ResourceNumber
364
+ })
365
+ }
366
+
367
+ pub(crate) fn remap_with_name(&mut self, ref_: Ref) -> String {
368
+ Self::name_from_number(self.remap(ref_))
369
+ }
370
+
371
+ fn name_from_number(num: ResourceNumber) -> String {
372
+ format!("{}{}", T::get_prefix(), num)
373
+ }
374
+
375
+ pub(crate) fn into_resource_list(self) -> ResourceList<T> {
376
+ ResourceList {
377
+ entries: self.forward,
378
+ phantom: Default::default(),
379
+ }
380
+ }
381
+ }
382
+
383
+ pub(crate) trait ResourcesExt {
384
+ fn resources(&mut self) -> writers::Resources<'_>;
385
+ fn set_resources(&mut self, resources_ref: Ref);
386
+ }
387
+
388
+ impl ResourcesExt for writers::FormXObject<'_> {
389
+ fn resources(&mut self) -> writers::Resources<'_> {
390
+ self.resources()
391
+ }
392
+
393
+ fn set_resources(&mut self, resources_ref: Ref) {
394
+ self.pair(Name(b"Resources"), resources_ref);
395
+ }
396
+ }
397
+
398
+ impl ResourcesExt for writers::TilingPattern<'_> {
399
+ fn resources(&mut self) -> writers::Resources<'_> {
400
+ self.resources()
401
+ }
402
+
403
+ fn set_resources(&mut self, resources_ref: Ref) {
404
+ self.pair(Name(b"Resources"), resources_ref);
405
+ }
406
+ }
407
+
408
+ impl ResourcesExt for writers::Type3Font<'_> {
409
+ fn resources(&mut self) -> writers::Resources<'_> {
410
+ self.resources()
411
+ }
412
+
413
+ fn set_resources(&mut self, resources_ref: Ref) {
414
+ self.pair(Name(b"Resources"), resources_ref);
415
+ }
416
+ }
417
+
418
+ impl ResourcesExt for writers::Pages<'_> {
419
+ fn resources(&mut self) -> writers::Resources<'_> {
420
+ self.resources()
421
+ }
422
+
423
+ fn set_resources(&mut self, resources_ref: Ref) {
424
+ self.pair(Name(b"Resources"), resources_ref);
425
+ }
426
+ }
427
+
428
+ impl ResourcesExt for writers::Page<'_> {
429
+ fn resources(&mut self) -> writers::Resources<'_> {
430
+ self.resources()
431
+ }
432
+
433
+ fn set_resources(&mut self, resources_ref: Ref) {
434
+ self.pair(Name(b"Resources"), resources_ref);
435
+ }
436
+ }