@hadi77ir/pdfme-svg 0.1.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.
Files changed (242) hide show
  1. package/README.md +63 -0
  2. package/dist/applyparseattributes.d.ts +6 -0
  3. package/dist/applyparseattributes.d.ts.map +1 -0
  4. package/dist/applyparseattributes.js +333 -0
  5. package/dist/applyparseattributes.js.map +1 -0
  6. package/dist/context/attributestate.d.ts +34 -0
  7. package/dist/context/attributestate.d.ts.map +1 -0
  8. package/dist/context/attributestate.js +109 -0
  9. package/dist/context/attributestate.js.map +1 -0
  10. package/dist/context/context.d.ts +59 -0
  11. package/dist/context/context.d.ts.map +1 -0
  12. package/dist/context/context.js +46 -0
  13. package/dist/context/context.js.map +1 -0
  14. package/dist/context/referenceshandler.d.ts +15 -0
  15. package/dist/context/referenceshandler.d.ts.map +1 -0
  16. package/dist/context/referenceshandler.js +31 -0
  17. package/dist/context/referenceshandler.js.map +1 -0
  18. package/dist/context/stylesheets.d.ts +13 -0
  19. package/dist/context/stylesheets.d.ts.map +1 -0
  20. package/dist/context/stylesheets.js +163 -0
  21. package/dist/context/stylesheets.js.map +1 -0
  22. package/dist/context/textmeasure.d.ts +19 -0
  23. package/dist/context/textmeasure.d.ts.map +1 -0
  24. package/dist/context/textmeasure.js +93 -0
  25. package/dist/context/textmeasure.js.map +1 -0
  26. package/dist/context/viewport.d.ts +6 -0
  27. package/dist/context/viewport.d.ts.map +1 -0
  28. package/dist/context/viewport.js +7 -0
  29. package/dist/context/viewport.js.map +1 -0
  30. package/dist/fill/ColorFill.d.ts +10 -0
  31. package/dist/fill/ColorFill.d.ts.map +1 -0
  32. package/dist/fill/ColorFill.js +10 -0
  33. package/dist/fill/ColorFill.js.map +1 -0
  34. package/dist/fill/Fill.d.ts +14 -0
  35. package/dist/fill/Fill.d.ts.map +1 -0
  36. package/dist/fill/Fill.js +2 -0
  37. package/dist/fill/Fill.js.map +1 -0
  38. package/dist/fill/GradientFill.d.ts +11 -0
  39. package/dist/fill/GradientFill.d.ts.map +1 -0
  40. package/dist/fill/GradientFill.js +37 -0
  41. package/dist/fill/GradientFill.js.map +1 -0
  42. package/dist/fill/PatternFill.d.ts +11 -0
  43. package/dist/fill/PatternFill.d.ts.map +1 -0
  44. package/dist/fill/PatternFill.js +67 -0
  45. package/dist/fill/PatternFill.js.map +1 -0
  46. package/dist/fill/parseFill.d.ts +4 -0
  47. package/dist/fill/parseFill.d.ts.map +1 -0
  48. package/dist/fill/parseFill.js +61 -0
  49. package/dist/fill/parseFill.js.map +1 -0
  50. package/dist/index.d.ts +7 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +232 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/jspdf-shim.d.ts +132 -0
  55. package/dist/jspdf-shim.d.ts.map +1 -0
  56. package/dist/jspdf-shim.js +744 -0
  57. package/dist/jspdf-shim.js.map +1 -0
  58. package/dist/jspdf.d.ts +2 -0
  59. package/dist/jspdf.d.ts.map +1 -0
  60. package/dist/jspdf.js +2 -0
  61. package/dist/jspdf.js.map +1 -0
  62. package/dist/markerlist.d.ts +24 -0
  63. package/dist/markerlist.d.ts.map +1 -0
  64. package/dist/markerlist.js +47 -0
  65. package/dist/markerlist.js.map +1 -0
  66. package/dist/nodes/anchor.d.ts +6 -0
  67. package/dist/nodes/anchor.d.ts.map +1 -0
  68. package/dist/nodes/anchor.js +15 -0
  69. package/dist/nodes/anchor.js.map +1 -0
  70. package/dist/nodes/circle.d.ts +11 -0
  71. package/dist/nodes/circle.d.ts.map +1 -0
  72. package/dist/nodes/circle.js +17 -0
  73. package/dist/nodes/circle.js.map +1 -0
  74. package/dist/nodes/clippath.d.ts +10 -0
  75. package/dist/nodes/clippath.d.ts.map +1 -0
  76. package/dist/nodes/clippath.js +48 -0
  77. package/dist/nodes/clippath.js.map +1 -0
  78. package/dist/nodes/containernode.d.ts +8 -0
  79. package/dist/nodes/containernode.d.ts.map +1 -0
  80. package/dist/nodes/containernode.js +13 -0
  81. package/dist/nodes/containernode.js.map +1 -0
  82. package/dist/nodes/ellipse.d.ts +9 -0
  83. package/dist/nodes/ellipse.d.ts.map +1 -0
  84. package/dist/nodes/ellipse.js +14 -0
  85. package/dist/nodes/ellipse.js.map +1 -0
  86. package/dist/nodes/ellipsebase.d.ts +14 -0
  87. package/dist/nodes/ellipsebase.d.ts.map +1 -0
  88. package/dist/nodes/ellipsebase.js +30 -0
  89. package/dist/nodes/ellipsebase.js.map +1 -0
  90. package/dist/nodes/geometrynode.d.ts +19 -0
  91. package/dist/nodes/geometrynode.d.ts.map +1 -0
  92. package/dist/nodes/geometrynode.js +213 -0
  93. package/dist/nodes/geometrynode.js.map +1 -0
  94. package/dist/nodes/gradient.d.ts +28 -0
  95. package/dist/nodes/gradient.d.ts.map +1 -0
  96. package/dist/nodes/gradient.js +87 -0
  97. package/dist/nodes/gradient.js.map +1 -0
  98. package/dist/nodes/graphicsnode.d.ts +4 -0
  99. package/dist/nodes/graphicsnode.d.ts.map +1 -0
  100. package/dist/nodes/graphicsnode.js +4 -0
  101. package/dist/nodes/graphicsnode.js.map +1 -0
  102. package/dist/nodes/group.d.ts +8 -0
  103. package/dist/nodes/group.d.ts.map +1 -0
  104. package/dist/nodes/group.js +11 -0
  105. package/dist/nodes/group.js.map +1 -0
  106. package/dist/nodes/image.d.ts +23 -0
  107. package/dist/nodes/image.d.ts.map +1 -0
  108. package/dist/nodes/image.js +152 -0
  109. package/dist/nodes/image.js.map +1 -0
  110. package/dist/nodes/line.d.ts +13 -0
  111. package/dist/nodes/line.d.ts.map +1 -0
  112. package/dist/nodes/line.js +30 -0
  113. package/dist/nodes/line.js.map +1 -0
  114. package/dist/nodes/lineargradient.d.ts +7 -0
  115. package/dist/nodes/lineargradient.d.ts.map +1 -0
  116. package/dist/nodes/lineargradient.js +15 -0
  117. package/dist/nodes/lineargradient.js.map +1 -0
  118. package/dist/nodes/marker.d.ts +11 -0
  119. package/dist/nodes/marker.d.ts.map +1 -0
  120. package/dist/nodes/marker.js +70 -0
  121. package/dist/nodes/marker.js.map +1 -0
  122. package/dist/nodes/nonrenderednode.d.ts +11 -0
  123. package/dist/nodes/nonrenderednode.d.ts.map +1 -0
  124. package/dist/nodes/nonrenderednode.js +15 -0
  125. package/dist/nodes/nonrenderednode.js.map +1 -0
  126. package/dist/nodes/path.d.ts +12 -0
  127. package/dist/nodes/path.d.ts.map +1 -0
  128. package/dist/nodes/path.js +75 -0
  129. package/dist/nodes/path.js.map +1 -0
  130. package/dist/nodes/pattern.d.ts +11 -0
  131. package/dist/nodes/pattern.d.ts.map +1 -0
  132. package/dist/nodes/pattern.js +39 -0
  133. package/dist/nodes/pattern.js.map +1 -0
  134. package/dist/nodes/polygon.d.ts +6 -0
  135. package/dist/nodes/polygon.d.ts.map +1 -0
  136. package/dist/nodes/polygon.js +7 -0
  137. package/dist/nodes/polygon.js.map +1 -0
  138. package/dist/nodes/polyline.d.ts +6 -0
  139. package/dist/nodes/polyline.d.ts.map +1 -0
  140. package/dist/nodes/polyline.js +7 -0
  141. package/dist/nodes/polyline.js.map +1 -0
  142. package/dist/nodes/radialgradient.d.ts +7 -0
  143. package/dist/nodes/radialgradient.d.ts.map +1 -0
  144. package/dist/nodes/radialgradient.js +21 -0
  145. package/dist/nodes/radialgradient.js.map +1 -0
  146. package/dist/nodes/rect.d.ts +12 -0
  147. package/dist/nodes/rect.d.ts.map +1 -0
  148. package/dist/nodes/rect.js +50 -0
  149. package/dist/nodes/rect.js.map +1 -0
  150. package/dist/nodes/renderednode.d.ts +7 -0
  151. package/dist/nodes/renderednode.d.ts.map +1 -0
  152. package/dist/nodes/renderednode.js +43 -0
  153. package/dist/nodes/renderednode.js.map +1 -0
  154. package/dist/nodes/svg.d.ts +21 -0
  155. package/dist/nodes/svg.d.ts.map +1 -0
  156. package/dist/nodes/svg.js +175 -0
  157. package/dist/nodes/svg.js.map +1 -0
  158. package/dist/nodes/svgnode.d.ts +18 -0
  159. package/dist/nodes/svgnode.d.ts.map +1 -0
  160. package/dist/nodes/svgnode.js +30 -0
  161. package/dist/nodes/svgnode.js.map +1 -0
  162. package/dist/nodes/symbol.d.ts +10 -0
  163. package/dist/nodes/symbol.d.ts.map +1 -0
  164. package/dist/nodes/symbol.js +62 -0
  165. package/dist/nodes/symbol.js.map +1 -0
  166. package/dist/nodes/text.d.ts +13 -0
  167. package/dist/nodes/text.d.ts.map +1 -0
  168. package/dist/nodes/text.js +172 -0
  169. package/dist/nodes/text.js.map +1 -0
  170. package/dist/nodes/traverse.d.ts +15 -0
  171. package/dist/nodes/traverse.d.ts.map +1 -0
  172. package/dist/nodes/traverse.js +47 -0
  173. package/dist/nodes/traverse.js.map +1 -0
  174. package/dist/nodes/use.d.ts +15 -0
  175. package/dist/nodes/use.d.ts.map +1 -0
  176. package/dist/nodes/use.js +99 -0
  177. package/dist/nodes/use.js.map +1 -0
  178. package/dist/nodes/void.d.ts +11 -0
  179. package/dist/nodes/void.d.ts.map +1 -0
  180. package/dist/nodes/void.js +19 -0
  181. package/dist/nodes/void.js.map +1 -0
  182. package/dist/parse.d.ts +5 -0
  183. package/dist/parse.d.ts.map +1 -0
  184. package/dist/parse.js +96 -0
  185. package/dist/parse.js.map +1 -0
  186. package/dist/svg2pdf.d.ts +10 -0
  187. package/dist/svg2pdf.d.ts.map +1 -0
  188. package/dist/svg2pdf.js +49 -0
  189. package/dist/svg2pdf.js.map +1 -0
  190. package/dist/textchunk.d.ts +36 -0
  191. package/dist/textchunk.d.ts.map +1 -0
  192. package/dist/textchunk.js +144 -0
  193. package/dist/textchunk.js.map +1 -0
  194. package/dist/utils/applyclippath.d.ts +6 -0
  195. package/dist/utils/applyclippath.d.ts.map +1 -0
  196. package/dist/utils/applyclippath.js +20 -0
  197. package/dist/utils/applyclippath.js.map +1 -0
  198. package/dist/utils/bbox.d.ts +6 -0
  199. package/dist/utils/bbox.d.ts.map +1 -0
  200. package/dist/utils/bbox.js +62 -0
  201. package/dist/utils/bbox.js.map +1 -0
  202. package/dist/utils/constants.d.ts +7 -0
  203. package/dist/utils/constants.d.ts.map +1 -0
  204. package/dist/utils/constants.js +17 -0
  205. package/dist/utils/constants.js.map +1 -0
  206. package/dist/utils/fonts.d.ts +14 -0
  207. package/dist/utils/fonts.d.ts.map +1 -0
  208. package/dist/utils/fonts.js +59 -0
  209. package/dist/utils/fonts.js.map +1 -0
  210. package/dist/utils/geometry.d.ts +11 -0
  211. package/dist/utils/geometry.d.ts.map +1 -0
  212. package/dist/utils/geometry.js +26 -0
  213. package/dist/utils/geometry.js.map +1 -0
  214. package/dist/utils/misc.d.ts +12 -0
  215. package/dist/utils/misc.d.ts.map +1 -0
  216. package/dist/utils/misc.js +26 -0
  217. package/dist/utils/misc.js.map +1 -0
  218. package/dist/utils/node.d.ts +9 -0
  219. package/dist/utils/node.d.ts.map +1 -0
  220. package/dist/utils/node.js +58 -0
  221. package/dist/utils/node.js.map +1 -0
  222. package/dist/utils/parsing.d.ts +13 -0
  223. package/dist/utils/parsing.d.ts.map +1 -0
  224. package/dist/utils/parsing.js +41 -0
  225. package/dist/utils/parsing.js.map +1 -0
  226. package/dist/utils/path.d.ts +39 -0
  227. package/dist/utils/path.d.ts.map +1 -0
  228. package/dist/utils/path.js +86 -0
  229. package/dist/utils/path.js.map +1 -0
  230. package/dist/utils/rgbcolor.d.ts +15 -0
  231. package/dist/utils/rgbcolor.d.ts.map +1 -0
  232. package/dist/utils/rgbcolor.js +297 -0
  233. package/dist/utils/rgbcolor.js.map +1 -0
  234. package/dist/utils/text.d.ts +15 -0
  235. package/dist/utils/text.d.ts.map +1 -0
  236. package/dist/utils/text.js +57 -0
  237. package/dist/utils/text.js.map +1 -0
  238. package/dist/utils/transform.d.ts +5 -0
  239. package/dist/utils/transform.d.ts.map +1 -0
  240. package/dist/utils/transform.js +113 -0
  241. package/dist/utils/transform.js.map +1 -0
  242. package/package.json +57 -0
