pdfdancer-client-typescript 1.0.16 → 1.0.18
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 +12 -4
- package/dist/__tests__/e2e/pdf-assertions.d.ts.map +1 -1
- package/dist/__tests__/e2e/pdf-assertions.js +1 -1
- package/dist/__tests__/e2e/pdf-assertions.js.map +1 -1
- package/dist/__tests__/e2e/test-drawing-helpers.d.ts +148 -0
- package/dist/__tests__/e2e/test-drawing-helpers.d.ts.map +1 -0
- package/dist/__tests__/e2e/test-drawing-helpers.js +343 -0
- package/dist/__tests__/e2e/test-drawing-helpers.js.map +1 -0
- package/dist/__tests__/e2e/test-helpers.d.ts +10 -0
- package/dist/__tests__/e2e/test-helpers.d.ts.map +1 -1
- package/dist/__tests__/e2e/test-helpers.js +55 -0
- package/dist/__tests__/e2e/test-helpers.js.map +1 -1
- package/dist/image-builder.d.ts +1 -0
- package/dist/image-builder.d.ts.map +1 -1
- package/dist/image-builder.js +4 -0
- package/dist/image-builder.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/models.d.ts +54 -2
- package/dist/models.d.ts.map +1 -1
- package/dist/models.js +115 -1
- package/dist/models.js.map +1 -1
- package/dist/path-builder.d.ts +110 -0
- package/dist/path-builder.d.ts.map +1 -0
- package/dist/path-builder.js +191 -0
- package/dist/path-builder.js.map +1 -0
- package/dist/pdfdancer_v1.d.ts +7 -0
- package/dist/pdfdancer_v1.d.ts.map +1 -1
- package/dist/pdfdancer_v1.js +72 -2
- package/dist/pdfdancer_v1.js.map +1 -1
- package/package.json +18 -2
- package/.claude/commands/discuss.md +0 -4
- package/.eslintrc.js +0 -27
- package/.github/workflows/ci.yml +0 -86
- package/.github/workflows/daily-tests.yml +0 -54
- package/NOTICE +0 -8
- package/docs/openapi.yml +0 -2640
- package/fixtures/DancingScript-Regular.ttf +0 -0
- package/fixtures/Empty.pdf +0 -0
- package/fixtures/JetBrainsMono-Regular.ttf +0 -0
- package/fixtures/ObviouslyAwesome.pdf +0 -0
- package/fixtures/README.md +0 -23
- package/fixtures/Showcase.pdf +0 -0
- package/fixtures/basic-paths.pdf +0 -0
- package/fixtures/form-xobject-example.pdf +0 -0
- package/fixtures/logo-80.png +0 -0
- package/fixtures/mixed-form-types.pdf +0 -0
- package/jest.config.js +0 -27
- package/scripts/release.js +0 -91
- package/scripts/test-release.js +0 -59
- package/src/__tests__/assertions.ts +0 -12
- package/src/__tests__/client-v1.test.ts +0 -70
- package/src/__tests__/e2e/acroform.test.ts +0 -166
- package/src/__tests__/e2e/context-manager-showcase.test.ts +0 -267
- package/src/__tests__/e2e/create-new.test.ts +0 -133
- package/src/__tests__/e2e/form_x_object.test.ts +0 -87
- package/src/__tests__/e2e/image-showcase.test.ts +0 -133
- package/src/__tests__/e2e/image.test.ts +0 -147
- package/src/__tests__/e2e/line-showcase.test.ts +0 -113
- package/src/__tests__/e2e/line.test.ts +0 -187
- package/src/__tests__/e2e/page-showcase.test.ts +0 -154
- package/src/__tests__/e2e/page.test.ts +0 -47
- package/src/__tests__/e2e/paragraph-showcase.test.ts +0 -515
- package/src/__tests__/e2e/paragraph.test.ts +0 -681
- package/src/__tests__/e2e/path.test.ts +0 -108
- package/src/__tests__/e2e/pdf-assertions.ts +0 -248
- package/src/__tests__/e2e/pdfdancer-showcase.test.ts +0 -40
- package/src/__tests__/e2e/snapshot-showcase.test.ts +0 -158
- package/src/__tests__/e2e/snapshot.test.ts +0 -296
- package/src/__tests__/e2e/test-helpers.ts +0 -152
- package/src/__tests__/e2e/token_from_env.test.ts +0 -80
- package/src/__tests__/fingerprint.test.ts +0 -36
- package/src/__tests__/retry-mechanism.test.ts +0 -642
- package/src/__tests__/standard-fonts.test.ts +0 -87
- package/src/__tests__/url-builder.test.ts +0 -44
- package/src/exceptions.ts +0 -63
- package/src/fingerprint.ts +0 -182
- package/src/image-builder.ts +0 -59
- package/src/index.ts +0 -49
- package/src/models.ts +0 -1051
- package/src/page-builder.ts +0 -130
- package/src/paragraph-builder.ts +0 -644
- package/src/pdfdancer_v1.ts +0 -2283
- package/src/types.ts +0 -407
- package/tsconfig.json +0 -20
- package/update-api-spec.sh +0 -3
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* E2E tests for image operations — new PDFDancer API
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import * as fs from 'fs';
|
|
6
|
-
import {PDFDancer} from '../../index';
|
|
7
|
-
import {createTempPath, getImagePath, requireEnvAndFixture} from './test-helpers';
|
|
8
|
-
import {expectWithin} from '../assertions';
|
|
9
|
-
import {PDFAssertions} from './pdf-assertions';
|
|
10
|
-
|
|
11
|
-
describe('Image E2E Tests (v2 API)', () => {
|
|
12
|
-
|
|
13
|
-
test('find images', async () => {
|
|
14
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('ObviouslyAwesome.pdf');
|
|
15
|
-
const pdf = await PDFDancer.open(pdfData, token, baseUrl);
|
|
16
|
-
|
|
17
|
-
const images = await pdf.selectImages();
|
|
18
|
-
expect(images).toHaveLength(3);
|
|
19
|
-
expect(images[0].type).toBe('IMAGE');
|
|
20
|
-
|
|
21
|
-
const imagesOnPage0 = await pdf.page(0).selectImages();
|
|
22
|
-
expect(imagesOnPage0).toHaveLength(2);
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
test('delete images', async () => {
|
|
26
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('ObviouslyAwesome.pdf');
|
|
27
|
-
const pdf = await PDFDancer.open(pdfData, token, baseUrl);
|
|
28
|
-
|
|
29
|
-
const images = await pdf.selectImages();
|
|
30
|
-
expect(images).toHaveLength(3);
|
|
31
|
-
for (const img of images) {
|
|
32
|
-
await img.delete();
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
expect(await pdf.selectImages()).toHaveLength(0);
|
|
36
|
-
|
|
37
|
-
const outPath = createTempPath('deleteImage.pdf');
|
|
38
|
-
const outData = await pdf.getBytes();
|
|
39
|
-
fs.writeFileSync(outPath, outData);
|
|
40
|
-
expect(fs.existsSync(outPath)).toBe(true);
|
|
41
|
-
expect(fs.statSync(outPath).size).toBeGreaterThan(0);
|
|
42
|
-
fs.unlinkSync(outPath);
|
|
43
|
-
|
|
44
|
-
const assertions = await PDFAssertions.create(pdf);
|
|
45
|
-
const pages = await pdf.pages();
|
|
46
|
-
for (const page of pages) {
|
|
47
|
-
await assertions.assertNumberOfImages(0, page.position.pageIndex);
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
test('move image', async () => {
|
|
52
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('ObviouslyAwesome.pdf');
|
|
53
|
-
const pdf = await PDFDancer.open(pdfData, token, baseUrl);
|
|
54
|
-
|
|
55
|
-
const images = await pdf.selectImages();
|
|
56
|
-
const image = images[2];
|
|
57
|
-
|
|
58
|
-
const originalX = image.position.boundingRect?.x!;
|
|
59
|
-
const originalY = image.position.boundingRect?.y!;
|
|
60
|
-
const pageIndex = image.position.pageIndex!;
|
|
61
|
-
|
|
62
|
-
expectWithin(originalX, 54, 0.5);
|
|
63
|
-
expectWithin(originalY, 300, 1);
|
|
64
|
-
expect(pageIndex).toBe(11);
|
|
65
|
-
|
|
66
|
-
const newX = 500.1;
|
|
67
|
-
const newY = 600.1;
|
|
68
|
-
await image.moveTo(newX, newY);
|
|
69
|
-
|
|
70
|
-
const moved = await pdf.page(pageIndex).selectImagesAt(newX, newY);
|
|
71
|
-
expect(moved).toHaveLength(1);
|
|
72
|
-
expectWithin(moved[0].position.boundingRect?.x, newX, 0.05);
|
|
73
|
-
expectWithin(moved[0].position.boundingRect?.y, newY, 0.05);
|
|
74
|
-
|
|
75
|
-
const assertions = await PDFAssertions.create(pdf);
|
|
76
|
-
await assertions.assertImageAt(newX, newY, pageIndex);
|
|
77
|
-
await assertions.assertNoImageAt(originalX, originalY, pageIndex);
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
test('find image by position', async () => {
|
|
81
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('ObviouslyAwesome.pdf');
|
|
82
|
-
const pdf = await PDFDancer.open(pdfData, token, baseUrl);
|
|
83
|
-
|
|
84
|
-
const none = await pdf.page(11).selectImagesAt(0, 0);
|
|
85
|
-
expect(none).toHaveLength(0);
|
|
86
|
-
|
|
87
|
-
const found = await pdf.page(11).selectImagesAt(54, 300, 1);
|
|
88
|
-
expect(found).toHaveLength(1);
|
|
89
|
-
expect(found[0].internalId).toBe('IMAGE_000003');
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
test('add image', async () => {
|
|
93
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('ObviouslyAwesome.pdf');
|
|
94
|
-
const pdf = await PDFDancer.open(pdfData, token, baseUrl);
|
|
95
|
-
|
|
96
|
-
const before = await pdf.selectImages();
|
|
97
|
-
expect(before).toHaveLength(3);
|
|
98
|
-
|
|
99
|
-
const result = await pdf.newImage()
|
|
100
|
-
.fromFile(getImagePath('logo-80.png'))
|
|
101
|
-
.at(6, 50.1, 98.0)
|
|
102
|
-
.add();
|
|
103
|
-
|
|
104
|
-
expect(result).toBeTruthy();
|
|
105
|
-
|
|
106
|
-
const after = await pdf.selectImages();
|
|
107
|
-
expect(after).toHaveLength(4);
|
|
108
|
-
|
|
109
|
-
const assertions = await PDFAssertions.create(pdf);
|
|
110
|
-
await assertions.assertImageAt(50.1, 98.0, 6);
|
|
111
|
-
await assertions.assertNumberOfImages(1, 6);
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
// Tests for singular select methods
|
|
115
|
-
test('selectImage returns first image or null', async () => {
|
|
116
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('ObviouslyAwesome.pdf');
|
|
117
|
-
const pdf = await PDFDancer.open(pdfData, token, baseUrl);
|
|
118
|
-
|
|
119
|
-
// Test with results - page 11 has images
|
|
120
|
-
const image = await pdf.page(11).selectImage();
|
|
121
|
-
expect(image).not.toBeNull();
|
|
122
|
-
expect(image!.internalId).toBe('IMAGE_000003');
|
|
123
|
-
|
|
124
|
-
// Test with PDFDancer class
|
|
125
|
-
const imageFromPdf = await pdf.selectImage();
|
|
126
|
-
expect(imageFromPdf).not.toBeNull();
|
|
127
|
-
expect(imageFromPdf!.internalId).toBe('IMAGE_000001');
|
|
128
|
-
|
|
129
|
-
// Test page 0 also has images (2 images)
|
|
130
|
-
const imageOnPage0 = await pdf.page(0).selectImage();
|
|
131
|
-
expect(imageOnPage0).not.toBeNull();
|
|
132
|
-
expect(imageOnPage0!.internalId).toBe('IMAGE_000001');
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
test('selectImageAt returns first image at position or null', async () => {
|
|
136
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('ObviouslyAwesome.pdf');
|
|
137
|
-
const pdf = await PDFDancer.open(pdfData, token, baseUrl);
|
|
138
|
-
|
|
139
|
-
const image = await pdf.page(11).selectImageAt(54, 300, 1);
|
|
140
|
-
expect(image).not.toBeNull();
|
|
141
|
-
expect(image!.internalId).toBe('IMAGE_000003');
|
|
142
|
-
|
|
143
|
-
// Test with no match
|
|
144
|
-
const noMatch = await pdf.page(11).selectImageAt(0, 0);
|
|
145
|
-
expect(noMatch).toBeNull();
|
|
146
|
-
});
|
|
147
|
-
});
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
import {FontType, PDFDancer} from '../../index';
|
|
2
|
-
import {requireEnvAndFixture} from './test-helpers';
|
|
3
|
-
import {PDFAssertions} from './pdf-assertions';
|
|
4
|
-
|
|
5
|
-
const SAMPLE_PARAGRAPH = 'This is regular Sans text showing alignment and styles.';
|
|
6
|
-
|
|
7
|
-
describe('Text Line E2E Tests (Showcase)', () => {
|
|
8
|
-
test('find lines by position multi', async () => {
|
|
9
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('Showcase.pdf');
|
|
10
|
-
const pdf = await PDFDancer.open(pdfData, token, baseUrl);
|
|
11
|
-
|
|
12
|
-
for (let i = 0; i < 10; i++) {
|
|
13
|
-
const lines = await pdf.selectTextLines();
|
|
14
|
-
for (const line of lines) {
|
|
15
|
-
const status = line.objectRef().status;
|
|
16
|
-
expect(status).toBeDefined();
|
|
17
|
-
expect(status?.isModified()).toBe(false);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
test('find lines by position', async () => {
|
|
23
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('Showcase.pdf');
|
|
24
|
-
const pdf = await PDFDancer.open(pdfData, token, baseUrl);
|
|
25
|
-
|
|
26
|
-
const lines = await pdf.selectTextLines();
|
|
27
|
-
expect(lines.length).toBe(36);
|
|
28
|
-
|
|
29
|
-
const first = lines[0];
|
|
30
|
-
expect(first.internalId).toBe('TEXTLINE_000001');
|
|
31
|
-
expect(first.position).toBeDefined();
|
|
32
|
-
expect(Math.abs(first.position.getX()! - 180)).toBeLessThanOrEqual(1);
|
|
33
|
-
expect(Math.abs(first.position.getY()! - 750)).toBeLessThanOrEqual(1);
|
|
34
|
-
expect(first.objectRef().status?.isModified()).toBe(false);
|
|
35
|
-
|
|
36
|
-
const last = lines[lines.length - 1];
|
|
37
|
-
expect(last.internalId).toBe('TEXTLINE_000036');
|
|
38
|
-
expect(Math.abs(last.position.getX()! - 69.3)).toBeLessThanOrEqual(2);
|
|
39
|
-
expect(Math.abs(last.position.getY()! - 45)).toBeLessThanOrEqual(2);
|
|
40
|
-
expect(last.objectRef().status?.isModified()).toBe(false);
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
test('find lines by text', async () => {
|
|
44
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('Showcase.pdf');
|
|
45
|
-
const pdf = await PDFDancer.open(pdfData, token, baseUrl);
|
|
46
|
-
|
|
47
|
-
const lines = await pdf.page(0).selectTextLinesStartingWith(SAMPLE_PARAGRAPH);
|
|
48
|
-
expect(lines.length).toBe(1);
|
|
49
|
-
|
|
50
|
-
const line = lines[0];
|
|
51
|
-
expect(line.internalId).toBe('TEXTLINE_000002');
|
|
52
|
-
expect(Math.abs(line.position.getX()! - 65)).toBeLessThanOrEqual(1);
|
|
53
|
-
expect(Math.abs(line.position.getY()! - 706.8)).toBeLessThanOrEqual(2);
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
test('delete line', async () => {
|
|
57
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('Showcase.pdf');
|
|
58
|
-
const pdf = await PDFDancer.open(pdfData, token, baseUrl);
|
|
59
|
-
|
|
60
|
-
const [line] = await pdf.page(0).selectTextLinesStartingWith(SAMPLE_PARAGRAPH);
|
|
61
|
-
await line.delete();
|
|
62
|
-
|
|
63
|
-
const remaining = await pdf.page(0).selectTextLinesStartingWith(SAMPLE_PARAGRAPH);
|
|
64
|
-
expect(remaining.length).toBe(0);
|
|
65
|
-
|
|
66
|
-
const assertions = await PDFAssertions.create(pdf);
|
|
67
|
-
await assertions.assertTextlineDoesNotExist(SAMPLE_PARAGRAPH);
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
test('move line', async () => {
|
|
71
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('Showcase.pdf');
|
|
72
|
-
const pdf = await PDFDancer.open(pdfData, token, baseUrl);
|
|
73
|
-
|
|
74
|
-
const [line] = await pdf.page(0).selectTextLinesStartingWith(SAMPLE_PARAGRAPH);
|
|
75
|
-
const pos = line.position;
|
|
76
|
-
const newX = pos.getX()! + 100;
|
|
77
|
-
const newY = pos.getY()! + 18;
|
|
78
|
-
|
|
79
|
-
await line.moveTo(newX, newY);
|
|
80
|
-
|
|
81
|
-
const moved = (await pdf.page(0).selectTextLinesAt(newX, newY, 1))[0];
|
|
82
|
-
const status = moved.objectRef().status;
|
|
83
|
-
expect(status).toBeDefined();
|
|
84
|
-
expect(status?.getFontType()).toBe(FontType.EMBEDDED);
|
|
85
|
-
expect(status?.isModified()).toBe(false);
|
|
86
|
-
|
|
87
|
-
const assertions = await PDFAssertions.create(pdf);
|
|
88
|
-
await assertions.assertTextlineIsAt(SAMPLE_PARAGRAPH, newX, newY);
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
test('modify line', async () => {
|
|
92
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('Showcase.pdf');
|
|
93
|
-
const pdf = await PDFDancer.open(pdfData, token, baseUrl);
|
|
94
|
-
|
|
95
|
-
const [line] = await pdf.page(0).selectTextLinesStartingWith(SAMPLE_PARAGRAPH);
|
|
96
|
-
await line.edit().text(' replaced ').apply();
|
|
97
|
-
|
|
98
|
-
expect(await pdf.page(0).selectTextLinesStartingWith(SAMPLE_PARAGRAPH)).toHaveLength(0);
|
|
99
|
-
expect(await pdf.page(0).selectParagraphsStartingWith(' replaced ')).not.toHaveLength(0);
|
|
100
|
-
|
|
101
|
-
const lines = await pdf.page(0).selectTextLinesStartingWith(' replaced ');
|
|
102
|
-
expect(lines.length).toBeGreaterThan(0);
|
|
103
|
-
const status = lines[0].objectRef().status;
|
|
104
|
-
expect(status).toBeDefined();
|
|
105
|
-
expect(status?.getFontType()).toBe(FontType.EMBEDDED);
|
|
106
|
-
expect(status?.isModified()).toBe(true);
|
|
107
|
-
|
|
108
|
-
const assertions = await PDFAssertions.create(pdf);
|
|
109
|
-
await assertions.assertTextlineDoesNotExist(SAMPLE_PARAGRAPH);
|
|
110
|
-
await assertions.assertTextlineExists(' replaced ');
|
|
111
|
-
await assertions.assertParagraphExists(' replaced ');
|
|
112
|
-
});
|
|
113
|
-
});
|
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* E2E tests for text line operations — new PDFDancer API
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import * as fs from 'fs';
|
|
6
|
-
import {FontType, PDFDancer} from '../../index';
|
|
7
|
-
import {createTempPath, requireEnvAndFixture} from './test-helpers';
|
|
8
|
-
import {expectWithin} from '../assertions';
|
|
9
|
-
import {PDFAssertions} from './pdf-assertions';
|
|
10
|
-
|
|
11
|
-
describe('Text Line E2E Tests (v2 API)', () => {
|
|
12
|
-
|
|
13
|
-
test('find lines by position', async () => {
|
|
14
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('ObviouslyAwesome.pdf');
|
|
15
|
-
const pdf = await PDFDancer.open(pdfData, token, baseUrl);
|
|
16
|
-
|
|
17
|
-
const lines = await pdf.selectLines();
|
|
18
|
-
expect(lines).toHaveLength(340);
|
|
19
|
-
|
|
20
|
-
const first = lines[0];
|
|
21
|
-
expect(first.internalId).toBe('TEXTLINE_000001');
|
|
22
|
-
expect(first.position).toBeDefined();
|
|
23
|
-
expectWithin(first.position.boundingRect?.x, 326, 1);
|
|
24
|
-
expectWithin(first.position.boundingRect?.y, 706, 1);
|
|
25
|
-
expect(first.objectRef().status).toBeDefined();
|
|
26
|
-
expect(first.objectRef().status?.isModified()).toBe(false);
|
|
27
|
-
|
|
28
|
-
const last = lines[lines.length - 1];
|
|
29
|
-
expect(last.internalId).toBe('TEXTLINE_000340');
|
|
30
|
-
expect(last.position).toBeDefined();
|
|
31
|
-
expectWithin(last.position.boundingRect?.x, 548, 1);
|
|
32
|
-
expectWithin(last.position.boundingRect?.y, 35, 1);
|
|
33
|
-
expect(last.objectRef().status).toBeDefined();
|
|
34
|
-
expect(last.objectRef().status?.isModified()).toBe(false);
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
test('find lines on page', async () => {
|
|
38
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('ObviouslyAwesome.pdf');
|
|
39
|
-
const pdf = await PDFDancer.open(pdfData, token, baseUrl);
|
|
40
|
-
|
|
41
|
-
const lines = await pdf.page(1).selectTextLines();
|
|
42
|
-
expect(lines).toHaveLength(26);
|
|
43
|
-
|
|
44
|
-
const line = lines[0];
|
|
45
|
-
expect(line.internalId).toBe('TEXTLINE_000005');
|
|
46
|
-
expect(line.position).toBeDefined();
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
test('find lines by text', async () => {
|
|
50
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('ObviouslyAwesome.pdf');
|
|
51
|
-
const pdf = await PDFDancer.open(pdfData, token, baseUrl);
|
|
52
|
-
|
|
53
|
-
const lines = await pdf.page(0).selectTextLinesStartingWith('the complete');
|
|
54
|
-
expect(lines).toHaveLength(1);
|
|
55
|
-
|
|
56
|
-
const line = lines[0];
|
|
57
|
-
expect(line.internalId).toBe('TEXTLINE_000002');
|
|
58
|
-
expect(line.position).toBeDefined();
|
|
59
|
-
expectWithin(line.position.boundingRect?.x, 54, 1);
|
|
60
|
-
expectWithin(line.position.boundingRect?.y, 606, 2);
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
test('delete line', async () => {
|
|
64
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('ObviouslyAwesome.pdf');
|
|
65
|
-
const pdf = await PDFDancer.open(pdfData, token, baseUrl);
|
|
66
|
-
|
|
67
|
-
const [line] = await pdf.page(0).selectTextLinesStartingWith('The Complete');
|
|
68
|
-
await line.delete();
|
|
69
|
-
|
|
70
|
-
const remaining = await pdf.page(0).selectTextLinesStartingWith('The Complete');
|
|
71
|
-
expect(remaining).toHaveLength(0);
|
|
72
|
-
|
|
73
|
-
// Save PDF to verify operation
|
|
74
|
-
const outPath = createTempPath('deleteLine.pdf');
|
|
75
|
-
const data = await pdf.getBytes();
|
|
76
|
-
fs.writeFileSync(outPath, data);
|
|
77
|
-
expect(fs.existsSync(outPath)).toBe(true);
|
|
78
|
-
expect(fs.statSync(outPath).size).toBeGreaterThan(0);
|
|
79
|
-
|
|
80
|
-
fs.unlinkSync(outPath);
|
|
81
|
-
|
|
82
|
-
const assertions = await PDFAssertions.create(pdf);
|
|
83
|
-
await assertions.assertTextlineDoesNotExist('The Complete');
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
test('move line', async () => {
|
|
87
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('ObviouslyAwesome.pdf');
|
|
88
|
-
const pdf = await PDFDancer.open(pdfData, token, baseUrl);
|
|
89
|
-
|
|
90
|
-
const [line] = await pdf.page(0).selectTextLinesStartingWith('The Complete');
|
|
91
|
-
let newX = line.position!.getX()! + 100;
|
|
92
|
-
let newY = line.position!.getY()!;
|
|
93
|
-
await line.moveTo(newX, newY);
|
|
94
|
-
|
|
95
|
-
const movedPara = await pdf.page(0).selectTextLinesAt(newX, newY);
|
|
96
|
-
expect(movedPara.length).toBeGreaterThan(0);
|
|
97
|
-
const assertions = await PDFAssertions.create(pdf);
|
|
98
|
-
await assertions.assertTextlineIsAt('The Complete', newX, newY, 0, 0.25);
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
test('modify line', async () => {
|
|
102
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('ObviouslyAwesome.pdf');
|
|
103
|
-
const pdf = await PDFDancer.open(pdfData, token, baseUrl);
|
|
104
|
-
|
|
105
|
-
const [line] = await pdf.page(0).selectTextLinesStartingWith('The Complete');
|
|
106
|
-
const result = await line.edit().text(' replaced ').apply();
|
|
107
|
-
expect(result.success).toBe(true);
|
|
108
|
-
|
|
109
|
-
const stillOld = await pdf.page(0).selectParagraphsStartingWith('The Complete');
|
|
110
|
-
expect(stillOld).toHaveLength(0);
|
|
111
|
-
|
|
112
|
-
const lines = await pdf.page(0).selectTextLinesMatching('.*replaced.*');
|
|
113
|
-
expect(lines.length).toBeGreaterThan(0);
|
|
114
|
-
expect(lines[0].objectRef().status).toBeDefined();
|
|
115
|
-
expect(lines[0].objectRef().status?.getFontType()).toBe(FontType.EMBEDDED);
|
|
116
|
-
expect(lines[0].objectRef().status?.isModified()).toBe(true);
|
|
117
|
-
|
|
118
|
-
const replaced = await pdf.page(0).selectParagraphsStartingWith(' replaced ');
|
|
119
|
-
expect(replaced.length).toBeGreaterThan(0);
|
|
120
|
-
|
|
121
|
-
const containingParas = await pdf.page(0).selectParagraphsStartingWith(' replaced ');
|
|
122
|
-
expect(containingParas.length).toBeGreaterThan(0);
|
|
123
|
-
|
|
124
|
-
const assertions = await PDFAssertions.create(pdf);
|
|
125
|
-
await assertions.assertTextlineExists(' replaced ');
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
// Tests for singular select methods
|
|
129
|
-
test('selectTextLine returns first line or null', async () => {
|
|
130
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('ObviouslyAwesome.pdf');
|
|
131
|
-
const pdf = await PDFDancer.open(pdfData, token, baseUrl);
|
|
132
|
-
|
|
133
|
-
// Test with results
|
|
134
|
-
const line = await pdf.page(1).selectTextLine();
|
|
135
|
-
expect(line).not.toBeNull();
|
|
136
|
-
expect(line!.internalId).toBe('TEXTLINE_000005');
|
|
137
|
-
|
|
138
|
-
// Test with PDFDancer class
|
|
139
|
-
const lineFromPdf = await pdf.selectTextLine();
|
|
140
|
-
expect(lineFromPdf).not.toBeNull();
|
|
141
|
-
expect(lineFromPdf!.internalId).toBe('TEXTLINE_000001');
|
|
142
|
-
|
|
143
|
-
// Test alias selectLine
|
|
144
|
-
const lineAlias = await pdf.selectLine();
|
|
145
|
-
expect(lineAlias).not.toBeNull();
|
|
146
|
-
expect(lineAlias!.internalId).toBe('TEXTLINE_000001');
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
test('selectTextLineStartingWith returns first match or null', async () => {
|
|
150
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('ObviouslyAwesome.pdf');
|
|
151
|
-
const pdf = await PDFDancer.open(pdfData, token, baseUrl);
|
|
152
|
-
|
|
153
|
-
const line = await pdf.page(0).selectTextLineStartingWith('the complete');
|
|
154
|
-
expect(line).not.toBeNull();
|
|
155
|
-
expect(line!.internalId).toBe('TEXTLINE_000002');
|
|
156
|
-
|
|
157
|
-
// Test with no match
|
|
158
|
-
const noMatch = await pdf.page(0).selectTextLineStartingWith('NoMatch');
|
|
159
|
-
expect(noMatch).toBeNull();
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
test('selectTextLineMatching returns first match or null', async () => {
|
|
163
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('ObviouslyAwesome.pdf');
|
|
164
|
-
const pdf = await PDFDancer.open(pdfData, token, baseUrl);
|
|
165
|
-
|
|
166
|
-
const line = await pdf.page(0).selectTextLineMatching('.*Complete.*');
|
|
167
|
-
expect(line).not.toBeNull();
|
|
168
|
-
expect(line!.internalId).toBe('TEXTLINE_000002');
|
|
169
|
-
|
|
170
|
-
// Test with no match
|
|
171
|
-
const noMatch = await pdf.page(0).selectTextLineMatching('.*NOT FOUND.*');
|
|
172
|
-
expect(noMatch).toBeNull();
|
|
173
|
-
});
|
|
174
|
-
|
|
175
|
-
test('selectTextLineAt returns first line at position or null', async () => {
|
|
176
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('ObviouslyAwesome.pdf');
|
|
177
|
-
const pdf = await PDFDancer.open(pdfData, token, baseUrl);
|
|
178
|
-
|
|
179
|
-
const line = await pdf.page(0).selectTextLineAt(54, 606, 10);
|
|
180
|
-
expect(line).not.toBeNull();
|
|
181
|
-
expect(line!.internalId).toBe('TEXTLINE_000002');
|
|
182
|
-
|
|
183
|
-
// Test with no match
|
|
184
|
-
const noMatch = await pdf.page(0).selectTextLineAt(1000, 1000, 1);
|
|
185
|
-
expect(noMatch).toBeNull();
|
|
186
|
-
});
|
|
187
|
-
});
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
import {ObjectType, Orientation, PDFDancer, STANDARD_PAGE_SIZES} from '../../index';
|
|
2
|
-
import {requireEnvAndFixture} from './test-helpers';
|
|
3
|
-
import {PDFAssertions} from './pdf-assertions';
|
|
4
|
-
|
|
5
|
-
describe('Page E2E Tests (Showcase)', () => {
|
|
6
|
-
test('get all elements', async () => {
|
|
7
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('Showcase.pdf');
|
|
8
|
-
const pdf = await PDFDancer.open(pdfData, token, baseUrl);
|
|
9
|
-
|
|
10
|
-
const elements = await pdf.selectElements();
|
|
11
|
-
expect(elements.length).toBe(99);
|
|
12
|
-
|
|
13
|
-
let total = 0;
|
|
14
|
-
for (const page of await pdf.pages()) {
|
|
15
|
-
const pageElements = await page.selectElements();
|
|
16
|
-
total += pageElements.length;
|
|
17
|
-
}
|
|
18
|
-
expect(total).toBe(99);
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
test('get pages', async () => {
|
|
22
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('Showcase.pdf');
|
|
23
|
-
const pdf = await PDFDancer.open(pdfData, token, baseUrl);
|
|
24
|
-
|
|
25
|
-
const pages = await pdf.pages();
|
|
26
|
-
expect(pages).toBeDefined();
|
|
27
|
-
expect(pages.length).toBe(7);
|
|
28
|
-
expect(pages[0].type).toBe(ObjectType.PAGE);
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
test('get page', async () => {
|
|
32
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('Showcase.pdf');
|
|
33
|
-
const pdf = await PDFDancer.open(pdfData, token, baseUrl);
|
|
34
|
-
|
|
35
|
-
const page = pdf.page(2);
|
|
36
|
-
expect(page).toBeDefined();
|
|
37
|
-
expect(page.position.pageIndex).toBe(2);
|
|
38
|
-
expect(page.internalId).toBeDefined();
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
test('delete page', async () => {
|
|
42
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('Showcase.pdf');
|
|
43
|
-
const pdf = await PDFDancer.open(pdfData, token, baseUrl);
|
|
44
|
-
|
|
45
|
-
const page3 = pdf.page(3);
|
|
46
|
-
await page3.delete();
|
|
47
|
-
|
|
48
|
-
const pagesAfter = await pdf.pages();
|
|
49
|
-
expect(pagesAfter.length).toBe(6);
|
|
50
|
-
|
|
51
|
-
const assertions = await PDFAssertions.create(pdf);
|
|
52
|
-
await assertions.assertNumberOfPages(6);
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
test('move page', async () => {
|
|
56
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('Showcase.pdf');
|
|
57
|
-
const pdf = await PDFDancer.open(pdfData, token, baseUrl);
|
|
58
|
-
|
|
59
|
-
const pagesBefore = await pdf.pages();
|
|
60
|
-
expect(pagesBefore.length).toBe(7);
|
|
61
|
-
|
|
62
|
-
const result = await pdf.movePage(0, 6);
|
|
63
|
-
expect(result.position.pageIndex).toBe(6);
|
|
64
|
-
|
|
65
|
-
const assertions = await PDFAssertions.create(pdf);
|
|
66
|
-
await assertions.assertParagraphExists('This is regular Sans text showing alignment and styles.', 6);
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
test('add page', async () => {
|
|
70
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('Showcase.pdf');
|
|
71
|
-
const pdf = await PDFDancer.open(pdfData, token, baseUrl);
|
|
72
|
-
|
|
73
|
-
const pagesBefore = await pdf.pages();
|
|
74
|
-
expect(pagesBefore.length).toBe(7);
|
|
75
|
-
|
|
76
|
-
await pdf.newPage().add();
|
|
77
|
-
|
|
78
|
-
const pagesAfter = await pdf.pages();
|
|
79
|
-
expect(pagesAfter.length).toBe(8);
|
|
80
|
-
expect(pagesAfter[7].position.pageIndex).toBe(7);
|
|
81
|
-
expect(pagesAfter[7].internalId).toBeDefined();
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
test('add page with builder default', async () => {
|
|
85
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('Showcase.pdf');
|
|
86
|
-
const pdf = await PDFDancer.open(pdfData, token, baseUrl);
|
|
87
|
-
|
|
88
|
-
expect((await pdf.pages()).length).toBe(7);
|
|
89
|
-
|
|
90
|
-
const pageRef = await pdf.newPage().add();
|
|
91
|
-
expect(pageRef.position.pageIndex).toBe(7);
|
|
92
|
-
expect((await pdf.pages()).length).toBe(8);
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
test('add page with builder A4 portrait', async () => {
|
|
96
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('Showcase.pdf');
|
|
97
|
-
const pdf = await PDFDancer.open(pdfData, token, baseUrl);
|
|
98
|
-
|
|
99
|
-
expect((await pdf.pages()).length).toBe(7);
|
|
100
|
-
|
|
101
|
-
const pageRef = await pdf.newPage().a4().portrait().add();
|
|
102
|
-
expect(pageRef.position.pageIndex).toBe(7);
|
|
103
|
-
expect((await pdf.pages()).length).toBe(8);
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
test('add page with builder letter landscape', async () => {
|
|
107
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('Showcase.pdf');
|
|
108
|
-
const pdf = await PDFDancer.open(pdfData, token, baseUrl);
|
|
109
|
-
|
|
110
|
-
expect((await pdf.pages()).length).toBe(7);
|
|
111
|
-
|
|
112
|
-
const pageRef = await pdf.newPage().letter().landscape().add();
|
|
113
|
-
expect(pageRef.position.pageIndex).toBe(7);
|
|
114
|
-
expect((await pdf.pages()).length).toBe(8);
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
test('add page with builder at index', async () => {
|
|
118
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('Showcase.pdf');
|
|
119
|
-
const pdf = await PDFDancer.open(pdfData, token, baseUrl);
|
|
120
|
-
|
|
121
|
-
expect((await pdf.pages()).length).toBe(7);
|
|
122
|
-
|
|
123
|
-
const pageRef = await pdf.newPage().atIndex(5).a5().landscape().add();
|
|
124
|
-
expect(pageRef.position.pageIndex).toBe(5);
|
|
125
|
-
expect((await pdf.pages()).length).toBe(8);
|
|
126
|
-
|
|
127
|
-
const assertions = await PDFAssertions.create(pdf);
|
|
128
|
-
const a5 = STANDARD_PAGE_SIZES.A5;
|
|
129
|
-
await assertions.assertPageDimension(a5.width, a5.height, Orientation.PORTRAIT, 5);
|
|
130
|
-
await assertions.assertTotalNumberOfElements(0, 5);
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
test('add page with builder custom size', async () => {
|
|
134
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('Showcase.pdf');
|
|
135
|
-
const pdf = await PDFDancer.open(pdfData, token, baseUrl);
|
|
136
|
-
|
|
137
|
-
expect((await pdf.pages()).length).toBe(7);
|
|
138
|
-
|
|
139
|
-
const pageRef = await pdf.newPage().customSize(400, 600).landscape().add();
|
|
140
|
-
expect(pageRef.position.pageIndex).toBe(7);
|
|
141
|
-
expect((await pdf.pages()).length).toBe(8);
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
test('add page with builder all options', async () => {
|
|
145
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('Showcase.pdf');
|
|
146
|
-
const pdf = await PDFDancer.open(pdfData, token, baseUrl);
|
|
147
|
-
|
|
148
|
-
expect((await pdf.pages()).length).toBe(7);
|
|
149
|
-
|
|
150
|
-
const pageRef = await pdf.newPage().atIndex(3).pageSize('A3').orientation(Orientation.LANDSCAPE).add();
|
|
151
|
-
expect(pageRef.position.pageIndex).toBe(3);
|
|
152
|
-
expect((await pdf.pages()).length).toBe(8);
|
|
153
|
-
});
|
|
154
|
-
});
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* E2E tests for page operations
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import {ObjectType, PDFDancer} from '../../index';
|
|
6
|
-
import {requireEnvAndFixture} from './test-helpers';
|
|
7
|
-
import {PDFAssertions} from './pdf-assertions';
|
|
8
|
-
|
|
9
|
-
describe('Page E2E Tests', () => {
|
|
10
|
-
// Tests should fail properly if environment is not configured
|
|
11
|
-
|
|
12
|
-
test('get pages', async () => {
|
|
13
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('ObviouslyAwesome.pdf');
|
|
14
|
-
const client = await PDFDancer.open(pdfData, token, baseUrl);
|
|
15
|
-
|
|
16
|
-
const pages = await client.pages();
|
|
17
|
-
expect(pages).toBeDefined();
|
|
18
|
-
expect(pages[0].type).toBe(ObjectType.PAGE);
|
|
19
|
-
expect(pages).toHaveLength(12);
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
test('get page', async () => {
|
|
23
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('ObviouslyAwesome.pdf');
|
|
24
|
-
const client = await PDFDancer.open(pdfData, token, baseUrl);
|
|
25
|
-
|
|
26
|
-
const page = client.page(2);
|
|
27
|
-
expect(page).toBeDefined();
|
|
28
|
-
expect(page!.position.pageIndex).toBe(2);
|
|
29
|
-
expect(page!.internalId).toBeDefined();
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
test('delete page', async () => {
|
|
33
|
-
const [baseUrl, token, pdfData] = await requireEnvAndFixture('ObviouslyAwesome.pdf');
|
|
34
|
-
const client = await PDFDancer.open(pdfData, token, baseUrl);
|
|
35
|
-
|
|
36
|
-
expect(await client.pages()).toHaveLength(12);
|
|
37
|
-
const page3 = client.page(3);
|
|
38
|
-
expect(page3).toBeDefined();
|
|
39
|
-
expect(await page3.delete()).toBe(true);
|
|
40
|
-
|
|
41
|
-
const newPages = await client.pages();
|
|
42
|
-
expect(newPages).toHaveLength(11);
|
|
43
|
-
|
|
44
|
-
const assertions = await PDFAssertions.create(client);
|
|
45
|
-
await assertions.assertPageCount(11);
|
|
46
|
-
});
|
|
47
|
-
});
|