Skip to main content
Glama
test-pdf-creation.jsโ€ข5.04 kB
#!/usr/bin/env node /** * Test script for PDF creation functionality * Creates PDF from markdown string and verifies it */ import { writePdf } from '../dist/tools/filesystem.js'; import fs from 'fs/promises'; import path from 'path'; import { fileURLToPath } from 'url'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const OUTPUT_DIR = path.join(__dirname, 'test_output'); const OUTPUT_FILE = path.join(OUTPUT_DIR, 'created_sample.pdf'); const MODIFIED_FILE = path.join(OUTPUT_DIR, 'modified_sample.pdf'); const SAMPLE_FILE = path.join(__dirname, 'samples', 'Presentation Example.pdf'); const SAMPLE_FILE_MODIFIED = path.join(OUTPUT_DIR, 'Presentation Example Modified.pdf'); async function main() { console.log('๐Ÿงช PDF Creation & Modification Test Suite'); // Ensure output directory exists try { await fs.mkdir(OUTPUT_DIR, { recursive: true }); } catch (e) { // Ignore if exists } // Create a multi-page markdown to allow for meaningful delete operations const markdown = ` # Page 1: Introduction This is the first page of the test PDF. ## Features - Simple text - **Bold text** - *Italic text* (Padding to ensure content...) 1. Item 1 2. Item 2 3. Item 3 # Page 2: Code Section This should be on a new page if the previous content fills the page, but since we don't have explicit page breaks, we'll rely on the structure. Actually, let's just assume this is a single document we will modify. ## Code \`\`\`javascript console.log('Hello World'); console.log('Line 2'); console.log('Line 3'); \`\`\` `; console.log(`\n1. Creating PDF at: ${OUTPUT_FILE}`); try { // writePdf now writes directly to file await writePdf(OUTPUT_FILE, markdown); // Verify creation try { const stats = await fs.stat(OUTPUT_FILE); console.log('โœ… PDF created successfully'); console.log(` File Size: ${stats.size} bytes`); if (stats.size === 0) { throw new Error('Created PDF is empty'); } } catch (e) { console.error('โŒ Failed to verify created PDF:', e); process.exit(1); } // --- Modification Test --- console.log('\n2. Testing PDF Modification (Insert & Delete & Merge)...'); // Create a temporary PDF to merge const tempMergeFile = path.join(OUTPUT_DIR, 'temp_merge.pdf'); await writePdf(tempMergeFile, '# Merged Page\n\nThis page was merged from another PDF file.'); // We will: // 1. Delete page 0 (the first page) // 2. Insert a new cover page at the beginning (from markdown) // 3. Insert an appendix page at the end (from markdown) // 4. Merge the temporary PDF at the very end (from file path) await writePdf(OUTPUT_FILE, [ { type: 'delete', pageIndexes: [0] }, { type: 'delete', pageIndexes: [-1] // Delete the last page. }, { type: 'insert', pageIndex: 0, markdown: '# New Cover Page\n\nThis page was inserted dynamically.\n\n## Summary\nWe deleted the original pages and added this one.' }, { type: 'insert', pageIndex: 1, markdown: '# Appendix\n\nThis page was appended to the end.' }, { type: 'insert', pageIndex: 2, sourcePdfPath: tempMergeFile } ], MODIFIED_FILE); console.log('โœ… PDF modified successfully'); console.log(` Saved to: ${MODIFIED_FILE}`); const modStats = await fs.stat(MODIFIED_FILE); if (modStats.size > 0) { console.log('โœ… Modified PDF is valid (non-empty)'); console.log(` Modified File Size: ${modStats.size} bytes`); } else { console.error('โŒ Modified PDF file is empty'); process.exit(1); } // Cleanup temp file await fs.unlink(tempMergeFile).catch(() => { }); } catch (error) { console.error('โŒ Failed:', error); process.exit(1); } // --- Modification Test --- console.log('\n3. Testing PDF Modification - keep layout...'); await writePdf(SAMPLE_FILE, [ { type: 'insert', pageIndex: 0, markdown: '# New Cover Page\n\nThis page was inserted dynamically.\n\n## Summary\nWe deleted the original pages and added this one.' }, { type: 'insert', pageIndex: 1, markdown: '# Appendix\n\nThis page was appended to the end.' } ], SAMPLE_FILE_MODIFIED); console.log('โœ… PDF modified successfully'); console.log(` Saved to: ${SAMPLE_FILE_MODIFIED}`); } if (import.meta.url === `file://${process.argv[1]}`) { main().catch(console.error); }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/wonderwhy-er/DesktopCommanderMCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server