file2md 1.1.8 → 1.1.10
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/parsers/pptx-parser.d.ts +3 -0
- package/dist/parsers/pptx-parser.d.ts.map +1 -1
- package/dist/parsers/pptx-parser.js +82 -2
- package/dist/parsers/pptx-parser.js.map +1 -1
- package/dist/utils/libreoffice-converter.d.ts +33 -0
- package/dist/utils/libreoffice-converter.d.ts.map +1 -0
- package/dist/utils/libreoffice-converter.js +169 -0
- package/dist/utils/libreoffice-converter.js.map +1 -0
- package/dist/utils/libreoffice-detector.d.ts +57 -0
- package/dist/utils/libreoffice-detector.d.ts.map +1 -0
- package/dist/utils/libreoffice-detector.js +295 -0
- package/dist/utils/libreoffice-detector.js.map +1 -0
- package/dist/utils/pptx-visual-parser.d.ts +190 -0
- package/dist/utils/pptx-visual-parser.d.ts.map +1 -0
- package/dist/utils/pptx-visual-parser.js +648 -0
- package/dist/utils/pptx-visual-parser.js.map +1 -0
- package/dist/utils/puppeteer-renderer.d.ts +65 -0
- package/dist/utils/puppeteer-renderer.d.ts.map +1 -0
- package/dist/utils/puppeteer-renderer.js +393 -0
- package/dist/utils/puppeteer-renderer.js.map +1 -0
- package/dist/utils/slide-renderer.d.ts +55 -3
- package/dist/utils/slide-renderer.d.ts.map +1 -1
- package/dist/utils/slide-renderer.js +478 -52
- package/dist/utils/slide-renderer.js.map +1 -1
- package/package.json +6 -1
@@ -2,12 +2,14 @@ import type { Buffer } from 'node:buffer';
|
|
2
2
|
import type { ImageExtractor } from '../utils/image-extractor.js';
|
3
3
|
import type { ChartExtractor } from '../utils/chart-extractor.js';
|
4
4
|
import { type SlideRenderOptions } from '../utils/slide-renderer.js';
|
5
|
+
import { type SlideLayout } from '../utils/pptx-visual-parser.js';
|
5
6
|
import type { ImageData, ChartData } from '../types/interfaces.js';
|
6
7
|
export interface PptxParseOptions {
|
7
8
|
readonly preserveLayout?: boolean;
|
8
9
|
readonly extractImages?: boolean;
|
9
10
|
readonly extractCharts?: boolean;
|
10
11
|
readonly useSlideScreenshots?: boolean;
|
12
|
+
readonly useVisualParser?: boolean;
|
11
13
|
readonly slideRenderOptions?: SlideRenderOptions;
|
12
14
|
readonly outputDir?: string;
|
13
15
|
}
|
@@ -17,6 +19,7 @@ export interface PptxParseResult {
|
|
17
19
|
readonly charts: readonly ChartData[];
|
18
20
|
readonly slideCount: number;
|
19
21
|
readonly metadata: Record<string, unknown>;
|
22
|
+
readonly visualLayouts?: readonly SlideLayout[];
|
20
23
|
}
|
21
24
|
/**
|
22
25
|
* Parse PPTX buffer and convert to markdown with layout preservation
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"pptx-parser.d.ts","sourceRoot":"","sources":["../../src/parsers/pptx-parser.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAiB,KAAK,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEpF,OAAO,KAAK,EACV,SAAS,EACT,SAAS,EACV,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IACvC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACjD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;
|
1
|
+
{"version":3,"file":"pptx-parser.d.ts","sourceRoot":"","sources":["../../src/parsers/pptx-parser.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAiB,KAAK,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACpF,OAAO,EAAoB,KAAK,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAEpF,OAAO,KAAK,EACV,SAAS,EACT,SAAS,EACV,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IACvC,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACjD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;CACjD;AAOD;;GAEG;AACH,wBAAsB,SAAS,CAC7B,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,cAAc,EAC9B,cAAc,EAAE,cAAc,EAC9B,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,CAuB1B"}
|
@@ -2,6 +2,7 @@ import JSZip from 'jszip';
|
|
2
2
|
import { parseStringPromise } from 'xml2js';
|
3
3
|
import path from 'node:path';
|
4
4
|
import { SlideRenderer } from '../utils/slide-renderer.js';
|
5
|
+
import { PptxVisualParser } from '../utils/pptx-visual-parser.js';
|
5
6
|
import { ParseError } from '../types/errors.js';
|
6
7
|
/**
|
7
8
|
* Parse PPTX buffer and convert to markdown with layout preservation
|
@@ -27,12 +28,26 @@ async function parsePptxWithSlideScreenshots(buffer, imageExtractor, chartExtrac
|
|
27
28
|
const outputDir = options.outputDir || './images';
|
28
29
|
const slideRenderer = new SlideRenderer(outputDir);
|
29
30
|
try {
|
31
|
+
// Enhanced visual parsing if requested
|
32
|
+
let visualLayouts;
|
33
|
+
if (options.useVisualParser !== false) {
|
34
|
+
try {
|
35
|
+
const visualParser = new PptxVisualParser();
|
36
|
+
visualLayouts = await visualParser.parseVisualElements(buffer);
|
37
|
+
console.log(`Visual parser extracted ${visualLayouts.length} slide layouts`);
|
38
|
+
}
|
39
|
+
catch (visualError) {
|
40
|
+
console.warn('Visual parsing failed, continuing with standard processing:', visualError);
|
41
|
+
}
|
42
|
+
}
|
30
43
|
// Convert PPTX to slide images
|
31
44
|
const renderResult = await slideRenderer.renderSlidesToImages(buffer, options.slideRenderOptions);
|
32
45
|
// Extract title from PPTX metadata for better markdown generation
|
33
46
|
const title = await extractPptxTitle(buffer);
|
34
|
-
// Generate markdown with
|
35
|
-
const markdown =
|
47
|
+
// Generate enhanced markdown with visual layouts if available
|
48
|
+
const markdown = visualLayouts
|
49
|
+
? generateEnhancedMarkdownWithLayouts(renderResult.slideImages, visualLayouts, title)
|
50
|
+
: slideRenderer.generateSlideMarkdown(renderResult.slideImages, title);
|
36
51
|
// Still extract charts if requested (need to load zip for chart extraction)
|
37
52
|
let extractedCharts = [];
|
38
53
|
if (options.extractCharts !== false) {
|
@@ -49,11 +64,13 @@ async function parsePptxWithSlideScreenshots(buffer, imageExtractor, chartExtrac
|
|
49
64
|
images: renderResult.slideImages,
|
50
65
|
charts: extractedCharts.map(chart => chart.data),
|
51
66
|
slideCount: renderResult.slideCount,
|
67
|
+
visualLayouts,
|
52
68
|
metadata: {
|
53
69
|
totalSlides: renderResult.slideCount,
|
54
70
|
hasImages: renderResult.slideImages.length > 0,
|
55
71
|
hasCharts: extractedCharts.length > 0,
|
56
72
|
renderMethod: 'slide-screenshots',
|
73
|
+
hasVisualLayouts: visualLayouts !== undefined,
|
57
74
|
...renderResult.metadata
|
58
75
|
}
|
59
76
|
};
|
@@ -201,4 +218,67 @@ async function extractLegacySlideContent(xmlContent, imageExtractor, extractedIm
|
|
201
218
|
throw new ParseError('PPTX', `Failed to extract legacy content from slide: ${message}`, error);
|
202
219
|
}
|
203
220
|
}
|
221
|
+
/**
|
222
|
+
* Generate enhanced markdown with visual layout information
|
223
|
+
*/
|
224
|
+
function generateEnhancedMarkdownWithLayouts(slideImages, visualLayouts, title) {
|
225
|
+
let markdown = '';
|
226
|
+
if (title) {
|
227
|
+
markdown += `# ${title}\n\n`;
|
228
|
+
}
|
229
|
+
for (let i = 0; i < slideImages.length; i++) {
|
230
|
+
const slide = slideImages[i];
|
231
|
+
const layout = visualLayouts[i];
|
232
|
+
const slideNumber = i + 1;
|
233
|
+
// Generate slide header with enhanced information
|
234
|
+
if (layout?.title) {
|
235
|
+
markdown += `## Slide ${slideNumber}: ${layout.title}\n\n`;
|
236
|
+
}
|
237
|
+
else {
|
238
|
+
markdown += `## Slide ${slideNumber}\n\n`;
|
239
|
+
}
|
240
|
+
// Use relative path for markdown image reference
|
241
|
+
const relativePath = path.relative(process.cwd(), slide.savedPath)
|
242
|
+
.replace(/\\/g, '/'); // Ensure forward slashes for markdown
|
243
|
+
markdown += `\n\n`;
|
244
|
+
// Add layout information if available
|
245
|
+
if (layout && layout.elements.length > 0) {
|
246
|
+
markdown += `### Slide Content Summary\n\n`;
|
247
|
+
// Categorize elements
|
248
|
+
const textElements = layout.elements.filter(e => e.type === 'text');
|
249
|
+
const imageElements = layout.elements.filter(e => e.type === 'image');
|
250
|
+
const chartElements = layout.elements.filter(e => e.type === 'chart');
|
251
|
+
const tableElements = layout.elements.filter(e => e.type === 'table');
|
252
|
+
const shapeElements = layout.elements.filter(e => e.type === 'shape');
|
253
|
+
// Add text content
|
254
|
+
if (textElements.length > 0) {
|
255
|
+
markdown += `**Text Elements (${textElements.length}):**\n`;
|
256
|
+
textElements.forEach((element, index) => {
|
257
|
+
if (element.type === 'text' && element.content?.text) {
|
258
|
+
const textContent = element.content.text.trim();
|
259
|
+
if (textContent) {
|
260
|
+
markdown += `${index + 1}. ${textContent.substring(0, 100)}${textContent.length > 100 ? '...' : ''}\n`;
|
261
|
+
}
|
262
|
+
}
|
263
|
+
});
|
264
|
+
markdown += '\n';
|
265
|
+
}
|
266
|
+
// Add visual element counts
|
267
|
+
if (imageElements.length > 0) {
|
268
|
+
markdown += `**Images:** ${imageElements.length} embedded image(s)\n`;
|
269
|
+
}
|
270
|
+
if (chartElements.length > 0) {
|
271
|
+
markdown += `**Charts:** ${chartElements.length} chart(s)\n`;
|
272
|
+
}
|
273
|
+
if (tableElements.length > 0) {
|
274
|
+
markdown += `**Tables:** ${tableElements.length} table(s)\n`;
|
275
|
+
}
|
276
|
+
if (shapeElements.length > 0) {
|
277
|
+
markdown += `**Shapes:** ${shapeElements.length} shape(s)\n`;
|
278
|
+
}
|
279
|
+
markdown += '\n';
|
280
|
+
}
|
281
|
+
}
|
282
|
+
return markdown.trim();
|
283
|
+
}
|
204
284
|
//# sourceMappingURL=pptx-parser.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"pptx-parser.js","sourceRoot":"","sources":["../../src/parsers/pptx-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAK7B,OAAO,EAAE,aAAa,EAA2B,MAAM,4BAA4B,CAAC;AACpF,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;
|
1
|
+
{"version":3,"file":"pptx-parser.js","sourceRoot":"","sources":["../../src/parsers/pptx-parser.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,33 @@
|
|
1
|
+
import { EventEmitter } from 'events';
|
2
|
+
export interface ConversionOptions {
|
3
|
+
quality?: 'low' | 'medium' | 'high' | 'maximum';
|
4
|
+
timeout?: number;
|
5
|
+
outputFormat?: string;
|
6
|
+
additionalArgs?: string[];
|
7
|
+
}
|
8
|
+
export interface ConversionProgress {
|
9
|
+
stage: 'starting' | 'converting' | 'completed' | 'error';
|
10
|
+
percentage?: number;
|
11
|
+
message?: string;
|
12
|
+
}
|
13
|
+
export declare class LibreOfficeConverter extends EventEmitter {
|
14
|
+
private readonly detector;
|
15
|
+
constructor();
|
16
|
+
/**
|
17
|
+
* Convert PPTX to PDF with enhanced options
|
18
|
+
*/
|
19
|
+
convertToPdf(inputBuffer: Buffer, options?: ConversionOptions): Promise<Buffer>;
|
20
|
+
/**
|
21
|
+
* Get PDF filter string based on quality setting
|
22
|
+
*/
|
23
|
+
private getPdfFilter;
|
24
|
+
/**
|
25
|
+
* Execute LibreOffice conversion with timeout and progress tracking
|
26
|
+
*/
|
27
|
+
private executeConversion;
|
28
|
+
/**
|
29
|
+
* Convert with progress callback
|
30
|
+
*/
|
31
|
+
convertWithProgress(inputBuffer: Buffer, options?: ConversionOptions, onProgress?: (progress: ConversionProgress) => void): Promise<Buffer>;
|
32
|
+
}
|
33
|
+
//# sourceMappingURL=libreoffice-converter.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"libreoffice-converter.d.ts","sourceRoot":"","sources":["../../src/utils/libreoffice-converter.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGtC,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,UAAU,GAAG,YAAY,GAAG,WAAW,GAAG,OAAO,CAAC;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,oBAAqB,SAAQ,YAAY;IACpD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;;IAO/C;;OAEG;IACG,YAAY,CAChB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,MAAM,CAAC;IA0ElB;;OAEG;IACH,OAAO,CAAC,YAAY;IAepB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAwEzB;;OAEG;IACG,mBAAmB,CACvB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,iBAAsB,EAC/B,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,IAAI,GAClD,OAAO,CAAC,MAAM,CAAC;CAanB"}
|
@@ -0,0 +1,169 @@
|
|
1
|
+
import { spawn } from 'child_process';
|
2
|
+
import path from 'path';
|
3
|
+
import fs from 'fs/promises';
|
4
|
+
import { tmpdir } from 'os';
|
5
|
+
import { randomBytes } from 'crypto';
|
6
|
+
import { EventEmitter } from 'events';
|
7
|
+
import { LibreOfficeDetector } from './libreoffice-detector.js';
|
8
|
+
export class LibreOfficeConverter extends EventEmitter {
|
9
|
+
detector;
|
10
|
+
constructor() {
|
11
|
+
super();
|
12
|
+
this.detector = LibreOfficeDetector.getInstance();
|
13
|
+
}
|
14
|
+
/**
|
15
|
+
* Convert PPTX to PDF with enhanced options
|
16
|
+
*/
|
17
|
+
async convertToPdf(inputBuffer, options = {}) {
|
18
|
+
const { quality = 'maximum', timeout = 30000, additionalArgs = [] } = options;
|
19
|
+
// Check LibreOffice installation
|
20
|
+
const info = await this.detector.checkLibreOfficeInstallation();
|
21
|
+
if (!info.installed || !info.path) {
|
22
|
+
throw new Error('LibreOffice is not installed');
|
23
|
+
}
|
24
|
+
// Create temporary files
|
25
|
+
const tempId = randomBytes(8).toString('hex');
|
26
|
+
const tempDir = path.join(tmpdir(), `libreoffice-${tempId}`);
|
27
|
+
const inputPath = path.join(tempDir, 'input.pptx');
|
28
|
+
const outputDir = tempDir;
|
29
|
+
try {
|
30
|
+
// Create temp directory and save input file
|
31
|
+
await fs.mkdir(tempDir, { recursive: true });
|
32
|
+
await fs.writeFile(inputPath, inputBuffer);
|
33
|
+
this.emit('progress', {
|
34
|
+
stage: 'starting',
|
35
|
+
percentage: 0,
|
36
|
+
message: 'Initializing LibreOffice conversion...'
|
37
|
+
});
|
38
|
+
// Build conversion arguments
|
39
|
+
const args = [
|
40
|
+
'--headless',
|
41
|
+
'--invisible',
|
42
|
+
'--nodefault',
|
43
|
+
'--nolockcheck',
|
44
|
+
'--nologo',
|
45
|
+
'--norestore',
|
46
|
+
'--convert-to',
|
47
|
+
this.getPdfFilter(quality),
|
48
|
+
'--outdir',
|
49
|
+
outputDir,
|
50
|
+
...additionalArgs,
|
51
|
+
inputPath
|
52
|
+
];
|
53
|
+
// Execute conversion
|
54
|
+
const outputPath = await this.executeConversion(info.path, args, timeout);
|
55
|
+
// Read the output PDF
|
56
|
+
const pdfBuffer = await fs.readFile(outputPath);
|
57
|
+
this.emit('progress', {
|
58
|
+
stage: 'completed',
|
59
|
+
percentage: 100,
|
60
|
+
message: 'Conversion completed successfully'
|
61
|
+
});
|
62
|
+
return pdfBuffer;
|
63
|
+
}
|
64
|
+
finally {
|
65
|
+
// Cleanup temporary files
|
66
|
+
try {
|
67
|
+
await fs.rm(tempDir, { recursive: true, force: true });
|
68
|
+
}
|
69
|
+
catch {
|
70
|
+
// Ignore cleanup errors
|
71
|
+
}
|
72
|
+
}
|
73
|
+
}
|
74
|
+
/**
|
75
|
+
* Get PDF filter string based on quality setting
|
76
|
+
*/
|
77
|
+
getPdfFilter(quality) {
|
78
|
+
switch (quality) {
|
79
|
+
case 'maximum':
|
80
|
+
return 'pdf:writer_pdf_Export:{"MaxImageResolution":{"type":"long","value":"300"},"UseTaggedPDF":{"type":"boolean","value":"true"},"SelectPdfVersion":{"type":"long","value":"0"},"Quality":{"type":"long","value":"100"}}';
|
81
|
+
case 'high':
|
82
|
+
return 'pdf:writer_pdf_Export:{"MaxImageResolution":{"type":"long","value":"200"},"Quality":{"type":"long","value":"90"}}';
|
83
|
+
case 'medium':
|
84
|
+
return 'pdf:writer_pdf_Export:{"MaxImageResolution":{"type":"long","value":"150"},"Quality":{"type":"long","value":"80"}}';
|
85
|
+
case 'low':
|
86
|
+
return 'pdf:writer_pdf_Export:{"MaxImageResolution":{"type":"long","value":"100"},"Quality":{"type":"long","value":"70"}}';
|
87
|
+
default:
|
88
|
+
return 'pdf:writer_pdf_Export';
|
89
|
+
}
|
90
|
+
}
|
91
|
+
/**
|
92
|
+
* Execute LibreOffice conversion with timeout and progress tracking
|
93
|
+
*/
|
94
|
+
executeConversion(sofficePath, args, timeout) {
|
95
|
+
return new Promise((resolve, reject) => {
|
96
|
+
const process = spawn(sofficePath, args);
|
97
|
+
let outputPath = null;
|
98
|
+
let stderr = '';
|
99
|
+
let timedOut = false;
|
100
|
+
// Set up timeout
|
101
|
+
const timeoutHandle = setTimeout(() => {
|
102
|
+
timedOut = true;
|
103
|
+
process.kill('SIGTERM');
|
104
|
+
reject(new Error(`Conversion timed out after ${timeout}ms`));
|
105
|
+
}, timeout);
|
106
|
+
// Track progress
|
107
|
+
const progressInterval = setInterval(() => {
|
108
|
+
if (!timedOut && outputPath === null) {
|
109
|
+
this.emit('progress', {
|
110
|
+
stage: 'converting',
|
111
|
+
percentage: 50,
|
112
|
+
message: 'Converting document...'
|
113
|
+
});
|
114
|
+
}
|
115
|
+
}, 1000);
|
116
|
+
process.stderr.on('data', (data) => {
|
117
|
+
stderr += data.toString();
|
118
|
+
});
|
119
|
+
process.on('close', async (code) => {
|
120
|
+
clearTimeout(timeoutHandle);
|
121
|
+
clearInterval(progressInterval);
|
122
|
+
if (timedOut) {
|
123
|
+
return; // Already rejected
|
124
|
+
}
|
125
|
+
if (code !== 0) {
|
126
|
+
reject(new Error(`LibreOffice exited with code ${code}: ${stderr}`));
|
127
|
+
return;
|
128
|
+
}
|
129
|
+
// Find the output file
|
130
|
+
try {
|
131
|
+
const tempDir = path.dirname(args[args.length - 1]);
|
132
|
+
const files = await fs.readdir(tempDir);
|
133
|
+
const pdfFile = files.find(f => f.endsWith('.pdf'));
|
134
|
+
if (!pdfFile) {
|
135
|
+
reject(new Error('No PDF output file found'));
|
136
|
+
return;
|
137
|
+
}
|
138
|
+
outputPath = path.join(tempDir, pdfFile);
|
139
|
+
resolve(outputPath);
|
140
|
+
}
|
141
|
+
catch (error) {
|
142
|
+
reject(error);
|
143
|
+
}
|
144
|
+
});
|
145
|
+
process.on('error', (error) => {
|
146
|
+
clearTimeout(timeoutHandle);
|
147
|
+
clearInterval(progressInterval);
|
148
|
+
reject(error);
|
149
|
+
});
|
150
|
+
});
|
151
|
+
}
|
152
|
+
/**
|
153
|
+
* Convert with progress callback
|
154
|
+
*/
|
155
|
+
async convertWithProgress(inputBuffer, options = {}, onProgress) {
|
156
|
+
if (onProgress) {
|
157
|
+
this.on('progress', onProgress);
|
158
|
+
}
|
159
|
+
try {
|
160
|
+
return await this.convertToPdf(inputBuffer, options);
|
161
|
+
}
|
162
|
+
finally {
|
163
|
+
if (onProgress) {
|
164
|
+
this.removeListener('progress', onProgress);
|
165
|
+
}
|
166
|
+
}
|
167
|
+
}
|
168
|
+
}
|
169
|
+
//# sourceMappingURL=libreoffice-converter.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"libreoffice-converter.js","sourceRoot":"","sources":["../../src/utils/libreoffice-converter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAehE,MAAM,OAAO,oBAAqB,SAAQ,YAAY;IACnC,QAAQ,CAAsB;IAE/C;QACE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,QAAQ,GAAG,mBAAmB,CAAC,WAAW,EAAE,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAChB,WAAmB,EACnB,UAA6B,EAAE;QAE/B,MAAM,EACJ,OAAO,GAAG,SAAS,EACnB,OAAO,GAAG,KAAK,EACf,cAAc,GAAG,EAAE,EACpB,GAAG,OAAO,CAAC;QAEZ,iCAAiC;QACjC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,4BAA4B,EAAE,CAAC;QAChE,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QAED,yBAAyB;QACzB,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,MAAM,EAAE,CAAC,CAAC;QAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,OAAO,CAAC;QAE1B,IAAI,CAAC;YACH,4CAA4C;YAC5C,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7C,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YAE3C,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;gBACpB,KAAK,EAAE,UAAU;gBACjB,UAAU,EAAE,CAAC;gBACb,OAAO,EAAE,wCAAwC;aAClD,CAAC,CAAC;YAEH,6BAA6B;YAC7B,MAAM,IAAI,GAAG;gBACX,YAAY;gBACZ,aAAa;gBACb,aAAa;gBACb,eAAe;gBACf,UAAU;gBACV,aAAa;gBACb,cAAc;gBACd,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;gBAC1B,UAAU;gBACV,SAAS;gBACT,GAAG,cAAc;gBACjB,SAAS;aACV,CAAC;YAEF,qBAAqB;YACrB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAC7C,IAAI,CAAC,IAAI,EACT,IAAI,EACJ,OAAO,CACR,CAAC;YAEF,sBAAsB;YACtB,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAEhD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;gBACpB,KAAK,EAAE,WAAW;gBAClB,UAAU,EAAE,GAAG;gBACf,OAAO,EAAE,mCAAmC;aAC7C,CAAC,CAAC;YAEH,OAAO,SAAS,CAAC;QAEnB,CAAC;gBAAS,CAAC;YACT,0BAA0B;YAC1B,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACzD,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,OAAe;QAClC,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,SAAS;gBACZ,OAAO,oNAAoN,CAAC;YAC9N,KAAK,MAAM;gBACT,OAAO,mHAAmH,CAAC;YAC7H,KAAK,QAAQ;gBACX,OAAO,mHAAmH,CAAC;YAC7H,KAAK,KAAK;gBACR,OAAO,mHAAmH,CAAC;YAC7H;gBACE,OAAO,uBAAuB,CAAC;QACnC,CAAC;IACH,CAAC;IAED;;OAEG;IACK,iBAAiB,CACvB,WAAmB,EACnB,IAAc,EACd,OAAe;QAEf,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YACzC,IAAI,UAAU,GAAkB,IAAI,CAAC;YACrC,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,QAAQ,GAAG,KAAK,CAAC;YAErB,iBAAiB;YACjB,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;gBACpC,QAAQ,GAAG,IAAI,CAAC;gBAChB,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACxB,MAAM,CAAC,IAAI,KAAK,CAAC,8BAA8B,OAAO,IAAI,CAAC,CAAC,CAAC;YAC/D,CAAC,EAAE,OAAO,CAAC,CAAC;YAEZ,iBAAiB;YACjB,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,EAAE;gBACxC,IAAI,CAAC,QAAQ,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;oBACrC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;wBACpB,KAAK,EAAE,YAAY;wBACnB,UAAU,EAAE,EAAE;wBACd,OAAO,EAAE,wBAAwB;qBAClC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC,EAAE,IAAI,CAAC,CAAC;YAET,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBACjC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBACjC,YAAY,CAAC,aAAa,CAAC,CAAC;gBAC5B,aAAa,CAAC,gBAAgB,CAAC,CAAC;gBAEhC,IAAI,QAAQ,EAAE,CAAC;oBACb,OAAO,CAAC,mBAAmB;gBAC7B,CAAC;gBAED,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,KAAK,CAAC,gCAAgC,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC;oBACrE,OAAO;gBACT,CAAC;gBAED,uBAAuB;gBACvB,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;oBACpD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBACxC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;oBAEpD,IAAI,CAAC,OAAO,EAAE,CAAC;wBACb,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;wBAC9C,OAAO;oBACT,CAAC;oBAED,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBACzC,OAAO,CAAC,UAAU,CAAC,CAAC;gBACtB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChB,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC5B,YAAY,CAAC,aAAa,CAAC,CAAC;gBAC5B,aAAa,CAAC,gBAAgB,CAAC,CAAC;gBAChC,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CACvB,WAAmB,EACnB,UAA6B,EAAE,EAC/B,UAAmD;QAEnD,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAClC,CAAC;QAED,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACvD,CAAC;gBAAS,CAAC;YACT,IAAI,UAAU,EAAE,CAAC;gBACf,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
|
@@ -0,0 +1,57 @@
|
|
1
|
+
export interface LibreOfficeInfo {
|
2
|
+
installed: boolean;
|
3
|
+
path?: string;
|
4
|
+
version?: string;
|
5
|
+
error?: string;
|
6
|
+
}
|
7
|
+
export declare class LibreOfficeDetector {
|
8
|
+
private static instance;
|
9
|
+
private cachedInfo?;
|
10
|
+
private constructor();
|
11
|
+
static getInstance(): LibreOfficeDetector;
|
12
|
+
/**
|
13
|
+
* Check if LibreOffice is installed and get its information
|
14
|
+
*/
|
15
|
+
checkLibreOfficeInstallation(): Promise<LibreOfficeInfo>;
|
16
|
+
/**
|
17
|
+
* Detect LibreOffice based on platform
|
18
|
+
*/
|
19
|
+
private detectLibreOffice;
|
20
|
+
/**
|
21
|
+
* Detect LibreOffice on Windows
|
22
|
+
*/
|
23
|
+
private detectWindows;
|
24
|
+
/**
|
25
|
+
* Detect LibreOffice on macOS
|
26
|
+
*/
|
27
|
+
private detectMacOS;
|
28
|
+
/**
|
29
|
+
* Detect LibreOffice on Linux
|
30
|
+
*/
|
31
|
+
private detectLinux;
|
32
|
+
/**
|
33
|
+
* Get LibreOffice version
|
34
|
+
*/
|
35
|
+
private getVersion;
|
36
|
+
/**
|
37
|
+
* Check if file exists
|
38
|
+
*/
|
39
|
+
private fileExists;
|
40
|
+
/**
|
41
|
+
* Check if LibreOffice version meets minimum requirement
|
42
|
+
*/
|
43
|
+
isVersionSupported(version?: string): boolean;
|
44
|
+
/**
|
45
|
+
* Get installation instructions for current platform
|
46
|
+
*/
|
47
|
+
getInstallationInstructions(): string;
|
48
|
+
/**
|
49
|
+
* Get download URL for current platform
|
50
|
+
*/
|
51
|
+
getDownloadUrl(): string;
|
52
|
+
/**
|
53
|
+
* Clear cached LibreOffice info
|
54
|
+
*/
|
55
|
+
clearCache(): void;
|
56
|
+
}
|
57
|
+
//# sourceMappingURL=libreoffice-detector.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"libreoffice-detector.d.ts","sourceRoot":"","sources":["../../src/utils/libreoffice-detector.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAsB;IAC7C,OAAO,CAAC,UAAU,CAAC,CAAkB;IAErC,OAAO;IAEP,MAAM,CAAC,WAAW,IAAI,mBAAmB;IAOzC;;OAEG;IACG,4BAA4B,IAAI,OAAO,CAAC,eAAe,CAAC;IAmB9D;;OAEG;YACW,iBAAiB;IAkB/B;;OAEG;YACW,aAAa;IA0C3B;;OAEG;YACW,WAAW;IAyCzB;;OAEG;YACW,WAAW;IA0CzB;;OAEG;YACW,UAAU;IAUxB;;OAEG;YACW,UAAU;IASxB;;OAEG;IACH,kBAAkB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO;IAW7C;;OAEG;IACH,2BAA2B,IAAI,MAAM;IAoDrC;;OAEG;IACH,cAAc,IAAI,MAAM;IAuBxB;;OAEG;IACH,UAAU,IAAI,IAAI;CAGnB"}
|