Konvertieren Sie eine PPTX -Datei in HTML oder PDF in Express JS [geschlossen]HTML

HTML-Programmierer
Anonymous
 Konvertieren Sie eine PPTX -Datei in HTML oder PDF in Express JS [geschlossen]

Post by Anonymous »

Ich versuche, eine PPTX -Datei in INT HTML oder PDF
zu konvertieren. Die Datei wird in einem Puffer gespeichert, der den binären Inhalt einer ZIP -Datei darstellt. Ein Bild wäre hilfreich.

Code: Select all

   else if (['.ppt', '.pptx'].includes(fileExtension)) {
console.log('Triggered: PPTX Processing');
if (!Buffer.isBuffer(decryptedBuffer)) {
console.error("Invalid buffer: Not a Buffer instance");
return res.status(400).json({ error: "Invalid PPTX buffer" });
}
const extractSlidesFromPPTX = (buffer) => {
return new Promise((resolve, reject) => {
yauzl.fromBuffer(buffer, { lazyEntries: true }, async (err, zipFile) => {
if (err) return reject("Invalid PPTX file: " + err.message);
let slides = [];
zipFile.readEntry();
zipFile.on('entry', (entry) => {
if (entry.fileName.startsWith('ppt/slides/slide') && entry.fileName.endsWith('.xml')) {
zipFile.openReadStream(entry, async (err, readStream) => {
if (err) return reject("Failed to read slide: " + err.message);
const chunks = [];
readStream.on('data', (chunk) => chunks.push(chunk));
readStream.on('end', async () => {
slides.push(Buffer.concat(chunks).toString()); // Store XML content
zipFile.readEntry();
});
});
} else {
zipFile.readEntry();
}
});

zipFile.on('end', () => resolve(slides));
});
});
};
const extractImagesFromPPTX = (buffer) => {
return new Promise((resolve, reject) => {
yauzl.fromBuffer(buffer, { lazyEntries: true }, async (err, zipFile) => {
if (err) {
return reject("Invalid PPTX file: " + err.message);
}
let images = [];
zipFile.readEntry();
zipFile.on('entry', (entry) => {
if (entry.fileName.startsWith('ppt/media/')) {
zipFile.openReadStream(entry, async (err, readStream) => {
if (err) return reject("Failed to read image: " + err.message);
const chunks = [];
readStream.on('data', (chunk) => chunks.push(chunk));
readStream.on('end', async () => {
const imageBuffer = Buffer.concat(chunks);
images.push(imageBuffer);
zipFile.readEntry();
});
});
} else {
zipFile.readEntry();
}
});
zipFile.on('end', () => resolve(images));
});
});
};
const renderSlidesAsImages = async (slides) => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
let renderedImages = [];

for (const slideXML of slides) {
await page.setContent(`



${slideXML.replace(/]+>/g, ' ')}



`);

const imageBuffer = await page.screenshot({ type: 'png' });
renderedImages.push(imageBuffer);
}

await browser.close();
return renderedImages;
};
const isPNG = (buffer) => {
return buffer.length > 8 &&
buffer[0] === 0x89 && buffer[1] === 0x50 && buffer[2] === 0x4E && buffer[3] === 0x47 &&
buffer[4] === 0x0D && buffer[5] === 0x0A && buffer[6] === 0x1A && buffer[7] === 0x0A;
};
const isJPEG = (buffer) => {
return buffer.length > 2 && buffer[0] === 0xFF && buffer[1] === 0xD8;
};
const resizeToA4 = (width, height) => {
const A4_WIDTH = 595; // A4 width in points
const A4_HEIGHT = 842; // A4 height in points
const aspectRatio = width / height;
if (width > A4_WIDTH || height > A4_HEIGHT) {
if (aspectRatio >  A4_WIDTH / A4_HEIGHT) {
width = A4_WIDTH;
height = width / aspectRatio;
} else {
height = A4_HEIGHT;
width = height * aspectRatio;
}
}
return { width, height };
};
try {
const slides = await extractSlidesFromPPTX(decryptedBuffer);
const images = await extractImagesFromPPTX(decryptedBuffer);
const renderedSlides = await renderSlidesAsImages(slides);
const allImages = renderedSlides.concat(images);
for (const imgBuffer of allImages) {
try {
let img;
if (isPNG(imgBuffer)) {
img = await pdfDoc.embedPng(imgBuffer);
} else if (isJPEG(imgBuffer)) {
img = await pdfDoc.embedJpg(imgBuffer);
} else {
console.warn("Unsupported image format. Skipping image.");
continue;
}
const { width, height } = img.scale(1); // Get original dimensions
const { width: resizedWidth, height: resizedHeight } = resizeToA4(width, height);
const page = pdfDoc.addPage([595, 842]);
currentPageNumber++;
const x = (595 - resizedWidth) / 2;
const y = (842 - resizedHeight) / 2;
page.drawImage(img, {
x,
y,
width: resizedWidth,
height: resizedHeight,
});
} catch (error) {
console.error("Error embedding image into PDF:", error);
continue; // Skip invalid images
}
}
console.log('PPTX slides and images successfully added to PDF!');
} catch (error) {
console.error("Error processing PPTX:", error);
return res.status(500).json({ error: error.message });
}
}
Also jetzt für jede Folie wird nur die Texte extrahiert. Ich möchte wirklich, dass ich alle Inhalte von jeder Folie zusammen mit Tabellen, Diagrammenbildern und allen anderen Inhalten in der PDF befindet.>

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post