@mlightcad/cad-pdf-plugin 1.8.0-preview.2 → 1.8.0-preview.4

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 (189) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +280 -186
  3. package/dist/cad-pdf-plugin-register.js +29 -11
  4. package/dist/cad-pdf-plugin-register.umd.cjs +1 -1
  5. package/dist/cad-pdf-plugin.js +17568 -8428
  6. package/dist/cad-pdf-plugin.umd.cjs +847 -13
  7. package/lib/AcApConvertToPdfCmd.d.ts.map +1 -1
  8. package/lib/AcApConvertToPdfCmd.js +14 -3
  9. package/lib/AcApConvertToPdfCmd.js.map +1 -1
  10. package/lib/AcApImportPdfCmd.d.ts +5 -3
  11. package/lib/AcApImportPdfCmd.d.ts.map +1 -1
  12. package/lib/AcApImportPdfCmd.js +5 -3
  13. package/lib/AcApImportPdfCmd.js.map +1 -1
  14. package/lib/AcApImportPdfPromptCmd.d.ts +16 -0
  15. package/lib/AcApImportPdfPromptCmd.d.ts.map +1 -0
  16. package/lib/AcApImportPdfPromptCmd.js +89 -0
  17. package/lib/AcApImportPdfPromptCmd.js.map +1 -0
  18. package/lib/AcApPdfBlockCmd.d.ts +15 -0
  19. package/lib/AcApPdfBlockCmd.d.ts.map +1 -0
  20. package/lib/AcApPdfBlockCmd.js +75 -0
  21. package/lib/AcApPdfBlockCmd.js.map +1 -0
  22. package/lib/AcApPdfDimCmd.d.ts +20 -0
  23. package/lib/AcApPdfDimCmd.d.ts.map +1 -0
  24. package/lib/AcApPdfDimCmd.js +413 -0
  25. package/lib/AcApPdfDimCmd.js.map +1 -0
  26. package/lib/AcApPdfDimSession.d.ts +82 -0
  27. package/lib/AcApPdfDimSession.d.ts.map +1 -0
  28. package/lib/AcApPdfDimSession.js +252 -0
  29. package/lib/AcApPdfDimSession.js.map +1 -0
  30. package/lib/AcApPdfFontResolver.d.ts.map +1 -1
  31. package/lib/AcApPdfFontResolver.js +2 -5
  32. package/lib/AcApPdfFontResolver.js.map +1 -1
  33. package/lib/AcApPdfHatchCmd.d.ts +33 -0
  34. package/lib/AcApPdfHatchCmd.d.ts.map +1 -0
  35. package/lib/AcApPdfHatchCmd.js +411 -0
  36. package/lib/AcApPdfHatchCmd.js.map +1 -0
  37. package/lib/AcApPdfHatchSession.d.ts +122 -0
  38. package/lib/AcApPdfHatchSession.d.ts.map +1 -0
  39. package/lib/AcApPdfHatchSession.js +357 -0
  40. package/lib/AcApPdfHatchSession.js.map +1 -0
  41. package/lib/AcApPdfImportConvertor.d.ts +47 -5
  42. package/lib/AcApPdfImportConvertor.d.ts.map +1 -1
  43. package/lib/AcApPdfImportConvertor.js +999 -108
  44. package/lib/AcApPdfImportConvertor.js.map +1 -1
  45. package/lib/AcApPdfImportOptions.d.ts +116 -0
  46. package/lib/AcApPdfImportOptions.d.ts.map +1 -0
  47. package/lib/AcApPdfImportOptions.js +31 -0
  48. package/lib/AcApPdfImportOptions.js.map +1 -0
  49. package/lib/AcApPdfImportResources.d.ts +41 -0
  50. package/lib/AcApPdfImportResources.d.ts.map +1 -0
  51. package/lib/AcApPdfImportResources.js +52 -0
  52. package/lib/AcApPdfImportResources.js.map +1 -0
  53. package/lib/AcApPdfPlugin.d.ts +3 -3
  54. package/lib/AcApPdfPlugin.d.ts.map +1 -1
  55. package/lib/AcApPdfPlugin.js +23 -5
  56. package/lib/AcApPdfPlugin.js.map +1 -1
  57. package/lib/AcApPdfScaleCmd.d.ts +22 -0
  58. package/lib/AcApPdfScaleCmd.d.ts.map +1 -0
  59. package/lib/AcApPdfScaleCmd.js +185 -0
  60. package/lib/AcApPdfScaleCmd.js.map +1 -0
  61. package/lib/AcApPdfTextCmd.d.ts +73 -0
  62. package/lib/AcApPdfTextCmd.d.ts.map +1 -0
  63. package/lib/AcApPdfTextCmd.js +777 -0
  64. package/lib/AcApPdfTextCmd.js.map +1 -0
  65. package/lib/AcApPdfTextSession.d.ts +232 -0
  66. package/lib/AcApPdfTextSession.d.ts.map +1 -0
  67. package/lib/AcApPdfTextSession.js +826 -0
  68. package/lib/AcApPdfTextSession.js.map +1 -0
  69. package/lib/acapPdfI18n.d.ts +11 -0
  70. package/lib/acapPdfI18n.d.ts.map +1 -0
  71. package/lib/acapPdfI18n.js +57 -0
  72. package/lib/acapPdfI18n.js.map +1 -0
  73. package/lib/acapPdfPrompts.d.ts +12 -0
  74. package/lib/acapPdfPrompts.d.ts.map +1 -0
  75. package/lib/acapPdfPrompts.js +100 -0
  76. package/lib/acapPdfPrompts.js.map +1 -0
  77. package/lib/index.d.ts +28 -0
  78. package/lib/index.d.ts.map +1 -1
  79. package/lib/index.js +28 -0
  80. package/lib/index.js.map +1 -1
  81. package/lib/pdfDeprecatedMatching.d.ts +27 -0
  82. package/lib/pdfDeprecatedMatching.d.ts.map +1 -0
  83. package/lib/pdfDeprecatedMatching.js +20 -0
  84. package/lib/pdfDeprecatedMatching.js.map +1 -0
  85. package/lib/pdfDimStrokeTexts.d.ts +55 -0
  86. package/lib/pdfDimStrokeTexts.d.ts.map +1 -0
  87. package/lib/pdfDimStrokeTexts.js +274 -0
  88. package/lib/pdfDimStrokeTexts.js.map +1 -0
  89. package/lib/pdfDimensionConvert.d.ts +80 -0
  90. package/lib/pdfDimensionConvert.d.ts.map +1 -0
  91. package/lib/pdfDimensionConvert.js +566 -0
  92. package/lib/pdfDimensionConvert.js.map +1 -0
  93. package/lib/pdfEntityStrokes.d.ts +13 -0
  94. package/lib/pdfEntityStrokes.d.ts.map +1 -0
  95. package/lib/pdfEntityStrokes.js +86 -0
  96. package/lib/pdfEntityStrokes.js.map +1 -0
  97. package/lib/pdfHatchRecover.d.ts +57 -0
  98. package/lib/pdfHatchRecover.d.ts.map +1 -0
  99. package/lib/pdfHatchRecover.js +315 -0
  100. package/lib/pdfHatchRecover.js.map +1 -0
  101. package/lib/pdfImportAppend.d.ts +24 -0
  102. package/lib/pdfImportAppend.d.ts.map +1 -0
  103. package/lib/pdfImportAppend.js +35 -0
  104. package/lib/pdfImportAppend.js.map +1 -0
  105. package/lib/pdfImportEntities.d.ts +63 -0
  106. package/lib/pdfImportEntities.d.ts.map +1 -0
  107. package/lib/pdfImportEntities.js +307 -0
  108. package/lib/pdfImportEntities.js.map +1 -0
  109. package/lib/pdfImportImages.d.ts +90 -0
  110. package/lib/pdfImportImages.d.ts.map +1 -0
  111. package/lib/pdfImportImages.js +294 -0
  112. package/lib/pdfImportImages.js.map +1 -0
  113. package/lib/pdfImportShapes.d.ts +63 -0
  114. package/lib/pdfImportShapes.d.ts.map +1 -0
  115. package/lib/pdfImportShapes.js +248 -0
  116. package/lib/pdfImportShapes.js.map +1 -0
  117. package/lib/pdfVectorImport.d.ts +218 -5
  118. package/lib/pdfVectorImport.d.ts.map +1 -1
  119. package/lib/pdfVectorImport.js +566 -98
  120. package/lib/pdfVectorImport.js.map +1 -1
  121. package/lib/recognition/pdfCurveRecognition.d.ts +91 -0
  122. package/lib/recognition/pdfCurveRecognition.d.ts.map +1 -0
  123. package/lib/recognition/pdfCurveRecognition.js +506 -0
  124. package/lib/recognition/pdfCurveRecognition.js.map +1 -0
  125. package/lib/recognition/pdfDimDigitRecognition.d.ts +18 -0
  126. package/lib/recognition/pdfDimDigitRecognition.d.ts.map +1 -0
  127. package/lib/recognition/pdfDimDigitRecognition.js +520 -0
  128. package/lib/recognition/pdfDimDigitRecognition.js.map +1 -0
  129. package/lib/recognition/pdfDimensionPattern.d.ts +173 -0
  130. package/lib/recognition/pdfDimensionPattern.d.ts.map +1 -0
  131. package/lib/recognition/pdfDimensionPattern.js +1023 -0
  132. package/lib/recognition/pdfDimensionPattern.js.map +1 -0
  133. package/lib/recognition/pdfFormBlocks.d.ts +58 -0
  134. package/lib/recognition/pdfFormBlocks.d.ts.map +1 -0
  135. package/lib/recognition/pdfFormBlocks.js +260 -0
  136. package/lib/recognition/pdfFormBlocks.js.map +1 -0
  137. package/lib/recognition/pdfGlyphClustering.d.ts +81 -0
  138. package/lib/recognition/pdfGlyphClustering.d.ts.map +1 -0
  139. package/lib/recognition/pdfGlyphClustering.js +1005 -0
  140. package/lib/recognition/pdfGlyphClustering.js.map +1 -0
  141. package/lib/recognition/pdfGlyphDictionary.d.ts +49 -0
  142. package/lib/recognition/pdfGlyphDictionary.d.ts.map +1 -0
  143. package/lib/recognition/pdfGlyphDictionary.js +188 -0
  144. package/lib/recognition/pdfGlyphDictionary.js.map +1 -0
  145. package/lib/recognition/pdfHatchFaces.d.ts +84 -0
  146. package/lib/recognition/pdfHatchFaces.d.ts.map +1 -0
  147. package/lib/recognition/pdfHatchFaces.js +1285 -0
  148. package/lib/recognition/pdfHatchFaces.js.map +1 -0
  149. package/lib/recognition/pdfHatchRecognition.d.ts +222 -0
  150. package/lib/recognition/pdfHatchRecognition.d.ts.map +1 -0
  151. package/lib/recognition/pdfHatchRecognition.js +3781 -0
  152. package/lib/recognition/pdfHatchRecognition.js.map +1 -0
  153. package/lib/recognition/pdfRecGeometry.d.ts +67 -0
  154. package/lib/recognition/pdfRecGeometry.d.ts.map +1 -0
  155. package/lib/recognition/pdfRecGeometry.js +365 -0
  156. package/lib/recognition/pdfRecGeometry.js.map +1 -0
  157. package/lib/recognition/pdfTextFontKind.d.ts +16 -0
  158. package/lib/recognition/pdfTextFontKind.d.ts.map +1 -0
  159. package/lib/recognition/pdfTextFontKind.js +51 -0
  160. package/lib/recognition/pdfTextFontKind.js.map +1 -0
  161. package/lib/recognition/pdfTextMerge.d.ts +71 -0
  162. package/lib/recognition/pdfTextMerge.d.ts.map +1 -0
  163. package/lib/recognition/pdfTextMerge.js +382 -0
  164. package/lib/recognition/pdfTextMerge.js.map +1 -0
  165. package/lib/recognition/pdfTextRunMerge.d.ts +28 -0
  166. package/lib/recognition/pdfTextRunMerge.d.ts.map +1 -0
  167. package/lib/recognition/pdfTextRunMerge.js +90 -0
  168. package/lib/recognition/pdfTextRunMerge.js.map +1 -0
  169. package/lib/register.d.ts +8 -2
  170. package/lib/register.d.ts.map +1 -1
  171. package/lib/register.js +29 -4
  172. package/lib/register.js.map +1 -1
  173. package/lib/ui/AcUiPdfDimPanel.d.ts +55 -0
  174. package/lib/ui/AcUiPdfDimPanel.d.ts.map +1 -0
  175. package/lib/ui/AcUiPdfDimPanel.js +347 -0
  176. package/lib/ui/AcUiPdfDimPanel.js.map +1 -0
  177. package/lib/ui/AcUiPdfHatchPanel.d.ts +57 -0
  178. package/lib/ui/AcUiPdfHatchPanel.d.ts.map +1 -0
  179. package/lib/ui/AcUiPdfHatchPanel.js +420 -0
  180. package/lib/ui/AcUiPdfHatchPanel.js.map +1 -0
  181. package/lib/ui/AcUiPdfImportDialog.d.ts +120 -0
  182. package/lib/ui/AcUiPdfImportDialog.d.ts.map +1 -0
  183. package/lib/ui/AcUiPdfImportDialog.js +673 -0
  184. package/lib/ui/AcUiPdfImportDialog.js.map +1 -0
  185. package/lib/ui/AcUiPdfTextPanel.d.ts +95 -0
  186. package/lib/ui/AcUiPdfTextPanel.d.ts.map +1 -0
  187. package/lib/ui/AcUiPdfTextPanel.js +775 -0
  188. package/lib/ui/AcUiPdfTextPanel.js.map +1 -0
  189. package/package.json +11 -11
