@lexmata/micropdf 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +191 -0
- package/README.md +985 -0
- package/binding.gyp +73 -0
- package/dist/annot.d.ts +458 -0
- package/dist/annot.d.ts.map +1 -0
- package/dist/annot.js +697 -0
- package/dist/annot.js.map +1 -0
- package/dist/archive.d.ts +128 -0
- package/dist/archive.d.ts.map +1 -0
- package/dist/archive.js +268 -0
- package/dist/archive.js.map +1 -0
- package/dist/buffer.d.ts +572 -0
- package/dist/buffer.d.ts.map +1 -0
- package/dist/buffer.js +971 -0
- package/dist/buffer.js.map +1 -0
- package/dist/colorspace.d.ts +287 -0
- package/dist/colorspace.d.ts.map +1 -0
- package/dist/colorspace.js +542 -0
- package/dist/colorspace.js.map +1 -0
- package/dist/context.d.ts +184 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +320 -0
- package/dist/context.js.map +1 -0
- package/dist/cookie.d.ts +164 -0
- package/dist/cookie.d.ts.map +1 -0
- package/dist/cookie.js +306 -0
- package/dist/cookie.js.map +1 -0
- package/dist/device.d.ts +169 -0
- package/dist/device.d.ts.map +1 -0
- package/dist/device.js +350 -0
- package/dist/device.js.map +1 -0
- package/dist/display-list.d.ts +202 -0
- package/dist/display-list.d.ts.map +1 -0
- package/dist/display-list.js +410 -0
- package/dist/display-list.js.map +1 -0
- package/dist/document.d.ts +637 -0
- package/dist/document.d.ts.map +1 -0
- package/dist/document.js +902 -0
- package/dist/document.js.map +1 -0
- package/dist/easy.d.ts +423 -0
- package/dist/easy.d.ts.map +1 -0
- package/dist/easy.js +644 -0
- package/dist/easy.js.map +1 -0
- package/dist/enhanced.d.ts +226 -0
- package/dist/enhanced.d.ts.map +1 -0
- package/dist/enhanced.js +368 -0
- package/dist/enhanced.js.map +1 -0
- package/dist/filter.d.ts +51 -0
- package/dist/filter.d.ts.map +1 -0
- package/dist/filter.js +381 -0
- package/dist/filter.js.map +1 -0
- package/dist/font.d.ts +222 -0
- package/dist/font.d.ts.map +1 -0
- package/dist/font.js +381 -0
- package/dist/font.js.map +1 -0
- package/dist/form.d.ts +214 -0
- package/dist/form.d.ts.map +1 -0
- package/dist/form.js +497 -0
- package/dist/form.js.map +1 -0
- package/dist/geometry.d.ts +469 -0
- package/dist/geometry.d.ts.map +1 -0
- package/dist/geometry.js +780 -0
- package/dist/geometry.js.map +1 -0
- package/dist/image.d.ts +172 -0
- package/dist/image.d.ts.map +1 -0
- package/dist/image.js +348 -0
- package/dist/image.js.map +1 -0
- package/dist/index.d.ts +171 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +339 -0
- package/dist/index.js.map +1 -0
- package/dist/link.d.ts +168 -0
- package/dist/link.d.ts.map +1 -0
- package/dist/link.js +343 -0
- package/dist/link.js.map +1 -0
- package/dist/micropdf.d.ts +40 -0
- package/dist/micropdf.d.ts.map +1 -0
- package/dist/micropdf.js +45 -0
- package/dist/micropdf.js.map +1 -0
- package/dist/nanopdf.d.ts +40 -0
- package/dist/nanopdf.d.ts.map +1 -0
- package/dist/nanopdf.js +45 -0
- package/dist/nanopdf.js.map +1 -0
- package/dist/native.d.ts +242 -0
- package/dist/native.d.ts.map +1 -0
- package/dist/native.js +509 -0
- package/dist/native.js.map +1 -0
- package/dist/output.d.ts +166 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +365 -0
- package/dist/output.js.map +1 -0
- package/dist/path.d.ts +420 -0
- package/dist/path.d.ts.map +1 -0
- package/dist/path.js +687 -0
- package/dist/path.js.map +1 -0
- package/dist/pdf/object.d.ts +489 -0
- package/dist/pdf/object.d.ts.map +1 -0
- package/dist/pdf/object.js +1045 -0
- package/dist/pdf/object.js.map +1 -0
- package/dist/pixmap.d.ts +315 -0
- package/dist/pixmap.d.ts.map +1 -0
- package/dist/pixmap.js +590 -0
- package/dist/pixmap.js.map +1 -0
- package/dist/profiler.d.ts +159 -0
- package/dist/profiler.d.ts.map +1 -0
- package/dist/profiler.js +380 -0
- package/dist/profiler.js.map +1 -0
- package/dist/render-options.d.ts +227 -0
- package/dist/render-options.d.ts.map +1 -0
- package/dist/render-options.js +130 -0
- package/dist/render-options.js.map +1 -0
- package/dist/resource-tracking.d.ts +332 -0
- package/dist/resource-tracking.d.ts.map +1 -0
- package/dist/resource-tracking.js +653 -0
- package/dist/resource-tracking.js.map +1 -0
- package/dist/simple.d.ts +276 -0
- package/dist/simple.d.ts.map +1 -0
- package/dist/simple.js +343 -0
- package/dist/simple.js.map +1 -0
- package/dist/stext.d.ts +290 -0
- package/dist/stext.d.ts.map +1 -0
- package/dist/stext.js +312 -0
- package/dist/stext.js.map +1 -0
- package/dist/stream.d.ts +174 -0
- package/dist/stream.d.ts.map +1 -0
- package/dist/stream.js +476 -0
- package/dist/stream.js.map +1 -0
- package/dist/text.d.ts +337 -0
- package/dist/text.d.ts.map +1 -0
- package/dist/text.js +454 -0
- package/dist/text.js.map +1 -0
- package/dist/typed-arrays.d.ts +127 -0
- package/dist/typed-arrays.d.ts.map +1 -0
- package/dist/typed-arrays.js +410 -0
- package/dist/typed-arrays.js.map +1 -0
- package/dist/types.d.ts +358 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +216 -0
- package/dist/types.js.map +1 -0
- package/native/annot.cc +557 -0
- package/native/buffer.cc +204 -0
- package/native/colorspace.cc +166 -0
- package/native/context.cc +84 -0
- package/native/cookie.cc +179 -0
- package/native/device.cc +179 -0
- package/native/display_list.cc +179 -0
- package/native/document.cc +268 -0
- package/native/enhanced.cc +70 -0
- package/native/font.cc +282 -0
- package/native/form.cc +523 -0
- package/native/geometry.cc +255 -0
- package/native/image.cc +216 -0
- package/native/include/micropdf/enhanced.h +38 -0
- package/native/include/micropdf/types.h +36 -0
- package/native/include/micropdf.h +106 -0
- package/native/include/mupdf-ffi.h +39 -0
- package/native/include/mupdf.h +11 -0
- package/native/include/mupdf_minimal.h +381 -0
- package/native/lib/linux-x64/libmicropdf.a +0 -0
- package/native/link.cc +234 -0
- package/native/micropdf.cc +71 -0
- package/native/output.cc +229 -0
- package/native/page.cc +572 -0
- package/native/path.cc +259 -0
- package/native/pixmap.cc +240 -0
- package/native/stext.cc +610 -0
- package/native/stream.cc +239 -0
- package/package.json +120 -0
- package/scripts/build-from-rust.js +97 -0
- package/scripts/install.js +184 -0
package/dist/easy.js
ADDED
|
@@ -0,0 +1,644 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Easy API - Simplified, ergonomic API for common PDF tasks
|
|
3
|
+
*
|
|
4
|
+
* This module provides a high-level, user-friendly interface for the most common
|
|
5
|
+
* PDF operations, with automatic resource management and intuitive method chaining.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { EasyPDF } from 'micropdf/easy';
|
|
10
|
+
*
|
|
11
|
+
* // Simple text extraction
|
|
12
|
+
* const text = await EasyPDF.extractText('document.pdf');
|
|
13
|
+
*
|
|
14
|
+
* // Render to PNG
|
|
15
|
+
* const buffer = await EasyPDF.renderPage('document.pdf', 0, { dpi: 300 });
|
|
16
|
+
*
|
|
17
|
+
* // Chain operations
|
|
18
|
+
* await EasyPDF.open('input.pdf')
|
|
19
|
+
* .getMetadata()
|
|
20
|
+
* .extractText()
|
|
21
|
+
* .renderPages({ dpi: 150 })
|
|
22
|
+
* .save('output.pdf');
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
import { Document } from './document.js';
|
|
26
|
+
import { Matrix } from './geometry.js';
|
|
27
|
+
import { Colorspace } from './colorspace.js';
|
|
28
|
+
import { dpiToScale } from './render-options.js';
|
|
29
|
+
import * as fs from 'fs/promises';
|
|
30
|
+
/**
|
|
31
|
+
* EasyPDF - Fluent builder for PDF operations
|
|
32
|
+
*/
|
|
33
|
+
export class EasyPDF {
|
|
34
|
+
doc = null;
|
|
35
|
+
autoClose = true;
|
|
36
|
+
constructor(doc) {
|
|
37
|
+
this.doc = doc;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Open a PDF document
|
|
41
|
+
*
|
|
42
|
+
* @param path - Path to PDF file
|
|
43
|
+
* @param password - Optional password for encrypted PDFs
|
|
44
|
+
* @returns EasyPDF instance for chaining
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```typescript
|
|
48
|
+
* const pdf = EasyPDF.open('document.pdf');
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
static open(path, password) {
|
|
52
|
+
const doc = Document.open(path, password);
|
|
53
|
+
return new EasyPDF(doc);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Open a PDF from a buffer
|
|
57
|
+
*
|
|
58
|
+
* @param buffer - Buffer containing PDF data
|
|
59
|
+
* @param password - Optional password for encrypted PDFs
|
|
60
|
+
* @returns EasyPDF instance for chaining
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* ```typescript
|
|
64
|
+
* const buffer = await fs.readFile('document.pdf');
|
|
65
|
+
* const pdf = EasyPDF.fromBuffer(buffer);
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
static fromBuffer(buffer, password) {
|
|
69
|
+
const doc = Document.fromBuffer(buffer, password);
|
|
70
|
+
return new EasyPDF(doc);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Extract text from a PDF file (static helper)
|
|
74
|
+
*
|
|
75
|
+
* @param path - Path to PDF file
|
|
76
|
+
* @param pageNumber - Optional page number (0-indexed), or undefined for all pages
|
|
77
|
+
* @returns Extracted text
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* ```typescript
|
|
81
|
+
* // Extract all text
|
|
82
|
+
* const allText = await EasyPDF.extractText('document.pdf');
|
|
83
|
+
*
|
|
84
|
+
* // Extract from specific page
|
|
85
|
+
* const pageText = await EasyPDF.extractText('document.pdf', 0);
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
static async extractText(path, pageNumber) {
|
|
89
|
+
const pdf = EasyPDF.open(path);
|
|
90
|
+
try {
|
|
91
|
+
if (pageNumber !== undefined) {
|
|
92
|
+
return pdf.extractPageText(pageNumber);
|
|
93
|
+
}
|
|
94
|
+
return pdf.extractAllText();
|
|
95
|
+
}
|
|
96
|
+
finally {
|
|
97
|
+
pdf.close();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Render a specific page to an image buffer (static helper)
|
|
102
|
+
*
|
|
103
|
+
* @param path - Path to PDF file
|
|
104
|
+
* @param pageNumber - Page number (0-indexed)
|
|
105
|
+
* @param options - Render options
|
|
106
|
+
* @returns Image buffer
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```typescript
|
|
110
|
+
* const pngBuffer = await EasyPDF.renderPage('document.pdf', 0, {
|
|
111
|
+
* dpi: 300,
|
|
112
|
+
* format: 'png'
|
|
113
|
+
* });
|
|
114
|
+
* await fs.writeFile('page.png', pngBuffer);
|
|
115
|
+
* ```
|
|
116
|
+
*/
|
|
117
|
+
static async renderPage(path, pageNumber, options = {}) {
|
|
118
|
+
const pdf = EasyPDF.open(path);
|
|
119
|
+
try {
|
|
120
|
+
return pdf.renderToBuffer(pageNumber, options);
|
|
121
|
+
}
|
|
122
|
+
finally {
|
|
123
|
+
pdf.close();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Get document information (static helper)
|
|
128
|
+
*
|
|
129
|
+
* @param path - Path to PDF file
|
|
130
|
+
* @returns Document information
|
|
131
|
+
*
|
|
132
|
+
* @example
|
|
133
|
+
* ```typescript
|
|
134
|
+
* const info = await EasyPDF.getInfo('document.pdf');
|
|
135
|
+
* console.log(`Pages: ${info.pageCount}`);
|
|
136
|
+
* console.log(`Title: ${info.metadata.title}`);
|
|
137
|
+
* ```
|
|
138
|
+
*/
|
|
139
|
+
static async getInfo(path) {
|
|
140
|
+
const pdf = EasyPDF.open(path);
|
|
141
|
+
try {
|
|
142
|
+
return pdf.getInfo();
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
pdf.close();
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Search for text in a PDF (static helper)
|
|
150
|
+
*
|
|
151
|
+
* @param path - Path to PDF file
|
|
152
|
+
* @param query - Text to search for
|
|
153
|
+
* @param pageNumber - Optional page number (0-indexed), or undefined for all pages
|
|
154
|
+
* @returns Array of search results
|
|
155
|
+
*
|
|
156
|
+
* @example
|
|
157
|
+
* ```typescript
|
|
158
|
+
* const results = await EasyPDF.search('document.pdf', 'important');
|
|
159
|
+
* console.log(`Found ${results.length} occurrences`);
|
|
160
|
+
* ```
|
|
161
|
+
*/
|
|
162
|
+
static async search(path, query, pageNumber) {
|
|
163
|
+
const pdf = EasyPDF.open(path);
|
|
164
|
+
try {
|
|
165
|
+
return pdf.search(query, pageNumber);
|
|
166
|
+
}
|
|
167
|
+
finally {
|
|
168
|
+
pdf.close();
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Get the number of pages
|
|
173
|
+
*
|
|
174
|
+
* @returns Page count
|
|
175
|
+
*/
|
|
176
|
+
get pageCount() {
|
|
177
|
+
this.ensureOpen();
|
|
178
|
+
return this.doc.pageCount;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Check if document is encrypted
|
|
182
|
+
*
|
|
183
|
+
* @returns True if encrypted
|
|
184
|
+
*/
|
|
185
|
+
get isEncrypted() {
|
|
186
|
+
this.ensureOpen();
|
|
187
|
+
return this.doc.needsPassword;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Get document metadata
|
|
191
|
+
*
|
|
192
|
+
* @returns Metadata object
|
|
193
|
+
*
|
|
194
|
+
* @example
|
|
195
|
+
* ```typescript
|
|
196
|
+
* const metadata = pdf.getMetadata();
|
|
197
|
+
* console.log(metadata.title);
|
|
198
|
+
* console.log(metadata.author);
|
|
199
|
+
* ```
|
|
200
|
+
*/
|
|
201
|
+
getMetadata() {
|
|
202
|
+
this.ensureOpen();
|
|
203
|
+
const doc = this.doc;
|
|
204
|
+
const parseDate = (dateStr) => {
|
|
205
|
+
if (!dateStr)
|
|
206
|
+
return undefined;
|
|
207
|
+
try {
|
|
208
|
+
// PDF date format: D:YYYYMMDDHHmmSSOHH'mm
|
|
209
|
+
const match = dateStr.match(/^D:(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/);
|
|
210
|
+
if (match) {
|
|
211
|
+
const [, year, month, day, hour, min, sec] = match;
|
|
212
|
+
return new Date(parseInt(year), parseInt(month) - 1, parseInt(day), parseInt(hour), parseInt(min), parseInt(sec));
|
|
213
|
+
}
|
|
214
|
+
return new Date(dateStr);
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
return undefined;
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
const metadata = {};
|
|
221
|
+
const title = doc.getMetadata('Title');
|
|
222
|
+
if (title)
|
|
223
|
+
metadata.title = title;
|
|
224
|
+
const author = doc.getMetadata('Author');
|
|
225
|
+
if (author)
|
|
226
|
+
metadata.author = author;
|
|
227
|
+
const subject = doc.getMetadata('Subject');
|
|
228
|
+
if (subject)
|
|
229
|
+
metadata.subject = subject;
|
|
230
|
+
const keywords = doc.getMetadata('Keywords');
|
|
231
|
+
if (keywords)
|
|
232
|
+
metadata.keywords = keywords;
|
|
233
|
+
const creator = doc.getMetadata('Creator');
|
|
234
|
+
if (creator)
|
|
235
|
+
metadata.creator = creator;
|
|
236
|
+
const producer = doc.getMetadata('Producer');
|
|
237
|
+
if (producer)
|
|
238
|
+
metadata.producer = producer;
|
|
239
|
+
const creationDate = parseDate(doc.getMetadata('CreationDate'));
|
|
240
|
+
if (creationDate)
|
|
241
|
+
metadata.creationDate = creationDate;
|
|
242
|
+
const modDate = parseDate(doc.getMetadata('ModDate'));
|
|
243
|
+
if (modDate)
|
|
244
|
+
metadata.modDate = modDate;
|
|
245
|
+
return metadata;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Get document information
|
|
249
|
+
*
|
|
250
|
+
* @returns Complete document information
|
|
251
|
+
*
|
|
252
|
+
* @example
|
|
253
|
+
* ```typescript
|
|
254
|
+
* const info = pdf.getInfo();
|
|
255
|
+
* console.log(`Document has ${info.pageCount} pages`);
|
|
256
|
+
* info.pages.forEach((page, i) => {
|
|
257
|
+
* console.log(`Page ${i}: ${page.width}x${page.height}`);
|
|
258
|
+
* });
|
|
259
|
+
* ```
|
|
260
|
+
*/
|
|
261
|
+
getInfo() {
|
|
262
|
+
this.ensureOpen();
|
|
263
|
+
const doc = this.doc;
|
|
264
|
+
const pages = [];
|
|
265
|
+
for (let i = 0; i < doc.pageCount; i++) {
|
|
266
|
+
const page = doc.getPage(i);
|
|
267
|
+
try {
|
|
268
|
+
const bounds = page.bounds();
|
|
269
|
+
pages.push({
|
|
270
|
+
pageNumber: i,
|
|
271
|
+
width: bounds.width,
|
|
272
|
+
height: bounds.height,
|
|
273
|
+
rotation: 0 // TODO: Get rotation from page
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
finally {
|
|
277
|
+
page.drop();
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
return {
|
|
281
|
+
pageCount: doc.pageCount,
|
|
282
|
+
metadata: this.getMetadata(),
|
|
283
|
+
isEncrypted: doc.needsPassword,
|
|
284
|
+
hasXfa: false, // TODO: Check for XFA forms
|
|
285
|
+
pages
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Extract text from a specific page
|
|
290
|
+
*
|
|
291
|
+
* @param pageNumber - Page number (0-indexed)
|
|
292
|
+
* @returns Extracted text
|
|
293
|
+
*
|
|
294
|
+
* @example
|
|
295
|
+
* ```typescript
|
|
296
|
+
* const text = pdf.extractPageText(0);
|
|
297
|
+
* console.log(text);
|
|
298
|
+
* ```
|
|
299
|
+
*/
|
|
300
|
+
extractPageText(pageNumber) {
|
|
301
|
+
this.ensureOpen();
|
|
302
|
+
const page = this.doc.getPage(pageNumber);
|
|
303
|
+
try {
|
|
304
|
+
return page.extractText();
|
|
305
|
+
}
|
|
306
|
+
finally {
|
|
307
|
+
page.drop();
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Extract text from all pages
|
|
312
|
+
*
|
|
313
|
+
* @param separator - Separator between pages (default: '\n\n---\n\n')
|
|
314
|
+
* @returns Extracted text
|
|
315
|
+
*
|
|
316
|
+
* @example
|
|
317
|
+
* ```typescript
|
|
318
|
+
* const allText = pdf.extractAllText();
|
|
319
|
+
* ```
|
|
320
|
+
*/
|
|
321
|
+
extractAllText(separator = '\n\n---\n\n') {
|
|
322
|
+
this.ensureOpen();
|
|
323
|
+
const texts = [];
|
|
324
|
+
for (let i = 0; i < this.doc.pageCount; i++) {
|
|
325
|
+
texts.push(this.extractPageText(i));
|
|
326
|
+
}
|
|
327
|
+
return texts.join(separator);
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Extract structured text with bounding boxes
|
|
331
|
+
*
|
|
332
|
+
* @param pageNumber - Page number (0-indexed), or undefined for all pages
|
|
333
|
+
* @returns Array of extracted text with structure
|
|
334
|
+
*
|
|
335
|
+
* @example
|
|
336
|
+
* ```typescript
|
|
337
|
+
* const structured = pdf.extractStructuredText(0);
|
|
338
|
+
* structured.forEach(block => {
|
|
339
|
+
* console.log(`Text: ${block.text}`);
|
|
340
|
+
* console.log(`Position: ${block.bbox.x}, ${block.bbox.y}`);
|
|
341
|
+
* });
|
|
342
|
+
* ```
|
|
343
|
+
*/
|
|
344
|
+
extractStructuredText(pageNumber) {
|
|
345
|
+
this.ensureOpen();
|
|
346
|
+
const results = [];
|
|
347
|
+
const processPage = (pNum) => {
|
|
348
|
+
const page = this.doc.getPage(pNum);
|
|
349
|
+
try {
|
|
350
|
+
const stext = page.extractStructuredText();
|
|
351
|
+
const blocks = stext.blocks.map((block) => ({
|
|
352
|
+
text: block.text || '',
|
|
353
|
+
bbox: {
|
|
354
|
+
x: block.bbox.x,
|
|
355
|
+
y: block.bbox.y,
|
|
356
|
+
width: block.bbox.width,
|
|
357
|
+
height: block.bbox.height
|
|
358
|
+
}
|
|
359
|
+
}));
|
|
360
|
+
results.push({
|
|
361
|
+
text: page.extractText(),
|
|
362
|
+
pageNumber: pNum,
|
|
363
|
+
blocks
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
finally {
|
|
367
|
+
page.drop();
|
|
368
|
+
}
|
|
369
|
+
};
|
|
370
|
+
if (pageNumber !== undefined) {
|
|
371
|
+
processPage(pageNumber);
|
|
372
|
+
}
|
|
373
|
+
else {
|
|
374
|
+
for (let i = 0; i < this.doc.pageCount; i++) {
|
|
375
|
+
processPage(i);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
return results;
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Search for text in the document
|
|
382
|
+
*
|
|
383
|
+
* @param query - Text to search for
|
|
384
|
+
* @param pageNumber - Optional page number (0-indexed), or undefined for all pages
|
|
385
|
+
* @returns Array of search results
|
|
386
|
+
*
|
|
387
|
+
* @example
|
|
388
|
+
* ```typescript
|
|
389
|
+
* const results = pdf.search('important');
|
|
390
|
+
* results.forEach(result => {
|
|
391
|
+
* console.log(`Found on page ${result.pageNumber}: ${result.text}`);
|
|
392
|
+
* });
|
|
393
|
+
* ```
|
|
394
|
+
*/
|
|
395
|
+
search(query, pageNumber) {
|
|
396
|
+
this.ensureOpen();
|
|
397
|
+
const results = [];
|
|
398
|
+
const searchPage = (pNum) => {
|
|
399
|
+
const page = this.doc.getPage(pNum);
|
|
400
|
+
try {
|
|
401
|
+
const hits = page.searchText(query);
|
|
402
|
+
hits.forEach((hit) => {
|
|
403
|
+
results.push({
|
|
404
|
+
text: query,
|
|
405
|
+
pageNumber: pNum,
|
|
406
|
+
bbox: {
|
|
407
|
+
x: hit.x,
|
|
408
|
+
y: hit.y,
|
|
409
|
+
width: hit.width,
|
|
410
|
+
height: hit.height
|
|
411
|
+
}
|
|
412
|
+
});
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
finally {
|
|
416
|
+
page.drop();
|
|
417
|
+
}
|
|
418
|
+
};
|
|
419
|
+
if (pageNumber !== undefined) {
|
|
420
|
+
searchPage(pageNumber);
|
|
421
|
+
}
|
|
422
|
+
else {
|
|
423
|
+
for (let i = 0; i < this.doc.pageCount; i++) {
|
|
424
|
+
searchPage(i);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
return results;
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* Render a page to a buffer
|
|
431
|
+
*
|
|
432
|
+
* @param pageNumber - Page number (0-indexed)
|
|
433
|
+
* @param options - Render options
|
|
434
|
+
* @returns Image buffer
|
|
435
|
+
*
|
|
436
|
+
* @example
|
|
437
|
+
* ```typescript
|
|
438
|
+
* const pngBuffer = pdf.renderToBuffer(0, { dpi: 300 });
|
|
439
|
+
* await fs.writeFile('page.png', pngBuffer);
|
|
440
|
+
* ```
|
|
441
|
+
*/
|
|
442
|
+
renderToBuffer(pageNumber, options = {}) {
|
|
443
|
+
this.ensureOpen();
|
|
444
|
+
const page = this.doc.getPage(pageNumber);
|
|
445
|
+
try {
|
|
446
|
+
// Calculate transform matrix
|
|
447
|
+
let matrix = Matrix.IDENTITY;
|
|
448
|
+
if (options.dpi) {
|
|
449
|
+
const scale = dpiToScale(options.dpi);
|
|
450
|
+
matrix = Matrix.scale(scale, scale);
|
|
451
|
+
}
|
|
452
|
+
else if (options.width || options.height) {
|
|
453
|
+
const bounds = page.bounds();
|
|
454
|
+
const scaleX = options.width ? options.width / bounds.width : 1;
|
|
455
|
+
const scaleY = options.height ? options.height / bounds.height : 1;
|
|
456
|
+
const scale = Math.min(scaleX, scaleY);
|
|
457
|
+
matrix = Matrix.scale(scale, scale);
|
|
458
|
+
}
|
|
459
|
+
// Determine colorspace
|
|
460
|
+
let colorspace;
|
|
461
|
+
switch (options.colorspace) {
|
|
462
|
+
case 'gray':
|
|
463
|
+
colorspace = Colorspace.deviceGray();
|
|
464
|
+
break;
|
|
465
|
+
case 'cmyk':
|
|
466
|
+
colorspace = Colorspace.deviceCMYK();
|
|
467
|
+
break;
|
|
468
|
+
case 'rgb':
|
|
469
|
+
default:
|
|
470
|
+
colorspace = Colorspace.deviceRGB();
|
|
471
|
+
break;
|
|
472
|
+
}
|
|
473
|
+
// Render to pixmap
|
|
474
|
+
const pixmap = page.toPixmap(matrix, colorspace, options.alpha ?? false);
|
|
475
|
+
try {
|
|
476
|
+
// Convert to buffer
|
|
477
|
+
const format = options.format || 'png';
|
|
478
|
+
return pixmap.toBuffer(format);
|
|
479
|
+
}
|
|
480
|
+
finally {
|
|
481
|
+
pixmap.drop();
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
finally {
|
|
485
|
+
page.drop();
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
/**
|
|
489
|
+
* Render a page to a file
|
|
490
|
+
*
|
|
491
|
+
* @param pageNumber - Page number (0-indexed)
|
|
492
|
+
* @param outputPath - Output file path
|
|
493
|
+
* @param options - Render options
|
|
494
|
+
*
|
|
495
|
+
* @example
|
|
496
|
+
* ```typescript
|
|
497
|
+
* await pdf.renderToFile(0, 'page.png', { dpi: 300 });
|
|
498
|
+
* ```
|
|
499
|
+
*/
|
|
500
|
+
async renderToFile(pageNumber, outputPath, options = {}) {
|
|
501
|
+
const buffer = this.renderToBuffer(pageNumber, options);
|
|
502
|
+
await fs.writeFile(outputPath, buffer);
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* Render all pages
|
|
506
|
+
*
|
|
507
|
+
* @param options - Render options
|
|
508
|
+
* @returns Array of image buffers
|
|
509
|
+
*
|
|
510
|
+
* @example
|
|
511
|
+
* ```typescript
|
|
512
|
+
* const pages = pdf.renderAll({ dpi: 150 });
|
|
513
|
+
* pages.forEach((buffer, i) => {
|
|
514
|
+
* fs.writeFileSync(`page-${i}.png`, buffer);
|
|
515
|
+
* });
|
|
516
|
+
* ```
|
|
517
|
+
*/
|
|
518
|
+
renderAll(options = {}) {
|
|
519
|
+
this.ensureOpen();
|
|
520
|
+
const buffers = [];
|
|
521
|
+
for (let i = 0; i < this.doc.pageCount; i++) {
|
|
522
|
+
buffers.push(this.renderToBuffer(i, options));
|
|
523
|
+
}
|
|
524
|
+
return buffers;
|
|
525
|
+
}
|
|
526
|
+
/**
|
|
527
|
+
* Render all pages to files
|
|
528
|
+
*
|
|
529
|
+
* @param outputPattern - Output file pattern (use {page} for page number)
|
|
530
|
+
* @param options - Render options
|
|
531
|
+
*
|
|
532
|
+
* @example
|
|
533
|
+
* ```typescript
|
|
534
|
+
* await pdf.renderAllToFiles('output/page-{page}.png', { dpi: 150 });
|
|
535
|
+
* ```
|
|
536
|
+
*/
|
|
537
|
+
async renderAllToFiles(outputPattern, options = {}) {
|
|
538
|
+
this.ensureOpen();
|
|
539
|
+
for (let i = 0; i < this.doc.pageCount; i++) {
|
|
540
|
+
const outputPath = outputPattern.replace('{page}', i.toString());
|
|
541
|
+
await this.renderToFile(i, outputPath, options);
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
/**
|
|
545
|
+
* Disable automatic closing (for manual resource management)
|
|
546
|
+
*
|
|
547
|
+
* @returns this for chaining
|
|
548
|
+
*/
|
|
549
|
+
keepOpen() {
|
|
550
|
+
this.autoClose = false;
|
|
551
|
+
return this;
|
|
552
|
+
}
|
|
553
|
+
/**
|
|
554
|
+
* Close the document and free resources
|
|
555
|
+
*
|
|
556
|
+
* @example
|
|
557
|
+
* ```typescript
|
|
558
|
+
* const pdf = EasyPDF.open('document.pdf');
|
|
559
|
+
* try {
|
|
560
|
+
* // Use pdf...
|
|
561
|
+
* } finally {
|
|
562
|
+
* pdf.close();
|
|
563
|
+
* }
|
|
564
|
+
* ```
|
|
565
|
+
*/
|
|
566
|
+
close() {
|
|
567
|
+
// Documents don't require explicit cleanup in this implementation
|
|
568
|
+
this.doc = null;
|
|
569
|
+
}
|
|
570
|
+
/**
|
|
571
|
+
* Use the PDF document within a callback, automatically closing it
|
|
572
|
+
*
|
|
573
|
+
* @param callback - Callback function
|
|
574
|
+
* @returns Result of callback
|
|
575
|
+
*
|
|
576
|
+
* @example
|
|
577
|
+
* ```typescript
|
|
578
|
+
* const text = await EasyPDF.open('document.pdf').use(pdf => {
|
|
579
|
+
* return pdf.extractAllText();
|
|
580
|
+
* });
|
|
581
|
+
* ```
|
|
582
|
+
*/
|
|
583
|
+
use(callback) {
|
|
584
|
+
try {
|
|
585
|
+
return callback(this);
|
|
586
|
+
}
|
|
587
|
+
finally {
|
|
588
|
+
if (this.autoClose) {
|
|
589
|
+
this.close();
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
/**
|
|
594
|
+
* Use the PDF document within an async callback, automatically closing it
|
|
595
|
+
*
|
|
596
|
+
* @param callback - Async callback function
|
|
597
|
+
* @returns Promise with result of callback
|
|
598
|
+
*
|
|
599
|
+
* @example
|
|
600
|
+
* ```typescript
|
|
601
|
+
* const info = await EasyPDF.open('document.pdf').useAsync(async pdf => {
|
|
602
|
+
* return pdf.getInfo();
|
|
603
|
+
* });
|
|
604
|
+
* ```
|
|
605
|
+
*/
|
|
606
|
+
async useAsync(callback) {
|
|
607
|
+
try {
|
|
608
|
+
return await callback(this);
|
|
609
|
+
}
|
|
610
|
+
finally {
|
|
611
|
+
if (this.autoClose) {
|
|
612
|
+
this.close();
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
ensureOpen() {
|
|
617
|
+
if (!this.doc) {
|
|
618
|
+
throw new Error('PDF document is closed');
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
/**
|
|
623
|
+
* Namespace for quick utility functions
|
|
624
|
+
*/
|
|
625
|
+
export var PDFUtils;
|
|
626
|
+
(function (PDFUtils) {
|
|
627
|
+
/**
|
|
628
|
+
* Extract text from a PDF file
|
|
629
|
+
*/
|
|
630
|
+
PDFUtils.extractText = EasyPDF.extractText;
|
|
631
|
+
/**
|
|
632
|
+
* Render a page to buffer
|
|
633
|
+
*/
|
|
634
|
+
PDFUtils.renderPage = EasyPDF.renderPage;
|
|
635
|
+
/**
|
|
636
|
+
* Get document information
|
|
637
|
+
*/
|
|
638
|
+
PDFUtils.getInfo = EasyPDF.getInfo;
|
|
639
|
+
/**
|
|
640
|
+
* Search for text
|
|
641
|
+
*/
|
|
642
|
+
PDFUtils.search = EasyPDF.search;
|
|
643
|
+
})(PDFUtils || (PDFUtils = {}));
|
|
644
|
+
//# sourceMappingURL=easy.js.map
|
package/dist/easy.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"easy.js","sourceRoot":"","sources":["../src/easy.ts"],"names":[],"mappings":"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"}
|