@pdfme/schemas 3.1.5 → 3.2.0-dev.1

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 (146) hide show
  1. package/README.md +303 -0
  2. package/dist/cjs/__tests__/{renderUtils.test.js → utils.test.js} +38 -12
  3. package/dist/cjs/__tests__/utils.test.js.map +1 -0
  4. package/dist/cjs/src/barcodes/constants.js +2 -1
  5. package/dist/cjs/src/barcodes/constants.js.map +1 -1
  6. package/dist/cjs/src/barcodes/helper.js +1 -2
  7. package/dist/cjs/src/barcodes/helper.js.map +1 -1
  8. package/dist/cjs/src/barcodes/index.js +2 -2
  9. package/dist/cjs/src/barcodes/index.js.map +1 -1
  10. package/dist/cjs/src/barcodes/pdfRender.js +3 -3
  11. package/dist/cjs/src/barcodes/pdfRender.js.map +1 -1
  12. package/dist/cjs/src/barcodes/propPanel.js +45 -30
  13. package/dist/cjs/src/barcodes/propPanel.js.map +1 -1
  14. package/dist/cjs/src/barcodes/uiRender.js +11 -37
  15. package/dist/cjs/src/barcodes/uiRender.js.map +1 -1
  16. package/dist/cjs/src/graphics/helper.js +115 -0
  17. package/dist/cjs/src/graphics/helper.js.map +1 -0
  18. package/dist/cjs/src/graphics/image.js +179 -0
  19. package/dist/cjs/src/graphics/image.js.map +1 -0
  20. package/dist/cjs/src/graphics/svg.js +96 -0
  21. package/dist/cjs/src/graphics/svg.js.map +1 -0
  22. package/dist/cjs/src/index.js +42 -9
  23. package/dist/cjs/src/index.js.map +1 -1
  24. package/dist/cjs/src/shapes/line.js +57 -0
  25. package/dist/cjs/src/shapes/line.js.map +1 -0
  26. package/dist/cjs/src/shapes/rectAndEllipse.js +100 -0
  27. package/dist/cjs/src/shapes/rectAndEllipse.js.map +1 -0
  28. package/dist/cjs/src/text/helper.js.map +1 -1
  29. package/dist/cjs/src/text/index.js +16 -2
  30. package/dist/cjs/src/text/index.js.map +1 -1
  31. package/dist/cjs/src/text/pdfRender.js +9 -32
  32. package/dist/cjs/src/text/pdfRender.js.map +1 -1
  33. package/dist/cjs/src/text/propPanel.js +2 -2
  34. package/dist/cjs/src/text/propPanel.js.map +1 -1
  35. package/dist/cjs/src/text/uiRender.js +12 -18
  36. package/dist/cjs/src/text/uiRender.js.map +1 -1
  37. package/dist/cjs/src/utils.js +134 -0
  38. package/dist/cjs/src/utils.js.map +1 -0
  39. package/dist/esm/__tests__/{renderUtils.test.js → utils.test.js} +34 -8
  40. package/dist/esm/__tests__/utils.test.js.map +1 -0
  41. package/dist/esm/src/barcodes/constants.js +1 -0
  42. package/dist/esm/src/barcodes/constants.js.map +1 -1
  43. package/dist/esm/src/barcodes/helper.js +2 -3
  44. package/dist/esm/src/barcodes/helper.js.map +1 -1
  45. package/dist/esm/src/barcodes/index.js +2 -2
  46. package/dist/esm/src/barcodes/index.js.map +1 -1
  47. package/dist/esm/src/barcodes/pdfRender.js +2 -2
  48. package/dist/esm/src/barcodes/pdfRender.js.map +1 -1
  49. package/dist/esm/src/barcodes/propPanel.js +46 -31
  50. package/dist/esm/src/barcodes/propPanel.js.map +1 -1
  51. package/dist/esm/src/barcodes/uiRender.js +11 -37
  52. package/dist/esm/src/barcodes/uiRender.js.map +1 -1
  53. package/dist/esm/src/graphics/helper.js +111 -0
  54. package/dist/esm/src/graphics/helper.js.map +1 -0
  55. package/dist/esm/src/graphics/image.js +176 -0
  56. package/dist/esm/src/graphics/image.js.map +1 -0
  57. package/dist/esm/src/graphics/svg.js +93 -0
  58. package/dist/esm/src/graphics/svg.js.map +1 -0
  59. package/dist/esm/src/index.js +7 -4
  60. package/dist/esm/src/index.js.map +1 -1
  61. package/dist/esm/src/shapes/line.js +55 -0
  62. package/dist/esm/src/shapes/line.js.map +1 -0
  63. package/dist/esm/src/shapes/rectAndEllipse.js +97 -0
  64. package/dist/esm/src/shapes/rectAndEllipse.js.map +1 -0
  65. package/dist/esm/src/text/helper.js.map +1 -1
  66. package/dist/esm/src/text/index.js +15 -2
  67. package/dist/esm/src/text/index.js.map +1 -1
  68. package/dist/esm/src/text/pdfRender.js +6 -29
  69. package/dist/esm/src/text/pdfRender.js.map +1 -1
  70. package/dist/esm/src/text/propPanel.js +2 -2
  71. package/dist/esm/src/text/propPanel.js.map +1 -1
  72. package/dist/esm/src/text/uiRender.js +12 -18
  73. package/dist/esm/src/text/uiRender.js.map +1 -1
  74. package/dist/esm/src/utils.js +124 -0
  75. package/dist/esm/src/utils.js.map +1 -0
  76. package/dist/types/src/barcodes/constants.d.ts +1 -0
  77. package/dist/types/src/barcodes/helper.d.ts +1 -0
  78. package/dist/types/src/barcodes/index.d.ts +2 -2
  79. package/dist/types/src/barcodes/types.d.ts +1 -0
  80. package/dist/types/src/graphics/helper.d.ts +5 -0
  81. package/dist/types/src/graphics/image.d.ts +7 -0
  82. package/dist/types/src/graphics/svg.d.ts +6 -0
  83. package/dist/types/src/index.d.ts +7 -4
  84. package/dist/types/src/shapes/line.d.ts +6 -0
  85. package/dist/types/src/shapes/rectAndEllipse.d.ts +144 -0
  86. package/dist/types/src/text/index.d.ts +3 -2
  87. package/dist/types/src/text/pdfRender.d.ts +1 -1
  88. package/dist/types/src/{renderUtils.d.ts → utils.d.ts} +5 -1
  89. package/package.json +4 -3
  90. package/src/barcodes/constants.ts +2 -0
  91. package/src/barcodes/helper.ts +12 -3
  92. package/src/barcodes/index.ts +2 -2
  93. package/src/barcodes/pdfRender.ts +2 -2
  94. package/src/barcodes/propPanel.ts +50 -30
  95. package/src/barcodes/types.ts +1 -0
  96. package/src/barcodes/uiRender.ts +11 -41
  97. package/src/graphics/helper.ts +147 -0
  98. package/src/graphics/image.ts +207 -0
  99. package/src/graphics/svg.ts +98 -0
  100. package/src/index.ts +21 -4
  101. package/src/shapes/line.ts +67 -0
  102. package/src/shapes/rectAndEllipse.ts +110 -0
  103. package/src/text/helper.ts +0 -1
  104. package/src/text/index.ts +16 -2
  105. package/src/text/pdfRender.ts +6 -42
  106. package/src/text/propPanel.ts +2 -2
  107. package/src/text/uiRender.ts +14 -29
  108. package/src/utils.ts +161 -0
  109. package/dist/cjs/__tests__/renderUtils.test.js.map +0 -1
  110. package/dist/cjs/src/image/index.js +0 -8
  111. package/dist/cjs/src/image/index.js.map +0 -1
  112. package/dist/cjs/src/image/pdfRender.js +0 -20
  113. package/dist/cjs/src/image/pdfRender.js.map +0 -1
  114. package/dist/cjs/src/image/propPanel.js +0 -19
  115. package/dist/cjs/src/image/propPanel.js.map +0 -1
  116. package/dist/cjs/src/image/types.js +0 -3
  117. package/dist/cjs/src/image/types.js.map +0 -1
  118. package/dist/cjs/src/image/uiRender.js +0 -111
  119. package/dist/cjs/src/image/uiRender.js.map +0 -1
  120. package/dist/cjs/src/renderUtils.js +0 -59
  121. package/dist/cjs/src/renderUtils.js.map +0 -1
  122. package/dist/esm/__tests__/renderUtils.test.js.map +0 -1
  123. package/dist/esm/src/image/index.js +0 -6
  124. package/dist/esm/src/image/index.js.map +0 -1
  125. package/dist/esm/src/image/pdfRender.js +0 -16
  126. package/dist/esm/src/image/pdfRender.js.map +0 -1
  127. package/dist/esm/src/image/propPanel.js +0 -16
  128. package/dist/esm/src/image/propPanel.js.map +0 -1
  129. package/dist/esm/src/image/types.js +0 -2
  130. package/dist/esm/src/image/types.js.map +0 -1
  131. package/dist/esm/src/image/uiRender.js +0 -107
  132. package/dist/esm/src/image/uiRender.js.map +0 -1
  133. package/dist/esm/src/renderUtils.js +0 -53
  134. package/dist/esm/src/renderUtils.js.map +0 -1
  135. package/dist/types/src/image/index.d.ts +0 -4
  136. package/dist/types/src/image/pdfRender.d.ts +0 -3
  137. package/dist/types/src/image/propPanel.d.ts +0 -3
  138. package/dist/types/src/image/types.d.ts +0 -3
  139. package/dist/types/src/image/uiRender.d.ts +0 -3
  140. package/src/image/index.ts +0 -8
  141. package/src/image/pdfRender.ts +0 -28
  142. package/src/image/propPanel.ts +0 -19
  143. package/src/image/types.ts +0 -3
  144. package/src/image/uiRender.ts +0 -121
  145. package/src/renderUtils.ts +0 -73
  146. /package/dist/types/__tests__/{renderUtils.test.d.ts → utils.test.d.ts} +0 -0