@@ -0,0 +1,365 @@
1
+ /**
2
+ * Small, dependency-free 2D geometry helpers shared by the PDF recognition
3
+ * passes. Everything works on plain `{ x, y }` points in model-space
4
+ * millimeters so the algorithms can be unit-tested without the data model.
5
+ */
6
+ var __values = (this && this.__values) || function(o) {
7
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
8
+ if (m) return m.call(o);
9
+ if (o && typeof o.length === "number") return {
10
+ next: function () {
11
+ if (o && i >= o.length) o = void 0;
12
+ return { value: o && o[i++], done: !o };
13
+ }
14
+ };
15
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
16
+ };
17
+ var __read = (this && this.__read) || function (o, n) {
18
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
19
+ if (!m) return o;
20
+ var i = m.call(o), r, ar = [], e;
21
+ try {
22
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
23
+ }
24
+ catch (error) { e = { error: error }; }
25
+ finally {
26
+ try {
27
+ if (r && !r.done && (m = i["return"])) m.call(i);
28
+ }
29
+ finally { if (e) throw e.error; }
30
+ }
31
+ return ar;
32
+ };
33
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
34
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
35
+ if (ar || !(i in from)) {
36
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
37
+ ar[i] = from[i];
38
+ }
39
+ }
40
+ return to.concat(ar || Array.prototype.slice.call(from));
41
+ };
42
+ export var TWO_PI = Math.PI * 2;
43
+ export function dist(a, b) {
44
+ return Math.hypot(a.x - b.x, a.y - b.y);
45
+ }
46
+ export function sub(a, b) {
47
+ return { x: a.x - b.x, y: a.y - b.y };
48
+ }
49
+ export function cross(a, b) {
50
+ return a.x * b.y - a.y * b.x;
51
+ }
52
+ export function dot(a, b) {
53
+ return a.x * b.x + a.y * b.y;
54
+ }
55
+ /** Normalizes an angle into `[0, 2π)`. */
56
+ export function normalizeAngle(angle) {
57
+ var a = angle % TWO_PI;
58
+ if (a < 0)
59
+ a += TWO_PI;
60
+ // Tiny negative inputs land just below 2π; snap them back to 0.
61
+ return a >= TWO_PI - 1e-12 ? 0 : a;
62
+ }
63
+ /** Evaluates a cubic Bezier at `t`. */
64
+ export function cubicAt(p0, p1, p2, p3, t) {
65
+ var mt = 1 - t;
66
+ var a = mt * mt * mt;
67
+ var b = 3 * mt * mt * t;
68
+ var c = 3 * mt * t * t;
69
+ var d = t * t * t;
70
+ return {
71
+ x: a * p0.x + b * p1.x + c * p2.x + d * p3.x,
72
+ y: a * p0.y + b * p1.y + c * p2.y + d * p3.y
73
+ };
74
+ }
75
+ /** Distance from `p` to the infinite line through `a` and `b`. */
76
+ export function distanceToLine(p, a, b) {
77
+ var len = dist(a, b);
78
+ if (len === 0)
79
+ return dist(p, a);
80
+ return Math.abs(cross(sub(b, a), sub(p, a))) / len;
81
+ }
82
+ /**
83
+ * Circle through three points, or `undefined` when they are (nearly)
84
+ * collinear.
85
+ */
86
+ export function circleFrom3Points(a, b, c) {
87
+ var d = 2 * (a.x * (b.y - c.y) + b.x * (c.y - a.y) + c.x * (a.y - b.y));
88
+ var scale = Math.max(dist(a, b), dist(b, c), dist(a, c));
89
+ if (scale === 0 || Math.abs(d) < 1e-12 * scale * scale)
90
+ return undefined;
91
+ var a2 = a.x * a.x + a.y * a.y;
92
+ var b2 = b.x * b.x + b.y * b.y;
93
+ var c2 = c.x * c.x + c.y * c.y;
94
+ var center = {
95
+ x: (a2 * (b.y - c.y) + b2 * (c.y - a.y) + c2 * (a.y - b.y)) / d,
96
+ y: (a2 * (c.x - b.x) + b2 * (a.x - c.x) + c2 * (b.x - a.x)) / d
97
+ };
98
+ return { center: center, radius: dist(center, a) };
99
+ }
100
+ /**
101
+ * Algebraic (Kåsa) least-squares circle fit.
102
+ *
103
+ * Accurate when the points cover a reasonable arc, which is the case for the
104
+ * flattened arcs this is used on.
105
+ */
106
+ export function fitCircleLeastSquares(points) {
107
+ var e_1, _a, e_2, _b;
108
+ var n = points.length;
109
+ if (n < 3)
110
+ return undefined;
111
+ // Center the data to keep the normal equations well conditioned.
112
+ var mx = 0;
113
+ var my = 0;
114
+ try {
115
+ for (var points_1 = __values(points), points_1_1 = points_1.next(); !points_1_1.done; points_1_1 = points_1.next()) {
116
+ var p = points_1_1.value;
117
+ mx += p.x;
118
+ my += p.y;
119
+ }
120
+ }
121
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
122
+ finally {
123
+ try {
124
+ if (points_1_1 && !points_1_1.done && (_a = points_1.return)) _a.call(points_1);
125
+ }
126
+ finally { if (e_1) throw e_1.error; }
127
+ }
128
+ mx /= n;
129
+ my /= n;
130
+ var suu = 0;
131
+ var suv = 0;
132
+ var svv = 0;
133
+ var suuu = 0;
134
+ var svvv = 0;
135
+ var suvv = 0;
136
+ var svuu = 0;
137
+ try {
138
+ for (var points_2 = __values(points), points_2_1 = points_2.next(); !points_2_1.done; points_2_1 = points_2.next()) {
139
+ var p = points_2_1.value;
140
+ var u = p.x - mx;
141
+ var v = p.y - my;
142
+ suu += u * u;
143
+ suv += u * v;
144
+ svv += v * v;
145
+ suuu += u * u * u;
146
+ svvv += v * v * v;
147
+ suvv += u * v * v;
148
+ svuu += v * u * u;
149
+ }
150
+ }
151
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
152
+ finally {
153
+ try {
154
+ if (points_2_1 && !points_2_1.done && (_b = points_2.return)) _b.call(points_2);
155
+ }
156
+ finally { if (e_2) throw e_2.error; }
157
+ }
158
+ var det = suu * svv - suv * suv;
159
+ if (Math.abs(det) < 1e-18)
160
+ return undefined;
161
+ var rhsU = 0.5 * (suuu + suvv);
162
+ var rhsV = 0.5 * (svvv + svuu);
163
+ var uc = (rhsU * svv - rhsV * suv) / det;
164
+ var vc = (suu * rhsV - suv * rhsU) / det;
165
+ var center = { x: uc + mx, y: vc + my };
166
+ var radius = Math.sqrt(uc * uc + vc * vc + (suu + svv) / n);
167
+ if (!Number.isFinite(radius))
168
+ return undefined;
169
+ return { center: center, radius: radius };
170
+ }
171
+ /** Largest radial deviation of `points` from `circle`. */
172
+ export function maxCircleDeviation(points, circle) {
173
+ var e_3, _a;
174
+ var max = 0;
175
+ try {
176
+ for (var points_3 = __values(points), points_3_1 = points_3.next(); !points_3_1.done; points_3_1 = points_3.next()) {
177
+ var p = points_3_1.value;
178
+ max = Math.max(max, Math.abs(dist(p, circle.center) - circle.radius));
179
+ }
180
+ }
181
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
182
+ finally {
183
+ try {
184
+ if (points_3_1 && !points_3_1.done && (_a = points_3.return)) _a.call(points_3);
185
+ }
186
+ finally { if (e_3) throw e_3.error; }
187
+ }
188
+ return max;
189
+ }
190
+ /**
191
+ * Signed sweep (radians) going from `start` through `mid` to `end` on a
192
+ * circle around `center`. Positive is counterclockwise.
193
+ */
194
+ export function signedSweep(center, start, mid, end) {
195
+ var a0 = Math.atan2(start.y - center.y, start.x - center.x);
196
+ var am = Math.atan2(mid.y - center.y, mid.x - center.x);
197
+ var a1 = Math.atan2(end.y - center.y, end.x - center.x);
198
+ var ccwToEnd = normalizeAngle(a1 - a0);
199
+ var ccwToMid = normalizeAngle(am - a0);
200
+ // `mid` lies on the CCW path to `end` exactly when it is reached first.
201
+ if (ccwToMid <= ccwToEnd) {
202
+ return ccwToEnd === 0 ? TWO_PI : ccwToEnd;
203
+ }
204
+ return ccwToEnd === 0 ? -TWO_PI : ccwToEnd - TWO_PI;
205
+ }
206
+ /** Solves a small dense linear system with partial pivoting. */
207
+ export function solveLinearSystem(matrix, rhs) {
208
+ var _a;
209
+ var n = rhs.length;
210
+ var a = matrix.map(function (row, i) { return __spreadArray(__spreadArray([], __read(row), false), [rhs[i]], false); });
211
+ for (var col = 0; col < n; col++) {
212
+ var pivot = col;
213
+ for (var row = col + 1; row < n; row++) {
214
+ if (Math.abs(a[row][col]) > Math.abs(a[pivot][col]))
215
+ pivot = row;
216
+ }
217
+ if (Math.abs(a[pivot][col]) < 1e-14)
218
+ return undefined;
219
+ _a = __read([a[pivot], a[col]], 2), a[col] = _a[0], a[pivot] = _a[1];
220
+ for (var row = col + 1; row < n; row++) {
221
+ var f = a[row][col] / a[col][col];
222
+ for (var k = col; k <= n; k++)
223
+ a[row][k] -= f * a[col][k];
224
+ }
225
+ }
226
+ var x = new Array(n).fill(0);
227
+ for (var row = n - 1; row >= 0; row--) {
228
+ var sum = a[row][n];
229
+ for (var k = row + 1; k < n; k++)
230
+ sum -= a[row][k] * x[k];
231
+ x[row] = sum / a[row][row];
232
+ }
233
+ return x;
234
+ }
235
+ /**
236
+ * Least-squares ellipse fit of a general conic.
237
+ *
238
+ * Points are centered first so the conic does not pass through the origin,
239
+ * which lets the constant term be fixed at -1.
240
+ */
241
+ export function fitEllipse(points) {
242
+ var e_4, _a, e_5, _b, e_6, _c;
243
+ var n = points.length;
244
+ if (n < 6)
245
+ return undefined;
246
+ var mx = 0;
247
+ var my = 0;
248
+ try {
249
+ for (var points_4 = __values(points), points_4_1 = points_4.next(); !points_4_1.done; points_4_1 = points_4.next()) {
250
+ var p = points_4_1.value;
251
+ mx += p.x;
252
+ my += p.y;
253
+ }
254
+ }
255
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
256
+ finally {
257
+ try {
258
+ if (points_4_1 && !points_4_1.done && (_a = points_4.return)) _a.call(points_4);
259
+ }
260
+ finally { if (e_4) throw e_4.error; }
261
+ }
262
+ mx /= n;
263
+ my /= n;
264
+ var scale = 0;
265
+ try {
266
+ for (var points_5 = __values(points), points_5_1 = points_5.next(); !points_5_1.done; points_5_1 = points_5.next()) {
267
+ var p = points_5_1.value;
268
+ scale = Math.max(scale, Math.abs(p.x - mx), Math.abs(p.y - my));
269
+ }
270
+ }
271
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
272
+ finally {
273
+ try {
274
+ if (points_5_1 && !points_5_1.done && (_b = points_5.return)) _b.call(points_5);
275
+ }
276
+ finally { if (e_5) throw e_5.error; }
277
+ }
278
+ if (scale === 0)
279
+ return undefined;
280
+ // A u² + B uv + C v² + D u + E v = 1 in normalized coordinates.
281
+ var ata = Array.from({ length: 5 }, function () { return new Array(5).fill(0); });
282
+ var atb = new Array(5).fill(0);
283
+ try {
284
+ for (var points_6 = __values(points), points_6_1 = points_6.next(); !points_6_1.done; points_6_1 = points_6.next()) {
285
+ var p = points_6_1.value;
286
+ var u = (p.x - mx) / scale;
287
+ var v = (p.y - my) / scale;
288
+ var row = [u * u, u * v, v * v, u, v];
289
+ for (var i = 0; i < 5; i++) {
290
+ atb[i] += row[i];
291
+ for (var j = 0; j < 5; j++)
292
+ ata[i][j] += row[i] * row[j];
293
+ }
294
+ }
295
+ }
296
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
297
+ finally {
298
+ try {
299
+ if (points_6_1 && !points_6_1.done && (_c = points_6.return)) _c.call(points_6);
300
+ }
301
+ finally { if (e_6) throw e_6.error; }
302
+ }
303
+ var sol = solveLinearSystem(ata, atb);
304
+ if (!sol)
305
+ return undefined;
306
+ var _d = __read(sol, 5), A = _d[0], B = _d[1], C = _d[2], D = _d[3], E = _d[4];
307
+ var disc = B * B - 4 * A * C;
308
+ if (!(disc < 0))
309
+ return undefined;
310
+ // Center: gradient of the quadratic form vanishes.
311
+ var det = 4 * A * C - B * B;
312
+ var uc = (B * E - 2 * C * D) / det;
313
+ var vc = (B * D - 2 * A * E) / det;
314
+ // Value of the conic (with F = -1) at its center.
315
+ var fc = A * uc * uc + B * uc * vc + C * vc * vc + D * uc + E * vc - 1;
316
+ if (!(fc < 0))
317
+ return undefined;
318
+ // Eigen-decomposition of [[A, B/2], [B/2, C]].
319
+ var tr = A + C;
320
+ var diff = Math.sqrt((A - C) * (A - C) + B * B);
321
+ var l1 = (tr + diff) / 2;
322
+ var l2 = (tr - diff) / 2;
323
+ if (!(l1 > 0 && l2 > 0))
324
+ return undefined;
325
+ // Smaller eigenvalue belongs to the major axis.
326
+ var majorRadius = Math.sqrt(-fc / l2) * scale;
327
+ var minorRadius = Math.sqrt(-fc / l1) * scale;
328
+ // Both rows of (M - l2·I) give an eigenvector; near-axis-aligned ellipses
329
+ // make one of them two noisy near-zero numbers, so use the longer one.
330
+ var rowA = { x: B / 2, y: l2 - A };
331
+ var rowC = { x: l2 - C, y: B / 2 };
332
+ var dir = Math.hypot(rowA.x, rowA.y) >= Math.hypot(rowC.x, rowC.y) ? rowA : rowC;
333
+ if (Math.hypot(dir.x, dir.y) < 1e-15) {
334
+ // Circle-like: any direction is an eigenvector.
335
+ dir = { x: 1, y: 0 };
336
+ }
337
+ var len = Math.hypot(dir.x, dir.y);
338
+ return {
339
+ center: { x: uc * scale + mx, y: vc * scale + my },
340
+ majorDirection: { x: dir.x / len, y: dir.y / len },
341
+ majorRadius: majorRadius,
342
+ minorRadius: minorRadius
343
+ };
344
+ }
345
+ /** Ellipse parameter (eccentric anomaly) of a point near the ellipse. */
346
+ export function ellipseParam(e, p) {
347
+ var d = sub(p, e.center);
348
+ var u = dot(d, e.majorDirection);
349
+ var v = cross(e.majorDirection, d);
350
+ return normalizeAngle(Math.atan2(v / e.minorRadius, u / e.majorRadius));
351
+ }
352
+ /** Approximate geometric distance from `p` to the ellipse. */
353
+ export function ellipseDeviation(e, p) {
354
+ var d = sub(p, e.center);
355
+ var u = dot(d, e.majorDirection) / e.majorRadius;
356
+ var v = cross(e.majorDirection, d) / e.minorRadius;
357
+ var r = Math.hypot(u, v);
358
+ if (r === 0)
359
+ return e.minorRadius;
360
+ // Scale the normalized radial error back by the local radius.
361
+ var t = Math.atan2(v, u);
362
+ var local = Math.hypot(e.majorRadius * Math.cos(t), e.minorRadius * Math.sin(t));
363
+ return Math.abs(r - 1) * local;
364
+ }
365
+ //# sourceMappingURL=pdfRecGeometry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdfRecGeometry.js","sourceRoot":"","sources":["../../src/recognition/pdfRecGeometry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { PdfTextLineCandidate } from './pdfGlyphClustering';
2
+ /**
3
+ * Font engine an exploded text line was drawn with:
4
+ * - `shx`: SHX line text, glyphs are open centre-line strokes.
5
+ * - `mesh`: TrueType / outline text, glyphs are closed contours.
6
+ */
7
+ export type PdfTextFontKind = 'shx' | 'mesh';
8
+ /**
9
+ * Tells SHX line text from outline (mesh) text by its strokes.
10
+ *
11
+ * Outline glyphs are made of closed contours only, while SHX glyphs are
12
+ * mostly open strokes (only a few shapes such as `O` or `0` may close), so
13
+ * a line whose strokes are mostly closed is outline text.
14
+ */
15
+ export declare function classifyPdfTextLineFont(line: Pick<PdfTextLineCandidate, 'strokes' | 'height'>): PdfTextFontKind;
16
+ //# sourceMappingURL=pdfTextFontKind.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdfTextFontKind.d.ts","sourceRoot":"","sources":["../../src/recognition/pdfTextFontKind.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAEhE;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,MAAM,CAAA;AAQ5C;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,GAAG,QAAQ,CAAC,GACrD,eAAe,CAiBjB"}
@@ -0,0 +1,51 @@
1
+ var __values = (this && this.__values) || function(o) {
2
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
3
+ if (m) return m.call(o);
4
+ if (o && typeof o.length === "number") return {
5
+ next: function () {
6
+ if (o && i >= o.length) o = void 0;
7
+ return { value: o && o[i++], done: !o };
8
+ }
9
+ };
10
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
11
+ };
12
+ /** Share of closed strokes from which a line counts as outline text. */
13
+ var MESH_CLOSED_RATIO = 0.6;
14
+ /** Gap between a stroke's ends still treated as closed, × line height. */
15
+ var CLOSED_TOLERANCE = 0.02;
16
+ /**
17
+ * Tells SHX line text from outline (mesh) text by its strokes.
18
+ *
19
+ * Outline glyphs are made of closed contours only, while SHX glyphs are
20
+ * mostly open strokes (only a few shapes such as `O` or `0` may close), so
21
+ * a line whose strokes are mostly closed is outline text.
22
+ */
23
+ export function classifyPdfTextLineFont(line) {
24
+ var e_1, _a;
25
+ var tolerance = line.height * CLOSED_TOLERANCE;
26
+ var closed = 0;
27
+ var counted = 0;
28
+ try {
29
+ for (var _b = __values(line.strokes), _c = _b.next(); !_c.done; _c = _b.next()) {
30
+ var points = _c.value.points;
31
+ if (points.length < 2)
32
+ continue;
33
+ counted++;
34
+ var first = points[0];
35
+ var last = points[points.length - 1];
36
+ if (points.length > 2 &&
37
+ Math.hypot(first.x - last.x, first.y - last.y) <= tolerance) {
38
+ closed++;
39
+ }
40
+ }
41
+ }
42
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
43
+ finally {
44
+ try {
45
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
46
+ }
47
+ finally { if (e_1) throw e_1.error; }
48
+ }
49
+ return counted > 0 && closed / counted >= MESH_CLOSED_RATIO ? 'mesh' : 'shx';
50
+ }
51
+ //# sourceMappingURL=pdfTextFontKind.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdfTextFontKind.js","sourceRoot":"","sources":["../../src/recognition/pdfTextFontKind.ts"],"names":[],"mappings":";;;;;;;;;;;AASA,wEAAwE;AACxE,IAAM,iBAAiB,GAAG,GAAG,CAAA;AAE7B,0EAA0E;AAC1E,IAAM,gBAAgB,GAAG,IAAI,CAAA;AAE7B;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CACrC,IAAsD;;IAEtD,IAAM,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,gBAAgB,CAAA;IAChD,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,IAAI,OAAO,GAAG,CAAC,CAAA;;QACf,KAAyB,IAAA,KAAA,SAAA,IAAI,CAAC,OAAO,CAAA,gBAAA,4BAAE,CAAC;YAA3B,IAAA,MAAM,kBAAA;YACjB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAQ;YAC/B,OAAO,EAAE,CAAA;YACT,IAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;YACvB,IAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;YACtC,IACE,MAAM,CAAC,MAAM,GAAG,CAAC;gBACjB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,SAAS,EAC3D,CAAC;gBACD,MAAM,EAAE,CAAA;YACV,CAAC;QACH,CAAC;;;;;;;;;IACD,OAAO,OAAO,GAAG,CAAC,IAAI,MAAM,GAAG,OAAO,IAAI,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAA;AAC9E,CAAC"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Merges recovered text lines (often single characters the clustering left
3
+ * apart) into one text block: groups them into paragraphs by baseline,
4
+ * orders them for reading and joins their texts.
5
+ *
6
+ * Pure geometry, like {@link clusterPdfTextStrokes}: unit-testable without
7
+ * the data model.
8
+ */
9
+ import type { PdfTextLineCandidate } from './pdfGlyphClustering';
10
+ /** One line taking part in a merge. */
11
+ export interface PdfTextMergePart<Id> {
12
+ line: PdfTextLineCandidate<Id>;
13
+ text: string;
14
+ }
15
+ /** One paragraph (text line) of a merged block. */
16
+ export interface PdfTextMergeParagraph {
17
+ /** Indexes of the parts on this line, left to right. */
18
+ parts: number[];
19
+ /** Baseline offset across the block direction (local v). */
20
+ baseline: number;
21
+ /** Lowest ink of the line (local v), descenders included. */
22
+ bottom: number;
23
+ /** Extent along the baseline (local u). */
24
+ minU: number;
25
+ maxU: number;
26
+ text: string;
27
+ }
28
+ /** Result of {@link mergePdfTextLines}. */
29
+ export interface PdfTextMergeResult<Id> {
30
+ /**
31
+ * The merged block as one line candidate: all strokes, glyphs in reading
32
+ * order, the block direction, the baseline-left of its first paragraph,
33
+ * the median text height and the overall width.
34
+ */
35
+ line: PdfTextLineCandidate<Id>;
36
+ /** Paragraphs from top to bottom. */
37
+ paragraphs: PdfTextMergeParagraph[];
38
+ /** Texts of the paragraphs joined by `\n`. */
39
+ text: string;
40
+ /** Mean baseline distance between paragraphs, 0 for one paragraph. */
41
+ lineSpacing: number;
42
+ }
43
+ /**
44
+ * Advance width of `text` at width factor 1 and the given text height, in
45
+ * the font the merged text is drawn with, or `undefined` when unknown.
46
+ */
47
+ export type PdfTextMergeMeasure = (text: string, height: number) => number | undefined;
48
+ /** Options of {@link mergePdfTextLines}. */
49
+ export interface PdfTextMergeOptions {
50
+ /**
51
+ * Measures text in the target font, so the gaps between parts become the
52
+ * number of spaces that keeps each part at its original place. Without it
53
+ * a gap wider than half the text height becomes one space.
54
+ */
55
+ measure?: PdfTextMergeMeasure;
56
+ }
57
+ /**
58
+ * Merges lines into one block.
59
+ *
60
+ * The block direction is that of the part with the most glyphs: a single
61
+ * glyph's own direction is often a poor guess (an `I` looks vertical).
62
+ */
63
+ export declare function mergePdfTextLines<Id>(parts: PdfTextMergePart<Id>[], options?: PdfTextMergeOptions): PdfTextMergeResult<Id>;
64
+ /**
65
+ * Whether two lines read as one: same direction (or a single glyph), similar
66
+ * height, the same baseline and close together along it.
67
+ *
68
+ * @param maxGap - Largest gap along the baseline, × text height.
69
+ */
70
+ export declare function arePdfTextLinesAdjacent(a: PdfTextLineCandidate, b: PdfTextLineCandidate, maxGap?: number): boolean;
71
+ //# sourceMappingURL=pdfTextMerge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdfTextMerge.d.ts","sourceRoot":"","sources":["../../src/recognition/pdfTextMerge.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAgB,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAG9E,uCAAuC;AACvC,MAAM,WAAW,gBAAgB,CAAC,EAAE;IAClC,IAAI,EAAE,oBAAoB,CAAC,EAAE,CAAC,CAAA;IAC9B,IAAI,EAAE,MAAM,CAAA;CACb;AAED,mDAAmD;AACnD,MAAM,WAAW,qBAAqB;IACpC,wDAAwD;IACxD,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,CAAA;IAChB,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAA;IACd,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb;AAED,2CAA2C;AAC3C,MAAM,WAAW,kBAAkB,CAAC,EAAE;IACpC;;;;OAIG;IACH,IAAI,EAAE,oBAAoB,CAAC,EAAE,CAAC,CAAA;IAC9B,qCAAqC;IACrC,UAAU,EAAE,qBAAqB,EAAE,CAAA;IACnC,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAA;IACZ,sEAAsE;IACtE,WAAW,EAAE,MAAM,CAAA;CACpB;AAED;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAChC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,KACX,MAAM,GAAG,SAAS,CAAA;AAEvB,4CAA4C;AAC5C,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,OAAO,CAAC,EAAE,mBAAmB,CAAA;CAC9B;AAmBD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAClC,KAAK,EAAE,gBAAgB,CAAC,EAAE,CAAC,EAAE,EAC7B,OAAO,GAAE,mBAAwB,GAChC,kBAAkB,CAAC,EAAE,CAAC,CAgExB;AA8CD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,CAAC,EAAE,oBAAoB,EACvB,CAAC,EAAE,oBAAoB,EACvB,MAAM,SAAM,GACX,OAAO,CAqBT"}