@okrapdf/cli 0.1.9 → 0.2.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/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +13 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +104 -24
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/docs.d.ts.map +1 -1
- package/dist/commands/docs.js +29 -5
- package/dist/commands/docs.js.map +1 -1
- package/dist/commands/entities.d.ts +8 -0
- package/dist/commands/entities.d.ts.map +1 -0
- package/dist/commands/entities.js +243 -0
- package/dist/commands/entities.js.map +1 -0
- package/dist/commands/jobs.d.ts.map +1 -1
- package/dist/commands/jobs.js +35 -6
- package/dist/commands/jobs.js.map +1 -1
- package/dist/commands/logs.d.ts.map +1 -1
- package/dist/commands/logs.js +28 -6
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/processors.d.ts.map +1 -1
- package/dist/commands/processors.js +34 -11
- package/dist/commands/processors.js.map +1 -1
- package/dist/commands/providers.d.ts.map +1 -1
- package/dist/commands/providers.js +14 -3
- package/dist/commands/providers.js.map +1 -1
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +89 -12
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/shortcuts.d.ts.map +1 -1
- package/dist/commands/shortcuts.js +66 -5
- package/dist/commands/shortcuts.js.map +1 -1
- package/dist/commands/tables.d.ts.map +1 -1
- package/dist/commands/tables.js +32 -5
- package/dist/commands/tables.js.map +1 -1
- package/dist/commands/templates.d.ts.map +1 -1
- package/dist/commands/templates.js +74 -15
- package/dist/commands/templates.js.map +1 -1
- package/dist/lib/config.d.ts +4 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +6 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/pdf-image.d.ts +118 -0
- package/dist/lib/pdf-image.d.ts.map +1 -0
- package/dist/lib/pdf-image.js +236 -0
- package/dist/lib/pdf-image.js.map +1 -0
- package/dist/lib/workspace.d.ts +59 -0
- package/dist/lib/workspace.d.ts.map +1 -0
- package/dist/lib/workspace.js +185 -0
- package/dist/lib/workspace.js.map +1 -0
- package/package.json +5 -1
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PDF to Image utilities for CLI
|
|
3
|
+
*
|
|
4
|
+
* Uses mupdf for PDF rendering and sharp for image processing.
|
|
5
|
+
* This module is self-contained and doesn't depend on any APIs.
|
|
6
|
+
*/
|
|
7
|
+
// Dynamic imports for optional dependencies
|
|
8
|
+
let mupdfModule = null;
|
|
9
|
+
let sharpFn = null;
|
|
10
|
+
async function getMupdf() {
|
|
11
|
+
if (!mupdfModule) {
|
|
12
|
+
try {
|
|
13
|
+
mupdfModule = await import('mupdf');
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
throw new Error('mupdf is required for image export. Install it with: npm install mupdf');
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return mupdfModule;
|
|
20
|
+
}
|
|
21
|
+
async function getSharp() {
|
|
22
|
+
if (!sharpFn) {
|
|
23
|
+
try {
|
|
24
|
+
const mod = await import('sharp');
|
|
25
|
+
// Handle both ESM default export and CJS module.exports
|
|
26
|
+
sharpFn = (mod.default || mod);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
throw new Error('sharp is required for image export. Install it with: npm install sharp');
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return sharpFn;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Normalize bbox to x/y/width/height format
|
|
36
|
+
*/
|
|
37
|
+
function normalizeBbox(bbox) {
|
|
38
|
+
if ('xmin' in bbox) {
|
|
39
|
+
return {
|
|
40
|
+
x: bbox.xmin,
|
|
41
|
+
y: bbox.ymin,
|
|
42
|
+
width: bbox.xmax - bbox.xmin,
|
|
43
|
+
height: bbox.ymax - bbox.ymin,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
return bbox;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* PDF Image Renderer
|
|
50
|
+
*
|
|
51
|
+
* Renders PDF pages to images and crops regions based on bounding boxes.
|
|
52
|
+
* Includes page caching to avoid redundant renders when extracting multiple
|
|
53
|
+
* regions from the same page.
|
|
54
|
+
*/
|
|
55
|
+
export class PdfImageRenderer {
|
|
56
|
+
document; // mupdf.Document
|
|
57
|
+
pdfBuffer;
|
|
58
|
+
/** Cache key: `${pageNumber}-${scale}` */
|
|
59
|
+
pageCache = new Map();
|
|
60
|
+
constructor(pdfBuffer, document) {
|
|
61
|
+
this.pdfBuffer = pdfBuffer;
|
|
62
|
+
this.document = document;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Create a renderer from a PDF buffer
|
|
66
|
+
*/
|
|
67
|
+
static async fromBuffer(pdfBuffer) {
|
|
68
|
+
const mupdf = await getMupdf();
|
|
69
|
+
const document = mupdf.Document.openDocument(pdfBuffer, 'application/pdf');
|
|
70
|
+
return new PdfImageRenderer(pdfBuffer, document);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Create a renderer from a PDF file path
|
|
74
|
+
*/
|
|
75
|
+
static async fromFile(filePath) {
|
|
76
|
+
const fs = await import('fs/promises');
|
|
77
|
+
const buffer = await fs.readFile(filePath);
|
|
78
|
+
return PdfImageRenderer.fromBuffer(buffer);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Get the number of pages in the PDF
|
|
82
|
+
*/
|
|
83
|
+
getPageCount() {
|
|
84
|
+
return this.document.countPages();
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Get a cached page render, or render and cache it.
|
|
88
|
+
* Always renders as PNG for lossless cropping operations.
|
|
89
|
+
*/
|
|
90
|
+
async getCachedPage(pageNumber, scale) {
|
|
91
|
+
const cacheKey = `${pageNumber}-${scale}`;
|
|
92
|
+
const cached = this.pageCache.get(cacheKey);
|
|
93
|
+
if (cached) {
|
|
94
|
+
return cached;
|
|
95
|
+
}
|
|
96
|
+
const sharp = await getSharp();
|
|
97
|
+
// mupdf uses 0-based page index
|
|
98
|
+
const pageIndex = pageNumber - 1;
|
|
99
|
+
if (pageIndex < 0 || pageIndex >= this.getPageCount()) {
|
|
100
|
+
throw new Error(`Invalid page number: ${pageNumber}. PDF has ${this.getPageCount()} pages.`);
|
|
101
|
+
}
|
|
102
|
+
const page = this.document.loadPage(pageIndex);
|
|
103
|
+
const bounds = page.getBounds();
|
|
104
|
+
const pageWidth = bounds[2] - bounds[0];
|
|
105
|
+
const pageHeight = bounds[3] - bounds[1];
|
|
106
|
+
// Render at scaled resolution
|
|
107
|
+
const pixmap = page.toPixmap([scale, 0, 0, scale, 0, 0], // transformation matrix for scaling
|
|
108
|
+
mupdfModule.ColorSpace.DeviceRGB, false, // no alpha
|
|
109
|
+
true // annotations
|
|
110
|
+
);
|
|
111
|
+
const pngData = pixmap.asPNG();
|
|
112
|
+
const buffer = Buffer.from(pngData);
|
|
113
|
+
const metadata = await sharp(buffer).metadata();
|
|
114
|
+
const result = {
|
|
115
|
+
buffer,
|
|
116
|
+
width: metadata.width || Math.round(pageWidth * scale),
|
|
117
|
+
height: metadata.height || Math.round(pageHeight * scale),
|
|
118
|
+
};
|
|
119
|
+
this.pageCache.set(cacheKey, result);
|
|
120
|
+
return result;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Render a full page to an image
|
|
124
|
+
*/
|
|
125
|
+
async renderPage(pageNumber, options = {}) {
|
|
126
|
+
const { format = 'png', quality = 90, scale = 2 } = options;
|
|
127
|
+
const sharp = await getSharp();
|
|
128
|
+
const cached = await this.getCachedPage(pageNumber, scale);
|
|
129
|
+
// Convert to desired format
|
|
130
|
+
let pipeline = sharp(cached.buffer);
|
|
131
|
+
if (format === 'jpg') {
|
|
132
|
+
pipeline = pipeline.jpeg({ quality });
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
pipeline = pipeline.png();
|
|
136
|
+
}
|
|
137
|
+
const buffer = await pipeline.toBuffer();
|
|
138
|
+
return {
|
|
139
|
+
buffer,
|
|
140
|
+
width: cached.width,
|
|
141
|
+
height: cached.height,
|
|
142
|
+
format,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Render a cropped region from a page
|
|
147
|
+
*/
|
|
148
|
+
async renderRegion(pageNumber, bbox, options = {}) {
|
|
149
|
+
const { format = 'png', quality = 90, scale = 2, padding = 0 } = options;
|
|
150
|
+
const sharp = await getSharp();
|
|
151
|
+
const normalizedBbox = normalizeBbox(bbox);
|
|
152
|
+
// Get cached page render (or render and cache)
|
|
153
|
+
const fullPage = await this.getCachedPage(pageNumber, scale);
|
|
154
|
+
// Calculate crop coordinates in pixels
|
|
155
|
+
const cropX = Math.max(0, Math.floor(normalizedBbox.x * fullPage.width) - padding);
|
|
156
|
+
const cropY = Math.max(0, Math.floor(normalizedBbox.y * fullPage.height) - padding);
|
|
157
|
+
const cropWidth = Math.min(fullPage.width - cropX, Math.ceil(normalizedBbox.width * fullPage.width) + padding * 2);
|
|
158
|
+
const cropHeight = Math.min(fullPage.height - cropY, Math.ceil(normalizedBbox.height * fullPage.height) + padding * 2);
|
|
159
|
+
// Crop the region
|
|
160
|
+
let pipeline = sharp(fullPage.buffer).extract({
|
|
161
|
+
left: cropX,
|
|
162
|
+
top: cropY,
|
|
163
|
+
width: cropWidth,
|
|
164
|
+
height: cropHeight,
|
|
165
|
+
});
|
|
166
|
+
// Convert to desired format
|
|
167
|
+
if (format === 'jpg') {
|
|
168
|
+
pipeline = pipeline.jpeg({ quality });
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
pipeline = pipeline.png();
|
|
172
|
+
}
|
|
173
|
+
const buffer = await pipeline.toBuffer();
|
|
174
|
+
const metadata = await sharp(buffer).metadata();
|
|
175
|
+
return {
|
|
176
|
+
buffer,
|
|
177
|
+
width: metadata.width || cropWidth,
|
|
178
|
+
height: metadata.height || cropHeight,
|
|
179
|
+
format,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Clear the page cache to free memory
|
|
184
|
+
*/
|
|
185
|
+
clearCache() {
|
|
186
|
+
this.pageCache.clear();
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Get cache statistics
|
|
190
|
+
*/
|
|
191
|
+
getCacheStats() {
|
|
192
|
+
let estimatedBytes = 0;
|
|
193
|
+
for (const page of this.pageCache.values()) {
|
|
194
|
+
estimatedBytes += page.buffer.length;
|
|
195
|
+
}
|
|
196
|
+
return {
|
|
197
|
+
pages: this.pageCache.size,
|
|
198
|
+
estimatedBytes,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Close the document and free resources
|
|
203
|
+
*/
|
|
204
|
+
close() {
|
|
205
|
+
// Clear the page cache
|
|
206
|
+
this.pageCache.clear();
|
|
207
|
+
// mupdf handles cleanup automatically via garbage collection
|
|
208
|
+
// but we can help by clearing references
|
|
209
|
+
this.document = null;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Convenience function to render a region from a PDF file
|
|
214
|
+
*/
|
|
215
|
+
export async function renderPdfRegion(pdfPath, pageNumber, bbox, options = {}) {
|
|
216
|
+
const renderer = await PdfImageRenderer.fromFile(pdfPath);
|
|
217
|
+
try {
|
|
218
|
+
return await renderer.renderRegion(pageNumber, bbox, options);
|
|
219
|
+
}
|
|
220
|
+
finally {
|
|
221
|
+
renderer.close();
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Convenience function to render a region from a PDF buffer
|
|
226
|
+
*/
|
|
227
|
+
export async function renderPdfRegionFromBuffer(pdfBuffer, pageNumber, bbox, options = {}) {
|
|
228
|
+
const renderer = await PdfImageRenderer.fromBuffer(pdfBuffer);
|
|
229
|
+
try {
|
|
230
|
+
return await renderer.renderRegion(pageNumber, bbox, options);
|
|
231
|
+
}
|
|
232
|
+
finally {
|
|
233
|
+
renderer.close();
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=pdf-image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-image.js","sourceRoot":"","sources":["../../src/lib/pdf-image.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic Workspace Export
|
|
3
|
+
*
|
|
4
|
+
* Creates a structured workspace directory for AI agents to consume.
|
|
5
|
+
* Outputs JSON manifest to stdout for piping to agents.
|
|
6
|
+
*/
|
|
7
|
+
import type { JobResults } from '../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Workspace manifest for agents
|
|
10
|
+
*/
|
|
11
|
+
export interface WorkspaceManifest {
|
|
12
|
+
version: string;
|
|
13
|
+
job_id: string;
|
|
14
|
+
working_dir: string;
|
|
15
|
+
source: {
|
|
16
|
+
filename: string;
|
|
17
|
+
pages: number;
|
|
18
|
+
file_size_bytes?: number;
|
|
19
|
+
};
|
|
20
|
+
assets: {
|
|
21
|
+
tables: {
|
|
22
|
+
count: number;
|
|
23
|
+
csv_files: string[];
|
|
24
|
+
json_file: string;
|
|
25
|
+
};
|
|
26
|
+
text: {
|
|
27
|
+
markdown: string;
|
|
28
|
+
per_page: string[];
|
|
29
|
+
};
|
|
30
|
+
images?: {
|
|
31
|
+
pages: string[];
|
|
32
|
+
figures: string[];
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
processing: {
|
|
36
|
+
created_at: string;
|
|
37
|
+
cli_version: string;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Options for workspace creation
|
|
42
|
+
*/
|
|
43
|
+
export interface WorkspaceOptions {
|
|
44
|
+
/** Include page images and figure crops */
|
|
45
|
+
includeImages?: boolean;
|
|
46
|
+
/** Image scale factor (1-4) */
|
|
47
|
+
scale?: number;
|
|
48
|
+
/** Image format */
|
|
49
|
+
imageFormat?: 'png' | 'jpg';
|
|
50
|
+
/** PDF buffer for image rendering */
|
|
51
|
+
pdfBuffer?: Buffer;
|
|
52
|
+
/** Original PDF path to copy */
|
|
53
|
+
pdfPath?: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Create an agentic workspace directory structure
|
|
57
|
+
*/
|
|
58
|
+
export declare function createAgenticWorkspace(outputDir: string, results: JobResults, options?: WorkspaceOptions): Promise<WorkspaceManifest>;
|
|
59
|
+
//# sourceMappingURL=workspace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/lib/workspace.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,aAAa,CAAC;AAG3D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QACN,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,MAAM,EAAE;QACN,MAAM,EAAE;YACN,KAAK,EAAE,MAAM,CAAC;YACd,SAAS,EAAE,MAAM,EAAE,CAAC;YACpB,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC;QACF,IAAI,EAAE;YACJ,QAAQ,EAAE,MAAM,CAAC;YACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;SACpB,CAAC;QACF,MAAM,CAAC,EAAE;YACP,KAAK,EAAE,MAAM,EAAE,CAAC;YAChB,OAAO,EAAE,MAAM,EAAE,CAAC;SACnB,CAAC;KACH,CAAC;IACF,UAAU,EAAE;QACV,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,2CAA2C;IAC3C,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mBAAmB;IACnB,WAAW,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IAC5B,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,UAAU,EACnB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,iBAAiB,CAAC,CAwH5B"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic Workspace Export
|
|
3
|
+
*
|
|
4
|
+
* Creates a structured workspace directory for AI agents to consume.
|
|
5
|
+
* Outputs JSON manifest to stdout for piping to agents.
|
|
6
|
+
*/
|
|
7
|
+
import { mkdirSync, writeFileSync } from 'fs';
|
|
8
|
+
import { join, resolve } from 'path';
|
|
9
|
+
/**
|
|
10
|
+
* Create an agentic workspace directory structure
|
|
11
|
+
*/
|
|
12
|
+
export async function createAgenticWorkspace(outputDir, results, options = {}) {
|
|
13
|
+
const dir = resolve(outputDir);
|
|
14
|
+
const { includeImages = false, scale = 2, imageFormat = 'png' } = options;
|
|
15
|
+
// Normalize results - handle both API formats
|
|
16
|
+
// API returns: { results: { tables: [], text: [] } }
|
|
17
|
+
// Type expects: { tables: [], pages: [] }
|
|
18
|
+
const rawResults = results;
|
|
19
|
+
const tables = results.tables || rawResults.results?.tables || [];
|
|
20
|
+
const pages = results.pages || (rawResults.results?.text || []).map((t) => ({
|
|
21
|
+
page_number: t.page,
|
|
22
|
+
text: t.content,
|
|
23
|
+
entities: [],
|
|
24
|
+
}));
|
|
25
|
+
// Create directory structure
|
|
26
|
+
mkdirSync(dir, { recursive: true });
|
|
27
|
+
mkdirSync(join(dir, 'tables'), { recursive: true });
|
|
28
|
+
mkdirSync(join(dir, 'text'), { recursive: true });
|
|
29
|
+
if (includeImages) {
|
|
30
|
+
mkdirSync(join(dir, 'pages'), { recursive: true });
|
|
31
|
+
mkdirSync(join(dir, 'figures'), { recursive: true });
|
|
32
|
+
}
|
|
33
|
+
const manifest = {
|
|
34
|
+
version: '1.0',
|
|
35
|
+
job_id: results.job_id,
|
|
36
|
+
working_dir: dir,
|
|
37
|
+
source: {
|
|
38
|
+
filename: results.filename,
|
|
39
|
+
pages: results.total_pages,
|
|
40
|
+
},
|
|
41
|
+
assets: {
|
|
42
|
+
tables: {
|
|
43
|
+
count: tables.length,
|
|
44
|
+
csv_files: [],
|
|
45
|
+
json_file: 'tables/all_tables.json',
|
|
46
|
+
},
|
|
47
|
+
text: {
|
|
48
|
+
markdown: 'text/full_text.md',
|
|
49
|
+
per_page: [],
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
processing: {
|
|
53
|
+
created_at: new Date().toISOString(),
|
|
54
|
+
cli_version: '0.2.0',
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
// Write tables as CSV and JSON
|
|
58
|
+
const tablesJson = [];
|
|
59
|
+
for (let i = 0; i < tables.length; i++) {
|
|
60
|
+
const table = tables[i];
|
|
61
|
+
const csvFilename = `table_${String(i + 1).padStart(3, '0')}_p${table.page_number}.csv`;
|
|
62
|
+
const csvPath = join(dir, 'tables', csvFilename);
|
|
63
|
+
// Convert markdown table to CSV
|
|
64
|
+
const csv = markdownTableToCsv(table.content_markdown);
|
|
65
|
+
writeFileSync(csvPath, csv, 'utf-8');
|
|
66
|
+
manifest.assets.tables.csv_files.push(`tables/${csvFilename}`);
|
|
67
|
+
tablesJson.push({
|
|
68
|
+
id: table.id,
|
|
69
|
+
page: table.page_number,
|
|
70
|
+
markdown: table.content_markdown,
|
|
71
|
+
rows: parseMarkdownTableRows(table.content_markdown),
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
// Write combined tables JSON
|
|
75
|
+
writeFileSync(join(dir, 'tables', 'all_tables.json'), JSON.stringify(tablesJson, null, 2), 'utf-8');
|
|
76
|
+
// Write text files
|
|
77
|
+
const fullTextParts = [];
|
|
78
|
+
for (const page of pages) {
|
|
79
|
+
const pageFilename = `page_${String(page.page_number).padStart(3, '0')}.md`;
|
|
80
|
+
const pagePath = join(dir, 'text', pageFilename);
|
|
81
|
+
const pageContent = `# Page ${page.page_number}\n\n${page.text}`;
|
|
82
|
+
writeFileSync(pagePath, pageContent, 'utf-8');
|
|
83
|
+
manifest.assets.text.per_page.push(`text/${pageFilename}`);
|
|
84
|
+
fullTextParts.push(`## Page ${page.page_number}\n\n${page.text}`);
|
|
85
|
+
}
|
|
86
|
+
// Write full text markdown
|
|
87
|
+
const fullText = `# ${results.filename}\n\nExtracted text from ${results.total_pages} pages.\n\n---\n\n${fullTextParts.join('\n\n---\n\n')}`;
|
|
88
|
+
writeFileSync(join(dir, 'text', 'full_text.md'), fullText, 'utf-8');
|
|
89
|
+
// Render images if requested
|
|
90
|
+
if (includeImages && options.pdfBuffer) {
|
|
91
|
+
const imageAssets = await renderWorkspaceImages(dir, options.pdfBuffer, results.total_pages, tables, { scale, format: imageFormat });
|
|
92
|
+
manifest.assets.images = imageAssets;
|
|
93
|
+
}
|
|
94
|
+
// Write manifest
|
|
95
|
+
writeFileSync(join(dir, 'manifest.json'), JSON.stringify(manifest, null, 2), 'utf-8');
|
|
96
|
+
return manifest;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Render page images and figure crops
|
|
100
|
+
*/
|
|
101
|
+
async function renderWorkspaceImages(dir, pdfBuffer, totalPages, tables, options) {
|
|
102
|
+
const { PdfImageRenderer } = await import('./pdf-image.js');
|
|
103
|
+
const renderer = await PdfImageRenderer.fromBuffer(pdfBuffer);
|
|
104
|
+
const pageImages = [];
|
|
105
|
+
const figures = [];
|
|
106
|
+
try {
|
|
107
|
+
// Render full page images
|
|
108
|
+
for (let pageNum = 1; pageNum <= totalPages; pageNum++) {
|
|
109
|
+
const filename = `page_${String(pageNum).padStart(3, '0')}.${options.format}`;
|
|
110
|
+
const image = await renderer.renderPage(pageNum, {
|
|
111
|
+
format: options.format,
|
|
112
|
+
scale: options.scale,
|
|
113
|
+
});
|
|
114
|
+
writeFileSync(join(dir, 'pages', filename), image.buffer);
|
|
115
|
+
pageImages.push(`pages/${filename}`);
|
|
116
|
+
}
|
|
117
|
+
// Render figure/table crops from entities with bboxes
|
|
118
|
+
let figureIndex = 1;
|
|
119
|
+
for (const table of tables) {
|
|
120
|
+
if (table.bbox) {
|
|
121
|
+
const filename = `table_${String(figureIndex).padStart(3, '0')}_p${table.page_number}.${options.format}`;
|
|
122
|
+
const image = await renderer.renderRegion(table.page_number, table.bbox, {
|
|
123
|
+
format: options.format,
|
|
124
|
+
scale: options.scale,
|
|
125
|
+
padding: 10,
|
|
126
|
+
});
|
|
127
|
+
writeFileSync(join(dir, 'figures', filename), image.buffer);
|
|
128
|
+
figures.push(`figures/${filename}`);
|
|
129
|
+
figureIndex++;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
finally {
|
|
134
|
+
renderer.close();
|
|
135
|
+
}
|
|
136
|
+
return { pages: pageImages, figures };
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Convert markdown table to CSV
|
|
140
|
+
*/
|
|
141
|
+
function markdownTableToCsv(markdown) {
|
|
142
|
+
const lines = markdown.trim().split('\n');
|
|
143
|
+
const csvLines = [];
|
|
144
|
+
for (const line of lines) {
|
|
145
|
+
// Skip separator lines (|---|---|)
|
|
146
|
+
if (line.match(/^\|[\s-:|]+\|$/))
|
|
147
|
+
continue;
|
|
148
|
+
// Parse table row
|
|
149
|
+
if (line.startsWith('|') && line.endsWith('|')) {
|
|
150
|
+
const cells = line
|
|
151
|
+
.slice(1, -1) // Remove leading/trailing |
|
|
152
|
+
.split('|')
|
|
153
|
+
.map(cell => {
|
|
154
|
+
const trimmed = cell.trim();
|
|
155
|
+
// Escape quotes and wrap in quotes if contains comma/quote/newline
|
|
156
|
+
if (trimmed.includes(',') || trimmed.includes('"') || trimmed.includes('\n')) {
|
|
157
|
+
return `"${trimmed.replace(/"/g, '""')}"`;
|
|
158
|
+
}
|
|
159
|
+
return trimmed;
|
|
160
|
+
});
|
|
161
|
+
csvLines.push(cells.join(','));
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return csvLines.join('\n');
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Parse markdown table into rows array
|
|
168
|
+
*/
|
|
169
|
+
function parseMarkdownTableRows(markdown) {
|
|
170
|
+
const lines = markdown.trim().split('\n');
|
|
171
|
+
const rows = [];
|
|
172
|
+
for (const line of lines) {
|
|
173
|
+
if (line.match(/^\|[\s-:|]+\|$/))
|
|
174
|
+
continue;
|
|
175
|
+
if (line.startsWith('|') && line.endsWith('|')) {
|
|
176
|
+
const cells = line
|
|
177
|
+
.slice(1, -1)
|
|
178
|
+
.split('|')
|
|
179
|
+
.map(cell => cell.trim());
|
|
180
|
+
rows.push(cells);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return rows;
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/lib/workspace.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@okrapdf/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "OkraPDF command-line interface for PDF extraction and document chat",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -56,6 +56,10 @@
|
|
|
56
56
|
"ora": "^8.0.1",
|
|
57
57
|
"ws": "^8.18.0"
|
|
58
58
|
},
|
|
59
|
+
"optionalDependencies": {
|
|
60
|
+
"mupdf": "^0.3.0",
|
|
61
|
+
"sharp": "^0.33.5"
|
|
62
|
+
},
|
|
59
63
|
"devDependencies": {
|
|
60
64
|
"@types/node": "^20.14.0",
|
|
61
65
|
"@types/ws": "^8.5.12",
|