@@ -0,0 +1,99 @@
1
+ import { Context } from '../context/context';
2
+ import { defaultBoundingBox } from '../utils/bbox';
3
+ import { getAttribute, nodeIs, svgNodeIsVisible } from '../utils/node';
4
+ import { GraphicsNode } from './graphicsnode';
5
+ import { computeViewBoxTransform } from '../utils/transform';
6
+ import { parseFloats } from '../utils/parsing';
7
+ import { Symbol } from './symbol';
8
+ import { Viewport } from '../context/viewport';
9
+ import { AttributeState } from '../context/attributestate';
10
+ /**
11
+ * Draws the element referenced by a use node, makes use of pdf's XObjects/FormObjects so nodes are only written once
12
+ * to the pdf document. This highly reduces the file size and computation time.
13
+ */
14
+ export class Use extends GraphicsNode {
15
+ async renderCore(context) {
16
+ const pf = parseFloat;
17
+ const url = this.element.getAttribute('href') || this.element.getAttribute('xlink:href');
18
+ // just in case someone has the idea to use empty use-tags, wtf???
19
+ if (!url)
20
+ return;
21
+ // get the size of the referenced form object (to apply the correct scaling)
22
+ const id = url.substring(1);
23
+ const refNode = context.refsHandler.get(id);
24
+ const refNodeOpensViewport = nodeIs(refNode.element, 'symbol,svg') && refNode.element.hasAttribute('viewBox');
25
+ // scale and position it right
26
+ let x = pf(getAttribute(this.element, context.styleSheets, 'x') || '0');
27
+ let y = pf(getAttribute(this.element, context.styleSheets, 'y') || '0');
28
+ // calculate the transformation matrix
29
+ let width = undefined;
30
+ let height = undefined;
31
+ let t;
32
+ if (refNodeOpensViewport) {
33
+ // <use> inherits width/height only to svg/symbol
34
+ // if there is no viewBox attribute, width/height don't have an effect
35
+ // in theory, the default value for width/height is 100%, but we currently don't support this
36
+ width = pf(getAttribute(this.element, context.styleSheets, 'width') ||
37
+ getAttribute(refNode.element, context.styleSheets, 'width') ||
38
+ '0');
39
+ height = pf(getAttribute(this.element, context.styleSheets, 'height') ||
40
+ getAttribute(refNode.element, context.styleSheets, 'height') ||
41
+ '0');
42
+ // accumulate x/y to calculate the viewBox transform
43
+ x += pf(getAttribute(refNode.element, context.styleSheets, 'x') || '0');
44
+ y += pf(getAttribute(refNode.element, context.styleSheets, 'y') || '0');
45
+ const viewBox = parseFloats(refNode.element.getAttribute('viewBox'));
46
+ t = computeViewBoxTransform(refNode.element, viewBox, x, y, width, height, context);
47
+ }
48
+ else {
49
+ t = context.pdf.Matrix(1, 0, 0, 1, x, y);
50
+ }
51
+ const contextColors = AttributeState.getContextColors(context, true);
52
+ const refContext = new Context(context.pdf, {
53
+ refsHandler: context.refsHandler,
54
+ styleSheets: context.styleSheets,
55
+ withinUse: true,
56
+ viewport: refNodeOpensViewport ? new Viewport(width, height) : context.viewport,
57
+ svg2pdfParameters: context.svg2pdfParameters,
58
+ textMeasure: context.textMeasure,
59
+ attributeState: Object.assign(AttributeState.default(), contextColors)
60
+ });
61
+ await context.refsHandler.getRendered(id, contextColors, node => Use.renderReferencedNode(node, id, refContext));
62
+ context.pdf.saveGraphicsState();
63
+ context.pdf.setCurrentTransformationMatrix(context.transform);
64
+ // apply the bbox (i.e. clip) if needed
65
+ if (refNodeOpensViewport &&
66
+ getAttribute(refNode.element, context.styleSheets, 'overflow') !== 'visible') {
67
+ context.pdf.rect(x, y, width, height);
68
+ context.pdf.clip().discardPath();
69
+ }
70
+ context.pdf.doFormObject(context.refsHandler.generateKey(id, contextColors), t);
71
+ context.pdf.restoreGraphicsState();
72
+ }
73
+ static async renderReferencedNode(node, id, refContext) {
74
+ let bBox = node.getBoundingBox(refContext);
75
+ // The content of a PDF form object is implicitly clipped at its /BBox property.
76
+ // SVG, however, applies its clip rect at the <use> attribute, which may modify it.
77
+ // So, make the bBox a lot larger than it needs to be and hope any thick strokes are
78
+ // still within.
79
+ bBox = [bBox[0] - 0.5 * bBox[2], bBox[1] - 0.5 * bBox[3], bBox[2] * 2, bBox[3] * 2];
80
+ refContext.pdf.beginFormObject(bBox[0], bBox[1], bBox[2], bBox[3], refContext.pdf.unitMatrix);
81
+ if (node instanceof Symbol) {
82
+ await node.apply(refContext);
83
+ }
84
+ else {
85
+ await node.render(refContext);
86
+ }
87
+ refContext.pdf.endFormObject(refContext.refsHandler.generateKey(id, refContext.attributeState));
88
+ }
89
+ getBoundingBoxCore(context) {
90
+ return defaultBoundingBox(this.element, context);
91
+ }
92
+ isVisible(parentVisible, context) {
93
+ return svgNodeIsVisible(this, parentVisible, context);
94
+ }
95
+ computeNodeTransformCore(context) {
96
+ return context.pdf.unitMatrix;
97
+ }
98
+ }
99
+ //# sourceMappingURL=use.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use.js","sourceRoot":"","sources":["../../src/nodes/use.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAE1D;;;GAGG;AACH,MAAM,OAAO,GAAI,SAAQ,YAAY;IACzB,KAAK,CAAC,UAAU,CAAC,OAAgB;QACzC,MAAM,EAAE,GAAG,UAAU,CAAA;QAErB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,CAAA;QACxF,kEAAkE;QAClE,IAAI,CAAC,GAAG;YAAE,OAAM;QAEhB,4EAA4E;QAC5E,MAAM,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QAC3B,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC3C,MAAM,oBAAoB,GACxB,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,CAAA;QAElF,8BAA8B;QAC9B,IAAI,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,CAAA;QACvE,IAAI,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,CAAA;QAEvE,uCAAuC;QACvC,IAAI,KAAK,GAAuB,SAAS,CAAA;QACzC,IAAI,MAAM,GAAuB,SAAS,CAAA;QAC1C,IAAI,CAAS,CAAA;QACb,IAAI,oBAAoB,EAAE,CAAC;YACzB,kDAAkD;YAClD,sEAAsE;YAEtE,6FAA6F;YAC7F,KAAK,GAAG,EAAE,CACR,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC;gBACtD,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC;gBAC3D,GAAG,CACN,CAAA;YACD,MAAM,GAAG,EAAE,CACT,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC;gBACvD,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC;gBAC5D,GAAG,CACN,CAAA;YACD,qDAAqD;YACrD,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,CAAA;YACvE,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,CAAA;YAEvE,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,CAAE,CAAC,CAAA;YACrE,CAAC,GAAG,uBAAuB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;QACrF,CAAC;aAAM,CAAC;YACN,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QAC1C,CAAC;QAED,MAAM,aAAa,GAAG,cAAc,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QACpE,MAAM,UAAU,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE;YAC1C,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,oBAAoB,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,KAAM,EAAE,MAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ;YACjF,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;YAC5C,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC;SACvE,CAAC,CAAA;QAEF,MAAM,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,CAC9D,GAAG,CAAC,oBAAoB,CAAC,IAAI,EAAE,EAAE,EAAE,UAAU,CAAC,CAC/C,CAAA;QAED,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAA;QAC/B,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QAE7D,wCAAwC;QACxC,IACE,oBAAoB;YACpB,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC,KAAK,SAAS,EAC5E,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,KAAM,EAAE,MAAO,CAAC,CAAA;YACvC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QAClC,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC,CAAA;QAC/E,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,CAAA;IACpC,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,oBAAoB,CACvC,IAAa,EACb,EAAU,EACV,UAAmB;QAEnB,IAAI,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAA;QAE1C,gFAAgF;QAChF,mFAAmF;QACnF,oFAAoF;QACpF,gBAAgB;QAChB,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QAEnF,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QAC7F,IAAI,IAAI,YAAY,MAAM,EAAE,CAAC;YAC3B,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;QAC9B,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;QAC/B,CAAC;QACD,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC,UAAU,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC,CAAA;IACjG,CAAC;IAES,kBAAkB,CAAC,OAAgB;QAC3C,OAAO,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAClD,CAAC;IAED,SAAS,CAAC,aAAsB,EAAE,OAAgB;QAChD,OAAO,gBAAgB,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,CAAA;IACvD,CAAC;IAES,wBAAwB,CAAC,OAAgB;QACjD,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,CAAA;IAC/B,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ import { SvgNode } from './svgnode';
2
+ import { Context } from '../context/context';
3
+ import { Rect } from '../utils/geometry';
4
+ import { Matrix } from 'jspdf';
5
+ export declare class VoidNode extends SvgNode {
6
+ render(parentContext: Context): Promise<void>;
7
+ protected getBoundingBoxCore(context: Context): Rect;
8
+ protected computeNodeTransformCore(context: Context): Matrix;
9
+ isVisible(parentVisible: boolean, context: Context): boolean;
10
+ }
11
+ //# sourceMappingURL=void.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"void.d.ts","sourceRoot":"","sources":["../../src/nodes/void.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAE5C,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAE9B,qBAAa,QAAS,SAAQ,OAAO;IAEnC,MAAM,CAAC,aAAa,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7C,SAAS,CAAC,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAGpD,SAAS,CAAC,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM;IAG5D,SAAS,CAAC,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO;CAG7D"}
@@ -0,0 +1,19 @@
1
+ import { SvgNode } from './svgnode';
2
+ import { svgNodeIsVisible } from '../utils/node';
3
+ export class VoidNode extends SvgNode {
4
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
5
+ render(parentContext) {
6
+ return Promise.resolve();
7
+ }
8
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
9
+ getBoundingBoxCore(context) {
10
+ return [0, 0, 0, 0];
11
+ }
12
+ computeNodeTransformCore(context) {
13
+ return context.pdf.unitMatrix;
14
+ }
15
+ isVisible(parentVisible, context) {
16
+ return svgNodeIsVisible(this, parentVisible, context);
17
+ }
18
+ }
19
+ //# sourceMappingURL=void.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"void.js","sourceRoot":"","sources":["../../src/nodes/void.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAIhD,MAAM,OAAO,QAAS,SAAQ,OAAO;IACnC,6DAA6D;IAC7D,MAAM,CAAC,aAAsB;QAC3B,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;IAC1B,CAAC;IACD,6DAA6D;IACnD,kBAAkB,CAAC,OAAgB;QAC3C,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACrB,CAAC;IACS,wBAAwB,CAAC,OAAgB;QACjD,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,CAAA;IAC/B,CAAC;IACD,SAAS,CAAC,aAAsB,EAAE,OAAgB;QAChD,OAAO,gBAAgB,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,CAAA;IACvD,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ import { SvgNode } from './nodes/svgnode';
2
+ export declare function parse(node: Element, idMap?: {
3
+ [id: string]: SvgNode;
4
+ }): SvgNode;
5
+ //# sourceMappingURL=parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAwBzC,wBAAgB,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE;IAAE,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,GAAG,OAAO,CA6E/E"}
package/dist/parse.js ADDED
@@ -0,0 +1,96 @@
1
+ import { Line } from './nodes/line';
2
+ import { Use } from './nodes/use';
3
+ import { Rect } from './nodes/rect';
4
+ import { Ellipse } from './nodes/ellipse';
5
+ import { TextNode } from './nodes/text';
6
+ import { PathNode } from './nodes/path';
7
+ import { ImageNode } from './nodes/image';
8
+ import { Polygon } from './nodes/polygon';
9
+ import { forEachChild } from './utils/node';
10
+ import { VoidNode } from './nodes/void';
11
+ import { MarkerNode } from './nodes/marker';
12
+ import { Pattern } from './nodes/pattern';
13
+ import { Circle } from './nodes/circle';
14
+ import { LinearGradient } from './nodes/lineargradient';
15
+ import { RadialGradient } from './nodes/radialgradient';
16
+ import { Polyline } from './nodes/polyline';
17
+ import { Svg } from './nodes/svg';
18
+ import { Group } from './nodes/group';
19
+ import { Anchor } from './nodes/anchor';
20
+ import cssesc from 'cssesc';
21
+ import { ClipPath } from './nodes/clippath';
22
+ import { Symbol } from './nodes/symbol';
23
+ export function parse(node, idMap) {
24
+ let svgnode;
25
+ const children = [];
26
+ forEachChild(node, (i, n) => children.push(parse(n, idMap)));
27
+ switch (node.tagName.toLowerCase()) {
28
+ case 'a':
29
+ svgnode = new Anchor(node, children);
30
+ break;
31
+ case 'g':
32
+ svgnode = new Group(node, children);
33
+ break;
34
+ case 'circle':
35
+ svgnode = new Circle(node, children);
36
+ break;
37
+ case 'clippath':
38
+ svgnode = new ClipPath(node, children);
39
+ break;
40
+ case 'ellipse':
41
+ svgnode = new Ellipse(node, children);
42
+ break;
43
+ case 'lineargradient':
44
+ svgnode = new LinearGradient(node, children);
45
+ break;
46
+ case 'image':
47
+ svgnode = new ImageNode(node, children);
48
+ break;
49
+ case 'line':
50
+ svgnode = new Line(node, children);
51
+ break;
52
+ case 'marker':
53
+ svgnode = new MarkerNode(node, children);
54
+ break;
55
+ case 'path':
56
+ svgnode = new PathNode(node, children);
57
+ break;
58
+ case 'pattern':
59
+ svgnode = new Pattern(node, children);
60
+ break;
61
+ case 'polygon':
62
+ svgnode = new Polygon(node, children);
63
+ break;
64
+ case 'polyline':
65
+ svgnode = new Polyline(node, children);
66
+ break;
67
+ case 'radialgradient':
68
+ svgnode = new RadialGradient(node, children);
69
+ break;
70
+ case 'rect':
71
+ svgnode = new Rect(node, children);
72
+ break;
73
+ case 'svg':
74
+ svgnode = new Svg(node, children);
75
+ break;
76
+ case 'symbol':
77
+ svgnode = new Symbol(node, children);
78
+ break;
79
+ case 'text':
80
+ svgnode = new TextNode(node, children);
81
+ break;
82
+ case 'use':
83
+ svgnode = new Use(node, children);
84
+ break;
85
+ default:
86
+ svgnode = new VoidNode(node, children);
87
+ break;
88
+ }
89
+ if (idMap != undefined && svgnode.element.hasAttribute('id')) {
90
+ const id = cssesc(svgnode.element.id, { isIdentifier: true });
91
+ idMap[id] = idMap[id] || svgnode;
92
+ }
93
+ svgnode.children.forEach(c => c.setParent(svgnode));
94
+ return svgnode;
95
+ }
96
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { jsPDF } from 'jspdf';
2
+ export declare function svg2pdf(element: Element, pdf: jsPDF, options?: Svg2PdfOptions): Promise<jsPDF>;
3
+ export interface Svg2PdfOptions {
4
+ x?: number;
5
+ y?: number;
6
+ width?: number;
7
+ height?: number;
8
+ loadExternalStyleSheets?: boolean;
9
+ }
10
+ //# sourceMappingURL=svg2pdf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svg2pdf.d.ts","sourceRoot":"","sources":["../src/svg2pdf.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAK7B,wBAAsB,OAAO,CAC3B,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,KAAK,EACV,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,KAAK,CAAC,CAkDhB;AASD,MAAM,WAAW,cAAc;IAC7B,CAAC,CAAC,EAAE,MAAM,CAAA;IACV,CAAC,CAAC,EAAE,MAAM,CAAA;IACV,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,uBAAuB,CAAC,EAAE,OAAO,CAAA;CAClC"}
@@ -0,0 +1,49 @@
1
+ import { Context } from './context/context';
2
+ import { ReferencesHandler } from './context/referenceshandler';
3
+ import { parse } from './parse';
4
+ import { jsPDF } from 'jspdf';
5
+ import { StyleSheets } from './context/stylesheets';
6
+ import { Viewport } from './context/viewport';
7
+ import { TextMeasure } from './context/textmeasure';
8
+ export async function svg2pdf(element, pdf, options = {}) {
9
+ const x = options.x ?? 0.0;
10
+ const y = options.y ?? 0.0;
11
+ const extCss = options.loadExternalStyleSheets ?? false;
12
+ // create context object
13
+ const idMap = {};
14
+ const refsHandler = new ReferencesHandler(idMap);
15
+ const styleSheets = new StyleSheets(element, extCss);
16
+ await styleSheets.load();
17
+ // start with the entire page size as viewport
18
+ const viewport = new Viewport(pdf.internal.pageSize.getWidth(), pdf.internal.pageSize.getHeight());
19
+ const svg2pdfParameters = { ...options, element };
20
+ const textMeasure = new TextMeasure();
21
+ const context = new Context(pdf, {
22
+ refsHandler,
23
+ styleSheets,
24
+ viewport,
25
+ svg2pdfParameters,
26
+ textMeasure
27
+ });
28
+ pdf.advancedAPI();
29
+ pdf.saveGraphicsState();
30
+ // set offsets
31
+ pdf.setCurrentTransformationMatrix(pdf.Matrix(1, 0, 0, 1, x, y));
32
+ // set default values that differ from pdf defaults
33
+ pdf.setLineWidth(context.attributeState.strokeWidth);
34
+ const fill = context.attributeState.fill.color;
35
+ pdf.setFillColor(fill.r, fill.g, fill.b);
36
+ pdf.setFont(context.attributeState.fontFamily);
37
+ // correct for a jsPDF-instance measurement unit that differs from `pt`
38
+ pdf.setFontSize(context.attributeState.fontSize * pdf.internal.scaleFactor);
39
+ const node = parse(element, idMap);
40
+ await node.render(context);
41
+ pdf.restoreGraphicsState();
42
+ pdf.compatAPI();
43
+ context.textMeasure.cleanupTextMeasuring();
44
+ return pdf;
45
+ }
46
+ jsPDF.API.svg = function (element, options = {}) {
47
+ return svg2pdf(element, this, options);
48
+ };
49
+ //# sourceMappingURL=svg2pdf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svg2pdf.js","sourceRoot":"","sources":["../src/svg2pdf.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { Context } from './context/context';
2
+ import { TextNode } from './nodes/text';
3
+ import { Point } from './utils/geometry';
4
+ /**
5
+ * @param {string} textAnchor
6
+ * @param {number} originX
7
+ * @param {number} originY
8
+ * @constructor
9
+ */
10
+ export declare class TextChunk {
11
+ private readonly textNode;
12
+ private readonly texts;
13
+ private readonly textNodes;
14
+ private readonly contexts;
15
+ private readonly textAnchor;
16
+ private originX;
17
+ private originY;
18
+ readonly textMeasures: {
19
+ width: number;
20
+ length: number;
21
+ }[];
22
+ constructor(parent: TextNode, textAnchor: string, originX: number, originY: number);
23
+ setX(originX: number): void;
24
+ setY(originY: number): void;
25
+ add(tSpan: Element, text: string, context: Context): void;
26
+ rightTrimText(): boolean;
27
+ measureText(context: Context): void;
28
+ put(context: Context, charSpace: number): Point;
29
+ /**
30
+ * Resolves a positional attribute (dx, dy) on a given tSpan, possibly
31
+ * inheriting it from the nearest ancestor. Positional attributes
32
+ * are only inherited from a parent to its first child.
33
+ */
34
+ private static resolveRelativePositionAttribute;
35
+ }
36
+ //# sourceMappingURL=textchunk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textchunk.d.ts","sourceRoot":"","sources":["../src/textchunk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAI3C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAGxC;;;;;GAKG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAU;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,OAAO,CAAQ;IAEvB,QAAQ,CAAC,YAAY,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;gBAE9C,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAWlF,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI3B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI3B,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAMzD,aAAa,IAAI,OAAO;IAgBxB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IASnC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,KAAK;IAyF/C;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,gCAAgC;CAoBhD"}
@@ -0,0 +1,144 @@
1
+ import { getTextRenderingMode, trimRight } from './utils/text';
2
+ import { mapAlignmentBaseline, toPixels } from './utils/misc';
3
+ import { applyAttributes } from './applyparseattributes';
4
+ import { nodeIs } from './utils/node';
5
+ /**
6
+ * @param {string} textAnchor
7
+ * @param {number} originX
8
+ * @param {number} originY
9
+ * @constructor
10
+ */
11
+ export class TextChunk {
12
+ constructor(parent, textAnchor, originX, originY) {
13
+ this.textNode = parent;
14
+ this.texts = [];
15
+ this.textNodes = [];
16
+ this.contexts = [];
17
+ this.textAnchor = textAnchor;
18
+ this.originX = originX;
19
+ this.originY = originY;
20
+ this.textMeasures = [];
21
+ }
22
+ setX(originX) {
23
+ this.originX = originX;
24
+ }
25
+ setY(originY) {
26
+ this.originY = originY;
27
+ }
28
+ add(tSpan, text, context) {
29
+ this.texts.push(text);
30
+ this.textNodes.push(tSpan);
31
+ this.contexts.push(context);
32
+ }
33
+ rightTrimText() {
34
+ for (let r = this.texts.length - 1; r >= 0; r--) {
35
+ const shouldPreserve = this.contexts[r].attributeState.xmlSpace === 'preserve' ||
36
+ this.contexts[r].attributeState.whiteSpace === 'pre';
37
+ if (!shouldPreserve) {
38
+ this.texts[r] = trimRight(this.texts[r]);
39
+ }
40
+ // If find a letter, stop right-trimming
41
+ if (this.texts[r].match(/[^\s]/)) {
42
+ return false;
43
+ }
44
+ }
45
+ return true;
46
+ }
47
+ measureText(context) {
48
+ for (let i = 0; i < this.texts.length; i++) {
49
+ this.textMeasures.push({
50
+ width: context.textMeasure.measureTextWidth(this.texts[i], this.contexts[i].attributeState),
51
+ length: this.texts[i].length
52
+ });
53
+ }
54
+ }
55
+ put(context, charSpace) {
56
+ let i, textNode, textNodeContext, textMeasure;
57
+ const alreadySeen = [];
58
+ const xs = [], ys = [];
59
+ let currentTextX = this.originX, currentTextY = this.originY;
60
+ let minX = currentTextX, maxX = currentTextX;
61
+ for (i = 0; i < this.textNodes.length; i++) {
62
+ textNode = this.textNodes[i];
63
+ textNodeContext = this.contexts[i];
64
+ textMeasure = this.textMeasures[i] || {
65
+ width: context.textMeasure.measureTextWidth(this.texts[i], this.contexts[i].attributeState),
66
+ length: this.texts[i].length
67
+ };
68
+ let x = currentTextX;
69
+ let y = currentTextY;
70
+ if (textNode.nodeName !== '#text') {
71
+ if (!alreadySeen.includes(textNode)) {
72
+ alreadySeen.push(textNode);
73
+ const tSpanDx = TextChunk.resolveRelativePositionAttribute(textNode, 'dx');
74
+ if (tSpanDx !== null) {
75
+ x += toPixels(tSpanDx, textNodeContext.attributeState.fontSize);
76
+ }
77
+ const tSpanDy = TextChunk.resolveRelativePositionAttribute(textNode, 'dy');
78
+ if (tSpanDy !== null) {
79
+ y += toPixels(tSpanDy, textNodeContext.attributeState.fontSize);
80
+ }
81
+ }
82
+ }
83
+ xs[i] = x;
84
+ ys[i] = y;
85
+ currentTextX = x + textMeasure.width + textMeasure.length * charSpace;
86
+ currentTextY = y;
87
+ minX = Math.min(minX, x);
88
+ maxX = Math.max(maxX, currentTextX);
89
+ }
90
+ let textOffset = 0;
91
+ switch (this.textAnchor) {
92
+ case 'start':
93
+ textOffset = 0;
94
+ break;
95
+ case 'middle':
96
+ textOffset = (maxX - minX) / 2;
97
+ break;
98
+ case 'end':
99
+ textOffset = maxX - minX;
100
+ break;
101
+ }
102
+ for (i = 0; i < this.textNodes.length; i++) {
103
+ textNode = this.textNodes[i];
104
+ textNodeContext = this.contexts[i];
105
+ if (textNode.nodeName !== '#text') {
106
+ if (textNodeContext.attributeState.visibility === 'hidden') {
107
+ continue;
108
+ }
109
+ }
110
+ context.pdf.saveGraphicsState();
111
+ applyAttributes(textNodeContext, context, textNode);
112
+ const alignmentBaseline = textNodeContext.attributeState.alignmentBaseline;
113
+ const textRenderingMode = getTextRenderingMode(textNodeContext.attributeState);
114
+ context.pdf.text(this.texts[i], xs[i] - textOffset, ys[i], {
115
+ baseline: mapAlignmentBaseline(alignmentBaseline),
116
+ angle: context.transform,
117
+ renderingMode: textRenderingMode === 'fill' ? void 0 : textRenderingMode,
118
+ charSpace: charSpace === 0 ? void 0 : charSpace
119
+ });
120
+ context.pdf.restoreGraphicsState();
121
+ }
122
+ return [currentTextX, currentTextY];
123
+ }
124
+ /**
125
+ * Resolves a positional attribute (dx, dy) on a given tSpan, possibly
126
+ * inheriting it from the nearest ancestor. Positional attributes
127
+ * are only inherited from a parent to its first child.
128
+ */
129
+ static resolveRelativePositionAttribute(element, attributeName) {
130
+ let currentElement = element;
131
+ while (currentElement && nodeIs(currentElement, 'tspan')) {
132
+ if (currentElement.hasAttribute(attributeName)) {
133
+ return currentElement.getAttribute(attributeName);
134
+ }
135
+ if (!(element.parentElement?.firstChild === element)) {
136
+ // positional attributes are only inherited from a parent to its first child
137
+ break;
138
+ }
139
+ currentElement = currentElement.parentElement;
140
+ }
141
+ return null;
142
+ }
143
+ }
144
+ //# sourceMappingURL=textchunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textchunk.js","sourceRoot":"","sources":["../src/textchunk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Context } from '../context/context';
2
+ import { ClipPath } from '../nodes/clippath';
3
+ import { SvgNode } from '../nodes/svgnode';
4
+ export declare function getClipPathNode(clipPathAttr: string, targetNode: SvgNode, context: Context): ClipPath | undefined;
5
+ export declare function applyClipPath(targetNode: SvgNode, clipPathNode: ClipPath, context: Context): Promise<void>;
6
+ //# sourceMappingURL=applyclippath.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applyclippath.d.ts","sourceRoot":"","sources":["../../src/utils/applyclippath.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAG1C,wBAAgB,eAAe,CAC7B,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,OAAO,EACnB,OAAO,EAAE,OAAO,GACf,QAAQ,GAAG,SAAS,CAQtB;AAED,wBAAsB,aAAa,CACjC,UAAU,EAAE,OAAO,EACnB,YAAY,EAAE,QAAQ,EACtB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,IAAI,CAAC,CAaf"}
@@ -0,0 +1,20 @@
1
+ import { iriReference } from './constants';
2
+ export function getClipPathNode(clipPathAttr, targetNode, context) {
3
+ const match = iriReference.exec(clipPathAttr);
4
+ if (!match) {
5
+ return undefined;
6
+ }
7
+ const clipPathId = match[1];
8
+ const clipNode = context.refsHandler.get(clipPathId);
9
+ return clipNode || undefined;
10
+ }
11
+ export async function applyClipPath(targetNode, clipPathNode, context) {
12
+ const clipContext = context.clone();
13
+ if (clipPathNode.element.hasAttribute('clipPathUnits') &&
14
+ clipPathNode.element.getAttribute('clipPathUnits').toLowerCase() === 'objectboundingbox') {
15
+ const bBox = targetNode.getBoundingBox(context);
16
+ clipContext.transform = context.pdf.matrixMult(context.pdf.Matrix(bBox[2], 0, 0, bBox[3], bBox[0], bBox[1]), context.transform);
17
+ }
18
+ await clipPathNode.apply(clipContext);
19
+ }
20
+ //# sourceMappingURL=applyclippath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applyclippath.js","sourceRoot":"","sources":["../../src/utils/applyclippath.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,MAAM,UAAU,eAAe,CAC7B,YAAoB,EACpB,UAAmB,EACnB,OAAgB;IAEhB,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IAC7C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IAC3B,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;IACpD,OAAQ,QAAqB,IAAI,SAAS,CAAA;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,UAAmB,EACnB,YAAsB,EACtB,OAAgB;IAEhB,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,EAAE,CAAA;IACnC,IACE,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,eAAe,CAAC;QAClD,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,eAAe,CAAE,CAAC,WAAW,EAAE,KAAK,mBAAmB,EACzF,CAAC;QACD,MAAM,IAAI,GAAG,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;QAC/C,WAAW,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAC5C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAC5D,OAAO,CAAC,SAAS,CAClB,CAAA;IACH,CAAC;IACD,MAAM,YAAY,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;AACvC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Context } from '../context/context';
2
+ import { SvgNode } from '../nodes/svgnode';
3
+ import { Rect } from './geometry';
4
+ export declare function getBoundingBoxByChildren(context: Context, svgnode: SvgNode): number[];
5
+ export declare function defaultBoundingBox(element: Element, context: Context): Rect;
6
+ //# sourceMappingURL=bbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bbox.d.ts","sourceRoot":"","sources":["../../src/utils/bbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAE5C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAEjC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,CA0BrF;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAkC3E"}