@pallasoft/ps-file-components 2.0.1 → 2.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.
Files changed (97) hide show
  1. package/dist/components/ps-document-scanner-loader.d.ts +1 -1
  2. package/dist/components/ps-document-scanner-sheet.d.ts +1 -1
  3. package/dist/components/ps-document-scanner-sheet.js +80 -9
  4. package/dist/components/ps-document-scanner.d.ts +1 -1
  5. package/dist/components/ps-document-scanner.js +2 -2
  6. package/dist/components/ps-image-viewer.js +35 -16
  7. package/dist/components/ps-pdf-viewer.js +18 -1
  8. package/dist/components/ps-scan-camera-view.js +2 -2
  9. package/dist/components/ps-scan-page-strip.d.ts +8 -0
  10. package/dist/components/ps-scan-page-strip.js +8 -0
  11. package/dist/components/ps-scan-preview.d.ts +8 -2
  12. package/dist/components/ps-scan-preview.js +6 -1
  13. package/dist/components/ps-scan-viewfinder-overlay.d.ts +4 -2
  14. package/dist/components/ps-scan-viewfinder-overlay.js +6 -6
  15. package/dist/constants/ps-document-scanner-labels.d.ts +2 -1
  16. package/dist/constants/ps-document-scanner-labels.js +2 -1
  17. package/dist/constants/ps-file-viewer-config.d.ts +1 -0
  18. package/dist/constants/ps-file-viewer-config.js +1 -0
  19. package/dist/constants/ps-scan-config.d.ts +10 -3
  20. package/dist/constants/ps-scan-config.js +11 -3
  21. package/dist/constants/ps-scan-detect-profiles.d.ts +10 -0
  22. package/dist/constants/ps-scan-detect-profiles.js +8 -0
  23. package/dist/constants/ps-scan-format.d.ts +5 -0
  24. package/dist/constants/ps-scan-format.js +7 -0
  25. package/dist/esm/components/ps-document-scanner-sheet.js +80 -9
  26. package/dist/esm/components/ps-document-scanner.js +2 -2
  27. package/dist/esm/components/ps-image-viewer.js +35 -16
  28. package/dist/esm/components/ps-pdf-viewer.js +18 -1
  29. package/dist/esm/components/ps-scan-camera-view.js +2 -2
  30. package/dist/esm/components/ps-scan-page-strip.js +4 -0
  31. package/dist/esm/components/ps-scan-preview.js +6 -1
  32. package/dist/esm/components/ps-scan-viewfinder-overlay.js +6 -6
  33. package/dist/esm/constants/ps-document-scanner-labels.js +2 -1
  34. package/dist/esm/constants/ps-file-viewer-config.js +1 -0
  35. package/dist/esm/constants/ps-scan-config.js +11 -3
  36. package/dist/esm/constants/ps-scan-detect-profiles.js +5 -0
  37. package/dist/esm/constants/ps-scan-format.js +4 -0
  38. package/dist/esm/hooks/use-ps-drag-pan.js +66 -0
  39. package/dist/esm/hooks/use-ps-scan-live-detection.js +47 -22
  40. package/dist/esm/hooks/use-ps-scan-quad-tween.js +34 -0
  41. package/dist/esm/index.js +5 -0
  42. package/dist/esm/models/ps-document-scanner-page-labels.js +1 -0
  43. package/dist/esm/models/ps-drag-pan-handlers.js +1 -0
  44. package/dist/esm/models/ps-drag-pan-options.js +1 -0
  45. package/dist/esm/models/ps-scan-detect-profile.js +1 -0
  46. package/dist/esm/models/ps-scan-multi-page.js +1 -0
  47. package/dist/esm/models/ps-scan-page.js +1 -0
  48. package/dist/esm/models/ps-scan-pdf-page.js +1 -0
  49. package/dist/esm/services/ps-pan-service.js +13 -0
  50. package/dist/esm/services/ps-scan-canvas-service.js +10 -0
  51. package/dist/esm/services/ps-scan-edge-service.js +7 -4
  52. package/dist/esm/services/ps-scan-file-name-service.js +8 -1
  53. package/dist/esm/services/ps-scan-frame-service.js +10 -0
  54. package/dist/esm/services/ps-scan-output-service.js +23 -0
  55. package/dist/esm/services/ps-scan-pdf-service.js +20 -0
  56. package/dist/esm/services/ps-scan-quad-tween-service.js +10 -0
  57. package/dist/hooks/use-ps-drag-pan.d.ts +3 -0
  58. package/dist/hooks/use-ps-drag-pan.js +70 -0
  59. package/dist/hooks/use-ps-scan-live-detection.js +46 -21
  60. package/dist/hooks/use-ps-scan-quad-tween.d.ts +3 -0
  61. package/dist/hooks/use-ps-scan-quad-tween.js +38 -0
  62. package/dist/index.d.ts +5 -0
  63. package/dist/index.js +5 -0
  64. package/dist/models/ps-document-scanner-page-labels.d.ts +6 -0
  65. package/dist/models/ps-document-scanner-page-labels.js +2 -0
  66. package/dist/models/ps-document-scanner-props.d.ts +5 -0
  67. package/dist/models/ps-document-scanner-sheet-props.d.ts +4 -0
  68. package/dist/models/ps-drag-pan-handlers.d.ts +8 -0
  69. package/dist/models/ps-drag-pan-handlers.js +2 -0
  70. package/dist/models/ps-drag-pan-options.d.ts +9 -0
  71. package/dist/models/ps-drag-pan-options.js +2 -0
  72. package/dist/models/ps-scan-detect-profile.d.ts +4 -0
  73. package/dist/models/ps-scan-detect-profile.js +2 -0
  74. package/dist/models/ps-scan-live-detection.d.ts +3 -1
  75. package/dist/models/ps-scan-multi-page.d.ts +9 -0
  76. package/dist/models/ps-scan-multi-page.js +2 -0
  77. package/dist/models/ps-scan-page.d.ts +4 -0
  78. package/dist/models/ps-scan-page.js +2 -0
  79. package/dist/models/ps-scan-pdf-page.d.ts +5 -0
  80. package/dist/models/ps-scan-pdf-page.js +2 -0
  81. package/dist/services/ps-pan-service.d.ts +6 -0
  82. package/dist/services/ps-pan-service.js +17 -0
  83. package/dist/services/ps-scan-canvas-service.d.ts +1 -0
  84. package/dist/services/ps-scan-canvas-service.js +10 -0
  85. package/dist/services/ps-scan-edge-service.d.ts +2 -1
  86. package/dist/services/ps-scan-edge-service.js +7 -4
  87. package/dist/services/ps-scan-file-name-service.d.ts +2 -0
  88. package/dist/services/ps-scan-file-name-service.js +8 -1
  89. package/dist/services/ps-scan-frame-service.d.ts +3 -0
  90. package/dist/services/ps-scan-frame-service.js +14 -0
  91. package/dist/services/ps-scan-output-service.d.ts +6 -0
  92. package/dist/services/ps-scan-output-service.js +27 -0
  93. package/dist/services/ps-scan-pdf-service.d.ts +8 -0
  94. package/dist/services/ps-scan-pdf-service.js +24 -0
  95. package/dist/services/ps-scan-quad-tween-service.d.ts +4 -0
  96. package/dist/services/ps-scan-quad-tween-service.js +14 -0
  97. package/package.json +2 -2
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PsScanEdgeService = void 0;
4
4
  const ps_scan_config_1 = require("../constants/ps-scan-config");
