pdfdancer-client-typescript 1.0.5 → 1.0.7

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 (52) hide show
  1. package/README.md +143 -141
  2. package/dist/__tests__/e2e/test-helpers.d.ts +3 -1
  3. package/dist/__tests__/e2e/test-helpers.d.ts.map +1 -1
  4. package/dist/__tests__/e2e/test-helpers.js +14 -5
  5. package/dist/__tests__/e2e/test-helpers.js.map +1 -1
  6. package/dist/client-v2.d.ts +129 -0
  7. package/dist/client-v2.d.ts.map +1 -0
  8. package/dist/client-v2.js +696 -0
  9. package/dist/client-v2.js.map +1 -0
  10. package/dist/image-builder.d.ts +13 -0
  11. package/dist/image-builder.d.ts.map +1 -0
  12. package/dist/image-builder.js +44 -0
  13. package/dist/image-builder.js.map +1 -0
  14. package/dist/index.d.ts +1 -1
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +3 -3
  17. package/dist/index.js.map +1 -1
  18. package/dist/models.d.ts +5 -10
  19. package/dist/models.d.ts.map +1 -1
  20. package/dist/models.js +3 -13
  21. package/dist/models.js.map +1 -1
  22. package/dist/paragraph-builder.d.ts +19 -10
  23. package/dist/paragraph-builder.d.ts.map +1 -1
  24. package/dist/paragraph-builder.js +65 -26
  25. package/dist/paragraph-builder.js.map +1 -1
  26. package/dist/pdfdancer_v1.d.ts +202 -0
  27. package/dist/pdfdancer_v1.d.ts.map +1 -0
  28. package/dist/pdfdancer_v1.js +710 -0
  29. package/dist/pdfdancer_v1.js.map +1 -0
  30. package/dist/types.d.ts +56 -0
  31. package/dist/types.d.ts.map +1 -0
  32. package/dist/types.js +92 -0
  33. package/dist/types.js.map +1 -0
  34. package/package.json +1 -1
  35. package/scripts/release.js +1 -1
  36. package/src/__tests__/client-v1.test.ts +46 -87
  37. package/src/__tests__/e2e/acroform.test.ts +60 -57
  38. package/src/__tests__/e2e/form_x_object.test.ts +17 -16
  39. package/src/__tests__/e2e/image.test.ts +53 -56
  40. package/src/__tests__/e2e/line.test.ts +47 -48
  41. package/src/__tests__/e2e/page.test.ts +37 -36
  42. package/src/__tests__/e2e/paragraph.test.ts +125 -101
  43. package/src/__tests__/e2e/path.test.ts +67 -64
  44. package/src/__tests__/e2e/test-helpers.ts +76 -67
  45. package/src/__tests__/e2e/token_from_env.test.ts +35 -0
  46. package/src/image-builder.ts +52 -0
  47. package/src/index.ts +1 -1
  48. package/src/models.ts +5 -21
  49. package/src/paragraph-builder.ts +217 -162
  50. package/src/{client-v1.ts → pdfdancer_v1.ts} +260 -58
  51. package/src/types.ts +133 -0
  52. package/example.ts +0 -99
package/README.md CHANGED
@@ -4,13 +4,13 @@ A TypeScript client library for the PDFDancer PDF manipulation API.
4
4
 
5
5
  ## Features
6
6
 
7
- - **Session-based PDF manipulation** - Upload PDF, perform operations, download modified PDF
8
- - **Type-safe API** - Full TypeScript support with proper types and interfaces
9
- - **Fluent Builder Pattern** - Easy paragraph construction with method chaining
10
- - **Comprehensive Search** - Find PDF objects by type, position, and other criteria
11
- - **Custom Font Support** - Register and use custom TTF fonts
12
- - **Error Handling** - Detailed exceptions for different error scenarios
13
- - **Browser Compatible** - Works in both Node.js and browser environments
7
+ - Session-based PDF manipulation with automatic session creation
8
+ - Type-safe models and fluent builders for paragraphs and images
9
+ - Page-scoped selectors for paragraphs, text lines, images, forms, and paths
10
+ - Form filling helpers with field-name lookup
11
+ - Custom font registration with on-the-fly TTF uploads
12
+ - Detailed exceptions for validation, HTTP, and session errors
13
+ - Works in both Node.js and browser environments
14
14
 
