diff --git a/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/imageDocx.tsx b/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/imageDocx.tsx index 8fa3848e..e5c244dd 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/imageDocx.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/imageDocx.tsx @@ -22,9 +22,13 @@ export const blockMappingImageDocx: DocsExporterDocx['mappings']['blockMapping'] let pngConverted: string | undefined; let dimensions: { width: number; height: number } | undefined; + if (!blob.type.includes('image')) { + return []; + } + if (blob.type.includes('svg')) { const svgText = await blob.text(); - pngConverted = await convertSvgToPng(svgText); + pngConverted = await convertSvgToPng(svgText, block.props.previewWidth); const img = new Image(); img.src = pngConverted; await new Promise((resolve) => { diff --git a/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/imagePDF.tsx b/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/imagePDF.tsx index 134bf391..a5551b48 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/imagePDF.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/imagePDF.tsx @@ -13,9 +13,13 @@ export const blockMappingImagePDF: DocsExporterPDF['mappings']['blockMapping'][' const blob = await exporter.resolveFile(block.props.url); let pngConverted: string | undefined; + if (!blob.type.includes('image')) { + return ; + } + if (blob.type.includes('svg')) { const svgText = await blob.text(); - pngConverted = await convertSvgToPng(svgText); + pngConverted = await convertSvgToPng(svgText, block.props.previewWidth); } return ( diff --git a/src/frontend/apps/impress/src/features/docs/doc-export/utils.ts b/src/frontend/apps/impress/src/features/docs/doc-export/utils.ts index bdebc052..77bdf93b 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-export/utils.ts +++ b/src/frontend/apps/impress/src/features/docs/doc-export/utils.ts @@ -23,16 +23,37 @@ export function downloadFile(blob: Blob, filename: string) { * @param svgText - The SVG text to convert * @returns The PNG data URL */ -export async function convertSvgToPng(svgText: string) { +export async function convertSvgToPng(svgText: string, width: number) { // Create a canvas and render the SVG onto it const canvas = document.createElement('canvas'); - const ctx = canvas.getContext('2d'); + const ctx = canvas.getContext('2d', { + alpha: true, + }); if (!ctx) { throw new Error('Canvas context is null'); } + // Parse SVG to get original dimensions + const parser = new DOMParser(); + const svgDoc = parser.parseFromString(svgText, 'image/svg+xml'); + const svgElement = svgDoc.documentElement; + + // Get viewBox or fallback to width/height attributes + let height; + const svgWidth = svgElement.getAttribute?.('width'); + const svgHeight = svgElement.getAttribute?.('height'); + const viewBox = svgElement.getAttribute('viewBox')?.split(' ').map(Number); + + const originalWidth = svgWidth ? parseInt(svgWidth) : viewBox?.[2]; + const originalHeight = svgHeight ? parseInt(svgHeight) : viewBox?.[3]; + if (originalWidth && originalHeight) { + const aspectRatio = originalHeight / originalWidth; + height = Math.round(width * aspectRatio); + } + const svg = Canvg.fromString(ctx, svgText); + svg.resize(width, height, true); await svg.render(); return canvas.toDataURL('image/png');