5
+ const ps_scan_detect_profiles_1 = require("../constants/ps-scan-detect-profiles");
5
6
  const ps_scan_canny_service_1 = require("./ps-scan-canny-service");
6
7
  const ps_scan_geometry_service_1 = require("./ps-scan-geometry-service");
7
8
  const ps_scan_hull_service_1 = require("./ps-scan-hull-service");
@@ -12,13 +13,14 @@ const ps_scan_raster_service_1 = require("./ps-scan-raster-service");
12
13
  const ps_scan_region_service_1 = require("./ps-scan-region-service");
13
14
  const ps_scan_yield_service_1 = require("./ps-scan-yield-service");
14
15
  class PsScanEdgeService {
15
- static async detect(source, maxDimension) {
16
+ static async detect(source, maxDimension, profile = ps_scan_detect_profiles_1.PsScanDetectProfiles.full) {
16
17
  const scale = Math.min(1, maxDimension / Math.max(source.width, source.height));
17
18
  const width = Math.max(16, Math.round(source.width * scale));
18
19
  const height = Math.max(16, Math.round(source.height * scale));
19
20
  const raster = ps_scan_raster_service_1.PsScanRasterService.resize(source, width, height);
20
21
  const gray = ps_scan_image_filter_service_1.PsScanImageFilterService.blur(ps_scan_image_filter_service_1.PsScanImageFilterService.grayscale(raster), width, height);
21
- await ps_scan_yield_service_1.PsScanYieldService.next();
22
+ if (profile.isYielding)
23
+ await ps_scan_yield_service_1.PsScanYieldService.next();
22
24
  const edges = ps_scan_canny_service_1.PsScanCannyService.edges(gray, width, height);
23
25
  for (let index = 0; index < width; index += 1) {
24
26
  edges[index] = 1;
@@ -30,8 +32,9 @@ class PsScanEdgeService {
30
32
  }
31
33
  let best = null;
32
34
  let bestArea = 0;
33
- for (const radius of ps_scan_config_1.PsScanConfig.closeRadii) {
34
- await ps_scan_yield_service_1.PsScanYieldService.next();
35
+ for (const radius of profile.closeRadii) {
36
+ if (profile.isYielding)
37
+ await ps_scan_yield_service_1.PsScanYieldService.next();
35
38
  const closed = ps_scan_morphology_service_1.PsScanMorphologyService.close(edges, width, height, radius);
36
39
  const regions = ps_scan_region_service_1.PsScanRegionService.enclosed(closed, width, height, width * height * ps_scan_config_1.PsScanConfig.detectMinAreaRatio * 0.5);
37
40
  for (const region of regions) {
@@ -1,4 +1,6 @@
1
1
  export declare class PsScanFileNameService {
2
2
  static build(base: string): string;
3
+ static buildPng(base: string, index: number, count: number): string;
4
+ static buildPdf(base: string): string;
3
5
  static sanitize(base: string): string;
4
6
  }
@@ -6,11 +6,18 @@ class PsScanFileNameService {
6
6
  static build(base) {
7
7
  return `${PsScanFileNameService.sanitize(base)}.jpg`;
8
8
  }
9
+ static buildPng(base, index, count) {
10
+ const name = PsScanFileNameService.sanitize(base);
11
+ return count > 1 ? `${name}-${index + 1}.png` : `${name}.png`;
12
+ }
13
+ static buildPdf(base) {
14
+ return `${PsScanFileNameService.sanitize(base)}.pdf`;
15
+ }
9
16
  static sanitize(base) {
10
17
  const cleaned = Array.from(base)
11
18
  .filter((char) => char.charCodeAt(0) >= 32)
12
19
  .join('')
13
- .replace(/\.(pdf|jpe?g)$/i, '')
20
+ .replace(/\.(pdf|jpe?g|png)$/i, '')
14
21
  .replace(/[\\/:*?"<>|]+/g, '-')
15
22
  .replace(/\s+/g, ' ')
16
23
  .replace(/^[\s.-]+|[\s.-]+$/g, '');
@@ -0,0 +1,3 @@
1
+ export declare class PsScanFrameService {
2
+ static schedule(video: HTMLVideoElement | null, callback: () => void): () => void;
3
+ }
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PsScanFrameService = void 0;
4
+ class PsScanFrameService {
5
+ static schedule(video, callback) {
6
+ if (video !== null && typeof video.requestVideoFrameCallback === 'function') {
7
+ const videoHandle = video.requestVideoFrameCallback(() => callback());
8
+ return () => video.cancelVideoFrameCallback(videoHandle);
9
+ }
10
+ const frameHandle = requestAnimationFrame(() => callback());
11
+ return () => cancelAnimationFrame(frameHandle);
12
+ }
13
+ }
14
+ exports.PsScanFrameService = PsScanFrameService;
@@ -0,0 +1,6 @@
1
+ import { PsScanFormat } from '../constants/ps-scan-format';
2
+ import type { PsScanPage } from '../models/ps-scan-page';
3
+ export declare class PsScanOutputService {
4
+ static build(pages: PsScanPage[], format: PsScanFormat, fileName: string): Promise<File[]>;
5
+ static preferred(pageCount: number, formats: readonly PsScanFormat[]): PsScanFormat;
6
+ }
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PsScanOutputService = void 0;
4
+ const ps_scan_config_1 = require("../constants/ps-scan-config");
5
+ const ps_scan_format_1 = require("../constants/ps-scan-format");
6
+ const ps_scan_canvas_service_1 = require("./ps-scan-canvas-service");
7
+ const ps_scan_file_name_service_1 = require("./ps-scan-file-name-service");
8
+ const ps_scan_pdf_service_1 = require("./ps-scan-pdf-service");
9
+ class PsScanOutputService {
10
+ static async build(pages, format, fileName) {
11
+ if (format === ps_scan_format_1.PsScanFormat.Pdf)
12
+ return [
13
+ new File([await ps_scan_pdf_service_1.PsScanPdfService.build(pages)], ps_scan_file_name_service_1.PsScanFileNameService.buildPdf(fileName), {
14
+ type: ps_scan_config_1.PsScanConfig.pdfType,
15
+ }),
16
+ ];
17
+ const files = [];
18
+ for (const [index, page] of pages.entries())
19
+ files.push(new File([await ps_scan_canvas_service_1.PsScanCanvasService.toPng(page.blob)], ps_scan_file_name_service_1.PsScanFileNameService.buildPng(fileName, index, pages.length), { type: ps_scan_config_1.PsScanConfig.pngType }));
20
+ return files;
21
+ }
22
+ static preferred(pageCount, formats) {
23
+ const wanted = pageCount > 1 ? ps_scan_format_1.PsScanFormat.Pdf : ps_scan_format_1.PsScanFormat.Png;
24
+ return formats.includes(wanted) ? wanted : formats[0];
25
+ }
26
+ }
27
+ exports.PsScanOutputService = PsScanOutputService;
@@ -0,0 +1,8 @@
1
+ import type { PsPageSize } from '../models/ps-page-size';
2
+ import type { PsScanPage } from '../models/ps-scan-page';
3
+ import type { PsScanPdfPage } from '../models/ps-scan-pdf-page';
4
+ export declare class PsScanPdfService {
5
+ static build(pages: PsScanPage[]): Promise<Blob>;
6
+ static fromJpegs(pages: PsScanPdfPage[]): Blob;
7
+ static pageSize(page: PsScanPdfPage): PsPageSize;
8
+ }
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PsScanPdfService = void 0;
4
+ const ps_utilities_1 = require("@pallasoft/ps-utilities");
5
+ const ps_scan_config_1 = require("../constants/ps-scan-config");
6
+ class PsScanPdfService {
7
+ static async build(pages) {
8
+ const loaded = [];
9
+ for (const page of pages)
10
+ loaded.push({
11
+ bytes: new Uint8Array(await page.blob.arrayBuffer()),
12
+ height: page.height,
13
+ width: page.width,
14
+ });
15
+ return PsScanPdfService.fromJpegs(loaded);
16
+ }
17
+ static fromJpegs(pages) {
18
+ return new Blob([ps_utilities_1.Common.JpegPdfService.fromJpegs(pages)], { type: ps_scan_config_1.PsScanConfig.pdfType });
19
+ }
20
+ static pageSize(page) {
21
+ return ps_utilities_1.Common.JpegPdfService.pageSize(page);
22
+ }
23
+ }
24
+ exports.PsScanPdfService = PsScanPdfService;
@@ -0,0 +1,4 @@
1
+ import type { PsScanQuad } from '../models/ps-scan-quad';
2
+ export declare class PsScanQuadTweenService {
3
+ static step(current: PsScanQuad, target: PsScanQuad, elapsedMs: number): PsScanQuad;
4
+ }
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PsScanQuadTweenService = void 0;
4
+ const ps_scan_config_1 = require("../constants/ps-scan-config");
5
+ class PsScanQuadTweenService {
6
+ static step(current, target, elapsedMs) {
7
+ const weight = 1 - Math.exp(-Math.max(0, elapsedMs) / ps_scan_config_1.PsScanConfig.liveTweenMs);
8
+ return current.map((point, index) => ({
9
+ x: point.x + (target[index].x - point.x) * weight,
10
+ y: point.y + (target[index].y - point.y) * weight,
11
+ }));
12
+ }
13
+ }
14
+ exports.PsScanQuadTweenService = PsScanQuadTweenService;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pallasoft/ps-file-components",
3
- "version": "2.0.1",
3
+ "version": "2.2.0",
4
4
  "private": false,
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/esm/index.js",
@@ -33,7 +33,7 @@
33
33
  "@pallasoft/ps-core-components": "^2.37.0",
34
34
  "@pallasoft/ps-icons": "^1.9.0",
35
35
  "@pallasoft/ps-popovers": "^1.13.0",
36
- "@pallasoft/ps-utilities": "^2.19.1",
36
+ "@pallasoft/ps-utilities": "^2.28.0",
37
37
  "pdfjs-dist": "^6.3.289"
38
38
  },
39
39
  "peerDependencies": {