15
15
  ## Installation
16
16
 
@@ -18,169 +18,179 @@ A TypeScript client library for the PDFDancer PDF manipulation API.
18
18
  npm install pdfdancer-client-typescript
19
19
  ```
20
20
 
21
- ## Basic Usage
21
+ ## Quick Start
22
22
 
23
23
  ```typescript
24
- import {ClientV1, Position, Color, Font} from 'pdfdancer-client-typescript';
24
+ import { PDFDancer, Color } from 'pdfdancer-client-typescript';
25
+ import { promises as fs } from 'node:fs';
25
26
 
26
- async function example() {
27
- // Load PDF data (from file upload, fetch, etc.)
28
- const pdfData = new Uint8Array(/* your PDF data */);
27
+ async function run() {
28
+ const pdfBytes = await fs.readFile('input.pdf');
29
29
 
30
- // Create client with authentication token
31
- const client = await ClientV1.create('your-auth-token', pdfData, undefined, 30000);
30
+ // Token defaults to PDFDANCER_TOKEN when omitted.
31
+ const pdf = await PDFDancer.open(pdfBytes, 'your-auth-token');
32
32
 
33
- // Find all paragraphs on page 1
34
- const paragraphs = await client.findParagraphs(Position.atPage(1));
33
+ const page0 = pdf.page(0); // Page indexes are zero-based
35
34
 
36
- // Add a new paragraph
37
- const newParagraph = client.paragraphBuilder()
38
- .fromString('Hello, PDFDancer!', new Color(255, 0, 0))
39
- .withFont(new Font('Arial', 12))
40
- .withPosition(Position.atPageCoordinates(1, 100, 200))
41
- .build();
35
+ await page0.newParagraph()
36
+ .text('Hello, PDFDancer!')
37
+ .font('Roboto-Regular', 14)
38
+ .color(new Color(255, 64, 64))
39
+ .lineSpacing(1.1)
40
+ .at(100, 200)
41
+ .apply();
42
42
 
43
- await client.addParagraph(newParagraph);
44
-
45
- // Get the modified PDF
46
- const modifiedPdf = await client.getPdfFile();
47
-
48
- // Save PDF (browser environment)
49
- await client.savePdf('modified-document.pdf');
43
+ const updated = await pdf.getBytes();
44
+ await fs.writeFile('output.pdf', updated);
50
45
  }
51
- ```
52
46
 
53
- ## API Overview
47
+ run().catch(console.error);
48
+ ```
54
49
 
55
- ### Client Initialization
50
+ ## Authentication & Configuration
56
51
 
57
52
  ```typescript
58
- const client = await ClientV1.create(
59
- token, // Authentication token
60
- pdfData, // PDF data as Uint8Array, File, or ArrayBuffer
61
- baseUrl, // Optional: API server URL (default: http://localhost:8080)
62
- readTimeout // Optional: Request timeout in ms (default: 30000)
53
+ const pdf = await PDFDancer.open(
54
+ pdfData, // Uint8Array, File, or ArrayBuffer
55
+ token, // Optional: defaults to process.env.PDFDANCER_TOKEN
56
+ baseUrl, // Optional: defaults to process.env.PDFDANCER_BASE_URL or https://api.pdfdancer.com
57
+ timeout // Optional request timeout in ms (default: 30000)
63
58
  );
64
59
  ```
65
60
 
66
- ### Search Operations
61
+ - Set `PDFDANCER_TOKEN` to avoid passing the token explicitly.
62
+ - Override the API endpoint with `PDFDANCER_BASE_URL`.
63
+ - Page indexes start at `0` throughout the API.
64
+
65
+ ## Working with Pages
67
66
 
68
67
  ```typescript
69
- // Find objects by type and position
70
- const objects = await client.find(ObjectType.PARAGRAPH, position);
71
-
72
- // Convenience methods for specific object types
73
- const paragraphs = await client.findParagraphs(position);
74
- const images = await client.findImages(position);
75
- const forms = await client.findFormXObjects(position);
76
- const paths = await client.findPaths(position);
77
- const textLines = await client.findTextLines(position);
78
-
79
- // Page operations
80
- const pages = await client.getPages();
81
- const page = await client.getPage(1); // 1-based index
68
+ const page = pdf.page(0);
69
+ const allPages = await pdf.pages(); // Array<PageClient>
70
+
71
+ await page.delete(); // Remove the page from the document
82
72
  ```
83
73
 
84
- ### Position Specification
74
+ `PageClient` exposes page-scoped helpers like `selectParagraphs`, `selectTextLinesStartingWith`, `selectImagesAt`, and `newParagraph()`.
75
+
76
+ ## Finding Objects
85
77
 
86
78
  ```typescript
87
- // Page-based position
88
- const pagePosition = Position.atPage(1);
79
+ const paragraphs = await pdf.selectParagraphs();
80
+ const header = await pdf.page(0).selectParagraphsStartingWith('Invoice #');
81
+ const imagesAtPoint = await pdf.page(2).selectImagesAt(120, 300);
82
+ const fieldsByName = await pdf.selectFieldsByName('firstName');
83
+ const textLines = await pdf.selectLines(); // All text lines across the document
84
+ ```
85
+
86
+ Use `Position` helpers when you need explicit coordinates:
89
87
 
90
- // Coordinate-based position
91
- const coordPosition = Position.atPageCoordinates(1, 100, 200);
88
+ ```typescript
89
+ import { Position } from 'pdfdancer-client-typescript';
92
90
 
93
- // Position with movement
94
- const movedPosition = coordPosition.copy().moveX(50).moveY(30);
91
+ const point = Position.atPageCoordinates(1, 250, 400);
92
+ const paragraphsAtPoint = await pdf.page(1).selectParagraphsAt(point.getX()!, point.getY()!);
95
93
  ```
96
94
 
97
- ### Adding Content
95
+ ## Creating and Editing Paragraphs
96
+
97
+ ### Add a Paragraph
98
98
 
99
99
  ```typescript
100
- // Add paragraph using builder pattern
101
- const paragraph = client.paragraphBuilder()
102
- .fromString('Your text here')
103
- .withFont(new Font('Arial', 12))
104
- .withColor(new Color(0, 0, 0))
105
- .withPosition(Position.atPageCoordinates(1, 100, 200))
106
- .withLineSpacing(1.2)
107
- .build();
108
-
109
- await client.addParagraph(paragraph);
110
-
111
- // Add image
112
- const image = new Image(position, 'PNG', 100, 50, imageData);
113
- await client.addImage(image);
100
+ await pdf.page(0).newParagraph()
101
+ .text('Awesomely\nObvious!')
102
+ .font('Roboto-Regular', 14)
103
+ .lineSpacing(0.8)
104
+ .color(new Color(0, 0, 0))
105
+ .at(300, 500)
106
+ .apply();
114
107
  ```
115
108
 
116
- ### Modifying Content
109
+ ### Edit an Existing Paragraph
117
110
 
118
111
  ```typescript
119
- // Modify paragraph text
120
- await client.modifyParagraph(paragraphRef, 'New text content');
112
+ const [para] = await pdf.page(0).selectParagraphsStartingWith('The Complete');
113
+
114
+ if (para) {
115
+ await para.edit()
116
+ .replace('Awesomely\nObvious!')
117
+ .font('Helvetica', 12)
118
+ .color(new Color(0, 0, 0))
119
+ .moveTo(280, 460)
120
+ .apply();
121
+ }
122
+ ```
121
123
 
122
- // Modify text line
123
- await client.modifyTextLine(textLineRef, 'New line content');
124
+ `ParagraphBuilder` also supports `.fontFile(ttfBytes, size)` to register a custom font before applying.
124
125
 
125
- // Move object to new position
126
- await client.move(objectRef, newPosition);
126
+ ## Working with Images
127
127
 
128
- // Delete object
129
- await client.delete(objectRef);
128
+ ```typescript
129
+ await pdf.newImage()
130
+ .fromFile('fixtures/logo-80.png')
131
+ .at(0, 420, 200)
132
+ .add();
133
+
134
+ const images = await pdf.selectImages();
135
+ await images[0].moveTo(200, 350);
136
+ await images[1].delete();
130
137
  ```
131
138
 
132
- ### Font Management
139
+ Use `.fromBytes()` when image data already exists in memory.
140
+
141
+ ## Form Fields
133
142
 
134
143
  ```typescript
135
- // Find available fonts
136
- const fonts = await client.findFonts('Arial', 12);
144
+ const fields = await pdf.selectFormFields();
137
145
 
138
- // Register custom font
139
- const ttfData = new Uint8Array(/* TTF font data */);
140
- const fontName = await client.registerFont(ttfData);
146
+ for (const field of fields) {
147
+ if (field.name === 'firstName') {
148
+ await field.fill('Ada');
149
+ }
150
+ }
141
151
 
142
- // Use custom font
143
- const customFont = new Font(fontName, 14);
152
+ const zipFields = await pdf.selectFieldsByName('zip');
153
+ await zipFields[0]?.delete();
144
154
  ```
145
155
 
146
- ### Document Operations
156
+ ## Document Operations
147
157
 
148
158
  ```typescript
149
- // Get modified PDF data
150
- const pdfBytes = await client.getPdfFile();
151
-
152
- // Save PDF file (browser)
153
- await client.savePdf('output.pdf');
154
-
155
- // Delete page
156
- await client.deletePage(pageRef);
159
+ const pdfBytes = await pdf.getBytes();
160
+ await pdf.save('output.pdf'); // Node.js helper that writes the file
157
161
  ```
158
162
 
159
- ## Error Handling
163
+ `pdf.save` wraps `fs.writeFile` for convenience. In browsers, use the bytes returned by `getBytes()` with your own download logic.
160
164
 
161
- The client provides specific exception types for different error scenarios:
165
+ ## Error Handling
162
166
 
163
167
  ```typescript
164
168
  import {
165
- ValidationException,
166
- HttpClientException,
167
- SessionException,
168
- FontNotFoundException,
169
- PdfDancerException
169
+ ValidationException,
170
+ HttpClientException,
171
+ SessionException,
172
+ FontNotFoundException,
173
+ PdfDancerException
170
174
  } from 'pdfdancer-client-typescript';
171
175
 
172
176
  try {
173
- await client.addParagraph(paragraph);
177
+ await pdf.page(0).newParagraph()
178
+ .text('Hello')
179
+ .font('Unknown-Font', 12)
180
+ .at(100, 100)
181
+ .apply();
174
182
  } catch (error) {
175
- if (error instanceof ValidationException) {
176
- console.error('Invalid input:', error.message);
177
- } else if (error instanceof HttpClientException) {
178
- console.error('API error:', error.message, 'Status:', error.statusCode);
179
- } else if (error instanceof FontNotFoundException) {
180
- console.error('Font not found:', error.message);
181
- } else if (error instanceof SessionException) {
182
- console.error('Session error:', error.message);
183
- }
183
+ if (error instanceof FontNotFoundException) {
184
+ console.error('Font not found:', error.message);
185
+ } else if (error instanceof ValidationException) {
186
+ console.error('Invalid input:', error.message);
187
+ } else if (error instanceof HttpClientException) {
188
+ console.error('API error:', error.message);
189
+ } else if (error instanceof SessionException) {
190
+ console.error('Session error:', error.message);
191
+ } else if (error instanceof PdfDancerException) {
192
+ console.error('Unexpected failure:', error.message);
193
+ }
184
194
  }
185
195
  ```
186
196
 
@@ -189,11 +199,15 @@ try {
189
199
  ### ObjectType
190
200
 
191
201
  - `IMAGE` - Image objects
192
- - `FORM_X_OBJECT` - Form field objects
202
+ - `FORM_X_OBJECT` - Form XObjects
193
203
  - `PATH` - Vector path objects
194
204
  - `PARAGRAPH` - Paragraph objects
195
205
  - `TEXT_LINE` - Text line objects
196
206
  - `PAGE` - Page objects
207
+ - `FORM_FIELD` - Generic form field references
208
+ - `TEXT_FIELD` - Text input fields
209
+ - `CHECK_BOX` - Checkbox form fields
210
+ - `RADIO_BUTTON` - Radio button form fields
197
211
 
198
212
  ### PositionMode
199
213
 
@@ -222,7 +236,7 @@ npm test
222
236
  # Run only unit tests
223
237
  npm run test:unit
224
238
 
225
- # Run only e2e tests (requires fixtures and server)
239
+ # Run e2e tests (requires fixtures and a running server)
226
240
  npm run test:e2e
227
241
 
228
242
  # Run linter
@@ -231,31 +245,19 @@ npm run lint
231
245
 
232
246
  ### E2E Tests
233
247
 
234
- The project includes comprehensive end-to-end tests. To run e2e tests:
235
-
236
- 1. **Start PDFDancer server** at `http://localhost:8080` (or set `PDFDANCER_BASE_URL`)
237
-
238
- 2. **Set authentication token**:
239
- - Environment variable: `export PDFDANCER_TOKEN=your-token`
240
- - Or place a `jwt-token-*.txt` file in the project root
241
-
242
- 3. **Add test fixtures** in the `fixtures/` directory:
243
- - `ObviouslyAwesome.pdf` - Main test document
244
- - `mixed-form-types.pdf` - Document with form fields
245
- - `basic-paths.pdf` - Document with vector paths
246
- - `logo-80.png` - Test image file
247
- - `DancingScript-Regular.ttf` - Test font file
248
-
249
- 4. **Run e2e tests**: `npm run test:e2e`
248
+ The project includes comprehensive end-to-end tests. To run them:
250
249
 
251
- The e2e tests cover:
250
+ 1. **Start the PDFDancer server** at `http://localhost:8080` or set `PDFDANCER_BASE_URL`.
251
+ 2. **Provide an authentication token** via `export PDFDANCER_TOKEN=your-token` or a `jwt-token-*.txt` file in the project root.
252
+ 3. **Populate fixtures** in the `fixtures/` directory:
253
+ - `ObviouslyAwesome.pdf`
254
+ - `mixed-form-types.pdf`
255
+ - `basic-paths.pdf`
256
+ - `logo-80.png`
257
+ - `DancingScript-Regular.ttf`
258
+ 4. **Run the suite**: `npm run test:e2e`
252
259
 
253
- - **Paragraph operations**: Find, add, modify, delete paragraphs with custom fonts
254
- - **Page operations**: Get pages, delete pages
255
- - **Text line operations**: Find, modify, move, delete text lines
256
- - **Image operations**: Find, add, move, delete images
257
- - **Form operations**: Find and delete form fields
258
- - **Path operations**: Find, move, delete vector paths
260
+ The e2e suite covers paragraphs, pages, text lines, images, form fields, and path manipulation scenarios.
259
261
 
260
262
  ## License
261
263
 
@@ -18,13 +18,15 @@ export declare function serverUp(baseUrl: string): Promise<boolean>;
18
18
  */
19
19
  export declare function requireEnvAndFixture(pdfFilename: string): Promise<[string, string, Uint8Array]>;
20
20
  /**
21
- * Helper to create temporary file path (for Node.js environment)
21
+ * Helper to open temporary file path (for Node.js environment)
22
22
  */
23
23
  export declare function createTempPath(filename: string): string;
24
24
  /**
25
25
  * Helper to read image file for tests
26
26
  */
27
27
  export declare function readImageFixture(filename: string): Uint8Array;
28
+ export declare function getImagePath(filename: string): string;
29
+ export declare function getFontPath(filename: string): string;
28
30
  /**
29
31
  * Helper to read font file for tests
30
32
  */
@@ -1 +1 @@
1
- {"version":3,"file":"test-helpers.d.ts","sourceRoot":"","sources":["../../../src/__tests__/e2e/test-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,MAAM,GAAG,IAAI,CAmBzC;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAUhE;AAiBD;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAsBrG;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAU7D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAU5D"}
1
+ {"version":3,"file":"test-helpers.d.ts","sourceRoot":"","sources":["../../../src/__tests__/e2e/test-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,MAAM,GAAG,IAAI,CAmBzC;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAUhE;AAiBD;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAsBrG;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAS7D;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,UAI3C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAS5D"}
@@ -42,6 +42,8 @@ exports.serverUp = serverUp;
42
42
  exports.requireEnvAndFixture = requireEnvAndFixture;
43
43
  exports.createTempPath = createTempPath;
44
44
  exports.readImageFixture = readImageFixture;
45
+ exports.getImagePath = getImagePath;
46
+ exports.getFontPath = getFontPath;
45
47
  exports.readFontFixture = readFontFixture;
46
48
  const fs = __importStar(require("fs"));
47
49
  const path = __importStar(require("path"));
@@ -124,7 +126,7 @@ async function requireEnvAndFixture(pdfFilename) {
124
126
  return [baseUrl, token, new Uint8Array(pdfData)];
125
127
  }
126
128
  /**
127
- * Helper to create temporary file path (for Node.js environment)
129
+ * Helper to open temporary file path (for Node.js environment)
128
130
  */
129
131
  function createTempPath(filename) {
130
132
  const tmpDir = process.env.TMPDIR || '/tmp';
@@ -134,20 +136,27 @@ function createTempPath(filename) {
134
136
  * Helper to read image file for tests
135
137
  */
136
138
  function readImageFixture(filename) {
137
- const fixturesDir = path.resolve(__dirname, '../../../fixtures');
138
- const imagePath = path.join(fixturesDir, filename);
139
+ const imagePath = getImagePath(filename);
139
140
  if (!fs.existsSync(imagePath)) {
140
141
  throw new Error(`Image fixture not found: ${filename}`);
141
142
  }
142
143
  const imageData = fs.readFileSync(imagePath);
143
144
  return new Uint8Array(imageData);
144
145
  }
146
+ function getImagePath(filename) {
147
+ const fixturesDir = path.resolve(__dirname, '../../../fixtures');
148
+ return path.join(fixturesDir, filename);
149
+ }
150
+ function getFontPath(filename) {
151
+ const fixturesDir = path.resolve(__dirname, '../../../fixtures');
152
+ const fontPath = path.join(fixturesDir, filename);
153
+ return fontPath;
154
+ }
145
155
  /**
146
156
  * Helper to read font file for tests
147
157
  */
148
158
  function readFontFixture(filename) {
149
- const fixturesDir = path.resolve(__dirname, '../../../fixtures');
150
- const fontPath = path.join(fixturesDir, filename);
159
+ const fontPath = getFontPath(filename);
151
160
  if (!fs.existsSync(fontPath)) {
152
161
  throw new Error(`Font fixture not found: ${filename}`);
153
162
  }
@@ -1 +1 @@
1
- {"version":3,"file":"test-helpers.js","sourceRoot":"","sources":["../../../src/__tests__/e2e/test-helpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"test-helpers.js","sourceRoot":"","sources":["../../../src/__tests__/e2e/test-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * PDFDancer TypeScript Client V2
3
+ *
4
+ * New typed API with the pattern: open → select{Type}(criteria) → edit(properties) → save
5
+ */
6
+ import { Color, Font, ObjectRef, ObjectType, Paragraph, Position } from './models';
7
+ export interface SelectTextCriteria {
8
+ containing?: string;
9
+ at?: [number, number];
10
+ withinBbox?: [number, number, number, number];
11
+ font?: string;
12
+ }
13
+ export interface SelectImageCriteria {
14
+ at?: [number, number];
15
+ index?: number;
16
+ }
17
+ export interface SelectPathCriteria {
18
+ at?: [number, number];
19
+ }
20
+ export interface TextEditOptions {
21
+ replace?: string;
22
+ font?: string;
23
+ size?: number;
24
+ lineSpacing?: number;
25
+ color?: string;
26
+ }
27
+ export interface ImageEditOptions {
28
+ scale?: number;
29
+ translate?: [number, number];
30
+ rotate?: number;
31
+ }
32
+ export interface PathEditOptions {
33
+ stroke?: string;
34
+ fill?: string;
35
+ lineWidth?: number;
36
+ scale?: number;
37
+ translate?: [number, number];
38
+ rotate?: number;
39
+ }
40
+ export interface PDFDancerOpenOptions {
41
+ token: string;
42
+ baseUrl?: string;
43
+ timeout?: number;
44
+ }
45
+ declare class HttpClient {
46
+ private token;
47
+ private sessionId;
48
+ private baseUrl;
49
+ private timeout;
50
+ constructor(token: string, sessionId: string, baseUrl: string, timeout: number);
51
+ request(method: string, path: string, data?: Record<string, any>, params?: Record<string, string>): Promise<Response>;
52
+ private extractErrorMessage;
53
+ }
54
+ export declare class TextObject {
55
+ private objectRef;
56
+ private client;
57
+ private objectType;
58
+ constructor(objectRef: ObjectRef, client: HttpClient, objectType: ObjectType);
59
+ edit(options: TextEditOptions): Promise<void>;
60
+ }
61
+ export declare class ImageObject {
62
+ private objectRef;
63
+ private client;
64
+ constructor(objectRef: ObjectRef, client: HttpClient);
65
+ edit(options: ImageEditOptions): Promise<void>;
66
+ }
67
+ export declare class PathObject {
68
+ private objectRef;
69
+ private client;
70
+ constructor(objectRef: ObjectRef, client: HttpClient);
71
+ edit(options: PathEditOptions): Promise<void>;
72
+ }
73
+ export declare class PDFPage {
74
+ private pageIndex;
75
+ private client;
76
+ constructor(pageIndex: number, client: HttpClient);
77
+ selectText(criteria: SelectTextCriteria): Promise<TextObject>;
78
+ selectImage(criteria: SelectImageCriteria): Promise<ImageObject>;
79
+ selectPath(criteria: SelectPathCriteria): Promise<PathObject>;
80
+ private buildPositionFromCriteria;
81
+ private buildPositionFromImageCriteria;
82
+ private buildPositionFromPathCriteria;
83
+ private findObjects;
84
+ private parseObjectRef;
85
+ private parsePosition;
86
+ }
87
+ export declare class PDFDocument {
88
+ private client;
89
+ private sessionId;
90
+ constructor(client: HttpClient, sessionId: string);
91
+ page(index: number): PDFPage;
92
+ findParagraphs(position?: Position): Promise<ObjectRef[]>;
93
+ findImages(position?: Position): Promise<ObjectRef[]>;
94
+ findTextLines(position?: Position): Promise<ObjectRef[]>;
95
+ findPaths(position?: Position): Promise<ObjectRef[]>;
96
+ findFormXObjects(position?: Position): Promise<ObjectRef[]>;
97
+ private findObjects;
98
+ private parseObjectRef;
99
+ private parsePosition;
100
+ delete(objectRef: ObjectRef): Promise<boolean>;
101
+ move(objectRef: ObjectRef, position: Position): Promise<boolean>;
102
+ addParagraph(paragraph: Paragraph): Promise<boolean>;
103
+ modifyParagraph(objectRef: ObjectRef, newParagraph: Paragraph | string): Promise<boolean>;
104
+ findFonts(fontName: string, fontSize: number): Promise<Font[]>;
105
+ registerFont(ttfFile: Uint8Array | File): Promise<string>;
106
+ private extractErrorMessage;
107
+ paragraphBuilder(): ParagraphBuilderV2;
108
+ save(filename?: string): Promise<void>;
109
+ }
110
+ export declare class ParagraphBuilderV2 {
111
+ private document;
112
+ private paragraph;
113
+ constructor(document: PDFDocument);
114
+ fromString(text: string): this;
115
+ withFont(font: Font): this;
116
+ withLineSpacing(lineSpacing: number): this;
117
+ withColor(color: Color): this;
118
+ withPosition(position: Position): this;
119
+ withFontFile(ttfData: Uint8Array, fontSize: number): Promise<this>;
120
+ build(): Paragraph;
121
+ }
122
+ export declare class PDFDancer {
123
+ static open(pdfData: Uint8Array | File | ArrayBuffer, options: PDFDancerOpenOptions): Promise<PDFDocument>;
124
+ private static processPdfData;
125
+ private static createSession;
126
+ private static extractErrorMessage;
127
+ }
128
+ export {};
129
+ //# sourceMappingURL=client-v2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-v2.d.ts","sourceRoot":"","sources":["../src/client-v2.ts"],"names":[],"mappings":"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"}