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.
- package/README.md +143 -141
- package/dist/__tests__/e2e/test-helpers.d.ts +3 -1
- package/dist/__tests__/e2e/test-helpers.d.ts.map +1 -1
- package/dist/__tests__/e2e/test-helpers.js +14 -5
- package/dist/__tests__/e2e/test-helpers.js.map +1 -1
- package/dist/client-v2.d.ts +129 -0
- package/dist/client-v2.d.ts.map +1 -0
- package/dist/client-v2.js +696 -0
- package/dist/client-v2.js.map +1 -0
- package/dist/image-builder.d.ts +13 -0
- package/dist/image-builder.d.ts.map +1 -0
- package/dist/image-builder.js +44 -0
- package/dist/image-builder.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/models.d.ts +5 -10
- package/dist/models.d.ts.map +1 -1
- package/dist/models.js +3 -13
- package/dist/models.js.map +1 -1
- package/dist/paragraph-builder.d.ts +19 -10
- package/dist/paragraph-builder.d.ts.map +1 -1
- package/dist/paragraph-builder.js +65 -26
- package/dist/paragraph-builder.js.map +1 -1
- package/dist/pdfdancer_v1.d.ts +202 -0
- package/dist/pdfdancer_v1.d.ts.map +1 -0
- package/dist/pdfdancer_v1.js +710 -0
- package/dist/pdfdancer_v1.js.map +1 -0
- package/dist/types.d.ts +56 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +92 -0
- package/dist/types.js.map +1 -0
- package/package.json +1 -1
- package/scripts/release.js +1 -1
- package/src/__tests__/client-v1.test.ts +46 -87
- package/src/__tests__/e2e/acroform.test.ts +60 -57
- package/src/__tests__/e2e/form_x_object.test.ts +17 -16
- package/src/__tests__/e2e/image.test.ts +53 -56
- package/src/__tests__/e2e/line.test.ts +47 -48
- package/src/__tests__/e2e/page.test.ts +37 -36
- package/src/__tests__/e2e/paragraph.test.ts +125 -101
- package/src/__tests__/e2e/path.test.ts +67 -64
- package/src/__tests__/e2e/test-helpers.ts +76 -67
- package/src/__tests__/e2e/token_from_env.test.ts +35 -0
- package/src/image-builder.ts +52 -0
- package/src/index.ts +1 -1
- package/src/models.ts +5 -21
- package/src/paragraph-builder.ts +217 -162
- package/src/{client-v1.ts → pdfdancer_v1.ts} +260 -58
- package/src/types.ts +133 -0
- 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
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
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
|
-
##
|
|
21
|
+
## Quick Start
|
|
22
22
|
|
|
23
23
|
```typescript
|
|
24
|
-
import {
|
|
24
|
+
import { PDFDancer, Color } from 'pdfdancer-client-typescript';
|
|
25
|
+
import { promises as fs } from 'node:fs';
|
|
25
26
|
|
|
26
|
-
async function
|
|
27
|
-
|
|
28
|
-
const pdfData = new Uint8Array(/* your PDF data */);
|
|
27
|
+
async function run() {
|
|
28
|
+
const pdfBytes = await fs.readFile('input.pdf');
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
// Token defaults to PDFDANCER_TOKEN when omitted.
|
|
31
|
+
const pdf = await PDFDancer.open(pdfBytes, 'your-auth-token');
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
const paragraphs = await client.findParagraphs(Position.atPage(1));
|
|
33
|
+
const page0 = pdf.page(0); // Page indexes are zero-based
|
|
35
34
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
|
|
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
|
-
|
|
47
|
+
run().catch(console.error);
|
|
48
|
+
```
|
|
54
49
|
|
|
55
|
-
|
|
50
|
+
## Authentication & Configuration
|
|
56
51
|
|
|
57
52
|
```typescript
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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
|
-
|
|
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
|
-
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
//
|
|
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
|
-
|
|
74
|
+
`PageClient` exposes page-scoped helpers like `selectParagraphs`, `selectTextLinesStartingWith`, `selectImagesAt`, and `newParagraph()`.
|
|
75
|
+
|
|
76
|
+
## Finding Objects
|
|
85
77
|
|
|
86
78
|
```typescript
|
|
87
|
-
|
|
88
|
-
const
|
|
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
|
-
|
|
91
|
-
|
|
88
|
+
```typescript
|
|
89
|
+
import { Position } from 'pdfdancer-client-typescript';
|
|
92
90
|
|
|
93
|
-
|
|
94
|
-
const
|
|
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
|
-
|
|
95
|
+
## Creating and Editing Paragraphs
|
|
96
|
+
|
|
97
|
+
### Add a Paragraph
|
|
98
98
|
|
|
99
99
|
```typescript
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
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
|
-
###
|
|
109
|
+
### Edit an Existing Paragraph
|
|
117
110
|
|
|
118
111
|
```typescript
|
|
119
|
-
|
|
120
|
-
|
|
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
|
-
|
|
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
|
-
|
|
126
|
-
await client.move(objectRef, newPosition);
|
|
126
|
+
## Working with Images
|
|
127
127
|
|
|
128
|
-
|
|
129
|
-
await
|
|
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
|
-
|
|
139
|
+
Use `.fromBytes()` when image data already exists in memory.
|
|
140
|
+
|
|
141
|
+
## Form Fields
|
|
133
142
|
|
|
134
143
|
```typescript
|
|
135
|
-
|
|
136
|
-
const fonts = await client.findFonts('Arial', 12);
|
|
144
|
+
const fields = await pdf.selectFormFields();
|
|
137
145
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
146
|
+
for (const field of fields) {
|
|
147
|
+
if (field.name === 'firstName') {
|
|
148
|
+
await field.fill('Ada');
|
|
149
|
+
}
|
|
150
|
+
}
|
|
141
151
|
|
|
142
|
-
|
|
143
|
-
|
|
152
|
+
const zipFields = await pdf.selectFieldsByName('zip');
|
|
153
|
+
await zipFields[0]?.delete();
|
|
144
154
|
```
|
|
145
155
|
|
|
146
|
-
|
|
156
|
+
## Document Operations
|
|
147
157
|
|
|
148
158
|
```typescript
|
|
149
|
-
|
|
150
|
-
|
|
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
|
-
|
|
163
|
+
`pdf.save` wraps `fs.writeFile` for convenience. In browsers, use the bytes returned by `getBytes()` with your own download logic.
|
|
160
164
|
|
|
161
|
-
|
|
165
|
+
## Error Handling
|
|
162
166
|
|
|
163
167
|
```typescript
|
|
164
168
|
import {
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
169
|
+
ValidationException,
|
|
170
|
+
HttpClientException,
|
|
171
|
+
SessionException,
|
|
172
|
+
FontNotFoundException,
|
|
173
|
+
PdfDancerException
|
|
170
174
|
} from 'pdfdancer-client-typescript';
|
|
171
175
|
|
|
172
176
|
try {
|
|
173
|
-
|
|
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
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQH,gCAEC;AAKD,8BAmBC;AAKD,4BAUC;AAoBD,oDAsBC;AAKD,wCAGC;AAKD,
|
|
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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"}
|