@@ -1,107 +0,0 @@
1
- import { ZOOM } from '@pdfme/common';
2
- import { addAlphaToHex } from '../renderUtils.js';
3
- const fullSize = { width: '100%', height: '100%' };
4
- const readFile = (input) => new Promise((resolve, reject) => {
5
- const fileReader = new FileReader();
6
- fileReader.onload = (e) => {
7
- if (e.target?.result) {
8
- resolve(e.target.result);
9
- }
10
- };
11
- fileReader.onerror = (e) => {
12
- reject(new Error('[@pdfme/schemas] File reading failed'));
13
- };
14
- let file = null;
15
- if (input instanceof FileList && input.length > 0) {
16
- file = input[0];
17
- }
18
- else if (input instanceof File) {
19
- file = input;
20
- }
21
- if (file) {
22
- fileReader.readAsDataURL(file);
23
- }
24
- else {
25
- reject(new Error('[@pdfme/schemas] No files provided'));
26
- }
27
- });
28
- export const uiRender = async (arg) => {
29
- const { value, rootElement, mode, onChange, stopEditing, tabIndex, placeholder, schema, theme } = arg;
30
- const editable = mode === 'form' || mode === 'designer';
31
- const size = { width: schema.width * ZOOM, height: schema.height * ZOOM };
32
- const container = document.createElement('div');
33
- const containerStyle = {
34
- ...fullSize,
35
- backgroundImage: value ? 'none' : `url(${placeholder})`,
36
- backgroundSize: `${size.width}px ${size.height}px`,
37
- opacity: schema.opacity,
38
- };
39
- Object.assign(container.style, containerStyle);
40
- container.addEventListener('click', (e) => {
41
- if (editable) {
42
- e.stopPropagation();
43
- }
44
- });
45
- rootElement.appendChild(container);
46
- // image tag
47
- if (value) {
48
- const img = document.createElement('img');
49
- const imgStyle = { height: '100%', width: '100%', borderRadius: 0 };
50
- Object.assign(img.style, imgStyle);
51
- img.src = value;
52
- container.appendChild(img);
53
- }
54
- // remove button
55
- if (value && editable) {
56
- const button = document.createElement('button');
57
- button.textContent = 'x';
58
- const buttonStyle = {
59
- position: 'absolute',
60
- top: 0,
61
- left: 0,
62
- zIndex: 1,
63
- display: 'flex',
64
- justifyContent: 'center',
65
- alignItems: 'center',
66
- color: '#333',
67
- background: '#f2f2f2',
68
- borderRadius: '2px',
69
- border: '1px solid #767676',
70
- cursor: 'pointer',
71
- height: '24px',
72
- width: '24px',
73
- };
74
- Object.assign(button.style, buttonStyle);
75
- button.addEventListener('click', () => {
76
- onChange && onChange('');
77
- });
78
- container.appendChild(button);
79
- }
80
- // file input
81
- if (!value && editable) {
82
- const label = document.createElement('label');
83
- const labelStyle = {
84
- ...fullSize,
85
- display: editable ? 'flex' : 'none',
86
- position: 'absolute',
87
- top: 0,
88
- backgroundColor: editable || value ? addAlphaToHex(theme.colorPrimaryBg, 30) : 'none',
89
- cursor: 'pointer',
90
- };
91
- Object.assign(label.style, labelStyle);
92
- container.appendChild(label);
93
- const input = document.createElement('input');
94
- const inputStyle = { ...fullSize, position: 'absolute', top: '50%' };
95
- Object.assign(input.style, inputStyle);
96
- input.tabIndex = tabIndex || 0;
97
- input.type = 'file';
98
- input.accept = 'image/jpeg, image/png';
99
- input.addEventListener('change', (event) => {
100
- const changeEvent = event;
101
- readFile(changeEvent.target.files).then((result) => onChange && onChange(result));
102
- });
103
- input.addEventListener('blur', () => stopEditing && stopEditing());
104
- label.appendChild(input);
105
- }
106
- };
107
- //# sourceMappingURL=uiRender.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"uiRender.js","sourceRoot":"","sources":["../../../../src/image/uiRender.ts"],"names":[],"mappings":"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"}
@@ -1,53 +0,0 @@
1
- import { degrees, degreesToRadians } from '@pdfme/pdf-lib';
2
- import { mm2pt } from '@pdfme/common';
3
- export const convertForPdfLayoutProps = ({ schema, pageHeight, applyRotateTranslate = true, }) => {
4
- const { width: mmWidth, height: mmHeight, position, rotate, opacity } = schema;
5
- const { x: mmX, y: mmY } = position;
6
- const rotateDegrees = rotate ? -rotate : 0;
7
- const width = mm2pt(mmWidth);
8
- const height = mm2pt(mmHeight);
9
- let x = mm2pt(mmX);
10
- // PDF coordinate system is from bottom left, UI is top left, so we need to flip the y axis
11
- let y = pageHeight - mm2pt(mmY) - height;
12
- if (rotateDegrees && applyRotateTranslate) {
13
- // If rotating we must pivot around the same point as the UI performs its rotation.
14
- // The UI performs rotation around the objects center point (the pivot point below),
15
- // pdflib rotates around the bottom left corner of the object.
16
- // We must therefore adjust the X and Y by rotating the bottom left corner by this pivot point.
17
- const pivotPoint = { x: x + width / 2, y: pageHeight - mm2pt(mmY) - height / 2 };
18
- const rotatedPoint = rotatePoint({ x, y }, pivotPoint, rotateDegrees);
19
- x = rotatedPoint.x;
20
- y = rotatedPoint.y;
21
- }
22
- return {
23
- position: {
24
- x: x,
25
- y: y,
26
- },
27
- height: height,
28
- width: width,
29
- rotate: degrees(rotateDegrees),
30
- opacity,
31
- };
32
- };
33
- export const rotatePoint = (point, pivot, angleDegrees) => {
34
- const angleRadians = degreesToRadians(angleDegrees);
35
- const x = Math.cos(angleRadians) * (point.x - pivot.x) -
36
- Math.sin(angleRadians) * (point.y - pivot.y) +
37
- pivot.x;
38
- const y = Math.sin(angleRadians) * (point.x - pivot.x) +
39
- Math.cos(angleRadians) * (point.y - pivot.y) +
40
- pivot.y;
41
- return { x, y };
42
- };
43
- export const addAlphaToHex = (hex, alphaPercentage) => {
44
- if (!/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/i.test(hex)) {
45
- throw new Error('Invalid HEX color code');
46
- }
47
- const alphaValue = Math.round((alphaPercentage / 100) * 255);
48
- let alphaHex = alphaValue.toString(16);
49
- if (alphaHex.length === 1)
50
- alphaHex = '0' + alphaHex;
51
- return hex + alphaHex;
52
- };
53
- //# sourceMappingURL=renderUtils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"renderUtils.js","sourceRoot":"","sources":["../../../src/renderUtils.ts"],"names":[],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- import type { Plugin } from '@pdfme/common';
2
- import type { ImageSchema } from './types';
3
- declare const schema: Plugin<ImageSchema>;
4
- export default schema;
@@ -1,3 +0,0 @@
1
- import type { PDFRenderProps } from '@pdfme/common';
2
- import type { ImageSchema } from './types';
3
- export declare const pdfRender: (arg: PDFRenderProps<ImageSchema>) => Promise<void>;
@@ -1,3 +0,0 @@
1
- import { PropPanel } from '@pdfme/common';
2
- import type { ImageSchema } from './types';
3
- export declare const propPanel: PropPanel<ImageSchema>;
@@ -1,3 +0,0 @@
1
- import { Schema } from '@pdfme/common';
2
- export interface ImageSchema extends Schema {
3
- }
@@ -1,3 +0,0 @@
1
- import type { ImageSchema } from './types';
2
- import { UIRenderProps } from '@pdfme/common';
3
- export declare const uiRender: (arg: UIRenderProps<ImageSchema>) => Promise<void>;
@@ -1,8 +0,0 @@
1
- import type { Plugin } from '@pdfme/common';
2
- import { pdfRender } from './pdfRender.js';
3
- import { propPanel } from './propPanel.js';
4
- import { uiRender } from './uiRender.js';
5
- import type { ImageSchema } from './types';
6
-
7
- const schema: Plugin<ImageSchema> = { pdf: pdfRender, ui: uiRender, propPanel };
8
- export default schema;
@@ -1,28 +0,0 @@
1
- import type { PDFRenderProps, Schema } from '@pdfme/common';
2
- import type { ImageSchema } from './types';
3
- import { convertForPdfLayoutProps } from '../renderUtils.js';
4
-
5
- const getCacheKey = (schema: Schema, input: string) => `${schema.type}${input}`;
6
-
7
- export const pdfRender = async (arg: PDFRenderProps<ImageSchema>) => {
8
- const { value, schema, pdfDoc, page, _cache } = arg;
9
-
10
- const inputImageCacheKey = getCacheKey(schema, value);
11
- let image = _cache.get(inputImageCacheKey);
12
- if (!image) {
13
- const isPng = value.startsWith('data:image/png;');
14
- image = await (isPng ? pdfDoc.embedPng(value) : pdfDoc.embedJpg(value));
15
- _cache.set(inputImageCacheKey, image);
16
- }
17
-
18
- const pageHeight = page.getHeight();
19
- const {
20
- width,
21
- height,
22
- rotate,
23
- position: { x, y },
24
- opacity,
25
- } = convertForPdfLayoutProps({ schema, pageHeight });
26
-
27
- page.drawImage(image, { x, y, rotate, width, height, opacity });
28
- };
@@ -1,19 +0,0 @@
1
- import { PropPanel } from '@pdfme/common';
2
- import type { ImageSchema } from './types';
3
- import { DEFAULT_OPACITY } from '../constants.js';
4
-
5
- export const propPanel: PropPanel<ImageSchema> = {
6
- schema: {},
7
- defaultValue:
8
- 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAu4AAALuAQMAAADL0wGJAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAGUExURbzAw+rv8fKruy0AAAPoSURBVHja7dwxbtwwEEBRCkKwRQodYftcYk+ROkcJz5NTsEuZK/AIKlIQAUEnke0VqQ0pA5zxWvFnZcD2s0CNuENxPOZBc0QDDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PD/+P8bkxvnTzzjTG0M2b5rh08rHNT518aPOnTt63+aGTd23edPJ2h//ax+/oO6Gzx6c78+cuPu7x01vmwx5/6uLnO/PjO+b/rGifvtWH3VnT9vmh/e3eqx/bc9d79af2YwEPDw8P/6r8r1GVt5VcUoZPtXxGhp9rGYEM72vbEBne1hJ5Gb6ayIvwqZppi/CxmgqL8KGaTIrwc3WDfATeV/ffIryr7r+PwNvq/vsIfH17D5/qbw/gb/mLKp/OqnycFPj14yqcJPm4vfp5VJ0cP6jyzqjy9rr2q/Dr4qzBp3V5E1wxp/V3rl8LXn32qF6fAY31Psv2NXi/5lQaH+Vuzak0eLsmPRppVPa3FPiU3QiFFDZmD4FCAh6yxV+Bn7O9isLmx2d/TGHr5rI7obDxtFkcKWyb89M2+U1/sX7Kv7Io8gaxFy5l2D/faRk++3x6PgsalV52+fwUW4j/+eGhDPuneyH/otHmp9jyfHHMLM6n4phZnI/FObA4H4qDWnF+Lo46xXlflG+I864o3xDnbVG+Ic6X9RXSfCrrK6T5WBZASPOhrFCQ5ufyjF+a92XdkjTvyrolad6WdUvS/KawSI7/sQn7JfDl+O+bsF8CX44fN2FvHnNnIT4Nm7BfAl+ON5uwXwJfjA/LCuk2BXvCvN0U7InxflmAtxV1gvx0U2N3luPtdZOlwj/FoR5vbuq85Pi48F6LD0scOk3+sq1cleP9ohlNfkpq/N9pGaMuH7T4ZVqGWYt/nBavyxstftblfaVIWJU/y72yODCfzJH5oMvPh+adLm+PzCdzZD5U/61ClT9Lnvyo8e7QvFHlE3ydj0zOu5ucickhcpgcJofJedUVk8j5b/nGgIeHh4d/I3x/RwLlhgfNH3DavSwGXf7YjT76uqCEQ/P37p9z7uKVmwspd17S7hul3PXK6fbsmnvWhO6GZlMnn3ri8gXN5GzHnX0B35ydj91814CHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHl+d/A9cKjmiL040TAAAAAElFTkSuQmCC',
9
- defaultSchema: {
10
- type: 'image',
11
- position: { x: 0, y: 0 },
12
- width: 40,
13
- height: 40,
14
- // If the value of "rotate" is set to undefined or not set at all, rotation will be disabled in the UI.
15
- // Check this document: https://pdfme.com//docs/custom-schemas#learning-how-to-create-from-pdfmeschemas-code
16
- rotate: 0,
17
- opacity: DEFAULT_OPACITY,
18
- },
19
- };
@@ -1,3 +0,0 @@
1
- import { Schema } from '@pdfme/common';
2
-
3
- export interface ImageSchema extends Schema {}
@@ -1,121 +0,0 @@
1
- import type { ChangeEvent } from 'react';
2
- import type * as CSS from 'csstype';
3
- import type { ImageSchema } from './types';
4
- import { UIRenderProps, ZOOM } from '@pdfme/common';
5
- import { addAlphaToHex } from '../renderUtils.js';
6
-
7
- const fullSize = { width: '100%', height: '100%' };
8
-
9
- const readFile = (input: File | FileList | null): Promise<string | ArrayBuffer> =>
10
- new Promise((resolve, reject) => {
11
- const fileReader = new FileReader();
12
-
13
- fileReader.onload = (e) => {
14
- if (e.target?.result) {
15
- resolve(e.target.result);
16
- }
17
- };
18
-
19
- fileReader.onerror = (e) => {
20
- reject(new Error('[@pdfme/schemas] File reading failed'));
21
- };
22
-
23
- let file: File | null = null;
24
- if (input instanceof FileList && input.length > 0) {
25
- file = input[0];
26
- } else if (input instanceof File) {
27
- file = input;
28
- }
29
-
30
- if (file) {
31
- fileReader.readAsDataURL(file);
32
- } else {
33
- reject(new Error('[@pdfme/schemas] No files provided'));
34
- }
35
- });
36
-
37
- export const uiRender = async (arg: UIRenderProps<ImageSchema>) => {
38
- const { value, rootElement, mode, onChange, stopEditing, tabIndex, placeholder, schema, theme } =
39
- arg;
40
- const editable = mode === 'form' || mode === 'designer';
41
-
42
- const size = { width: schema.width * ZOOM, height: schema.height * ZOOM };
43
-
44
- const container = document.createElement('div');
45
- const containerStyle: CSS.Properties = {
46
- ...fullSize,
47
- backgroundImage: value ? 'none' : `url(${placeholder})`,
48
- backgroundSize: `${size.width}px ${size.height}px`,
49
- opacity: schema.opacity,
50
- };
51
- Object.assign(container.style, containerStyle);
52
- container.addEventListener('click', (e) => {
53
- if (editable) {
54
- e.stopPropagation();
55
- }
56
- });
57
- rootElement.appendChild(container);
58
-
59
- // image tag
60
- if (value) {
61
- const img = document.createElement('img');
62
- const imgStyle: CSS.Properties = { height: '100%', width: '100%', borderRadius: 0 };
63
- Object.assign(img.style, imgStyle);
64
- img.src = value;
65
- container.appendChild(img);
66
- }
67
-
68
- // remove button
69
- if (value && editable) {
70
- const button = document.createElement('button');
71
- button.textContent = 'x';
72
- const buttonStyle: CSS.Properties = {
73
- position: 'absolute',
74
- top: 0,
75
- left: 0,
76
- zIndex: 1,
77
- display: 'flex',
78
- justifyContent: 'center',
79
- alignItems: 'center',
80
- color: '#333',
81
- background: '#f2f2f2',
82
- borderRadius: '2px',
83
- border: '1px solid #767676',
84
- cursor: 'pointer',
85
- height: '24px',
86
- width: '24px',
87
- };
88
- Object.assign(button.style, buttonStyle);
89
- button.addEventListener('click', () => {
90
- onChange && onChange('');
91
- });
92
- container.appendChild(button);
93
- }
94
-
95
- // file input
96
- if (!value && editable) {
97
- const label = document.createElement('label');
98
- const labelStyle: CSS.Properties = {
99
- ...fullSize,
100
- display: editable ? 'flex' : 'none',
101
- position: 'absolute',
102
- top: 0,
103
- backgroundColor: editable || value ? addAlphaToHex(theme.colorPrimaryBg, 30) : 'none',
104
- cursor: 'pointer',
105
- };
106
- Object.assign(label.style, labelStyle);
107
- container.appendChild(label);
108
- const input = document.createElement('input');
109
- const inputStyle: CSS.Properties = { ...fullSize, position: 'absolute', top: '50%' };
110
- Object.assign(input.style, inputStyle);
111
- input.tabIndex = tabIndex || 0;
112
- input.type = 'file';
113
- input.accept = 'image/jpeg, image/png';
114
- input.addEventListener('change', (event: Event) => {
115
- const changeEvent = event as unknown as ChangeEvent<HTMLInputElement>;
116
- readFile(changeEvent.target.files).then((result) => onChange && onChange(result as string));
117
- });
118
- input.addEventListener('blur', () => stopEditing && stopEditing());
119
- label.appendChild(input);
120
- }
121
- };
@@ -1,73 +0,0 @@
1
- import { degrees, degreesToRadians } from '@pdfme/pdf-lib';
2
- import { Schema, mm2pt } from '@pdfme/common';
3
-
4
- export const convertForPdfLayoutProps = ({
5
- schema,
6
- pageHeight,
7
- applyRotateTranslate = true,
8
- }: {
9
- schema: Schema;
10
- pageHeight: number;
11
- applyRotateTranslate?: boolean;
12
- }) => {
13
- const { width: mmWidth, height: mmHeight, position, rotate, opacity } = schema;
14
- const { x: mmX, y: mmY } = position;
15
-
16
- const rotateDegrees = rotate ? -rotate : 0;
17
- const width = mm2pt(mmWidth);
18
- const height = mm2pt(mmHeight);
19
- let x = mm2pt(mmX);
20
- // PDF coordinate system is from bottom left, UI is top left, so we need to flip the y axis
21
- let y = pageHeight - mm2pt(mmY) - height;
22
-
23
- if (rotateDegrees && applyRotateTranslate) {
24
- // If rotating we must pivot around the same point as the UI performs its rotation.
25
- // The UI performs rotation around the objects center point (the pivot point below),
26
- // pdflib rotates around the bottom left corner of the object.
27
- // We must therefore adjust the X and Y by rotating the bottom left corner by this pivot point.
28
- const pivotPoint = { x: x + width / 2, y: pageHeight - mm2pt(mmY) - height / 2 };
29
- const rotatedPoint = rotatePoint({ x, y }, pivotPoint, rotateDegrees);
30
- x = rotatedPoint.x;
31
- y = rotatedPoint.y;
32
- }
33
-
34
- return {
35
- position: {
36
- x: x,
37
- y: y,
38
- },
39
- height: height,
40
- width: width,
41
- rotate: degrees(rotateDegrees),
42
- opacity,
43
- };
44
- };
45
-
46
- export const rotatePoint = (
47
- point: { x: number; y: number },
48
- pivot: { x: number; y: number },
49
- angleDegrees: number
50
- ): { x: number; y: number } => {
51
- const angleRadians = degreesToRadians(angleDegrees);
52
-
53
- const x =
54
- Math.cos(angleRadians) * (point.x - pivot.x) -
55
- Math.sin(angleRadians) * (point.y - pivot.y) +
56
- pivot.x;
57
- const y =
58
- Math.sin(angleRadians) * (point.x - pivot.x) +
59
- Math.cos(angleRadians) * (point.y - pivot.y) +
60
- pivot.y;
61
-
62
- return { x, y };
63
- };
64
-
65
- export const addAlphaToHex = (hex: string, alphaPercentage: number) => {
66
- if (!/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/i.test(hex)) {
67
- throw new Error('Invalid HEX color code');
68
- }
69
- const alphaValue = Math.round((alphaPercentage / 100) * 255);
70
- let alphaHex = alphaValue.toString(16);
71
- if (alphaHex.length === 1) alphaHex = '0' + alphaHex;
72
- return hex + alphaHex;
73
- };