From e80fddc75256851226244e020163eedeea70064f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9mence=20Fernandez?= Date: Tue, 16 Sep 2025 16:38:12 +0200 Subject: [PATCH] Fix images aspect with ratio --- package-lock.json | 18 ++++++++++++ package.json | 1 + .../odf/templating/fillOdtElementTemplate.js | 29 ++++++++++++++++--- 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2beaead..2603318 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "@xmldom/xmldom": "^0.9.8", "@zip.js/zip.js": "^2.7.57", + "image-size": "^2.0.2", "ses": "^1.12.0" }, "devDependencies": { @@ -2185,6 +2186,18 @@ "node": ">=10 <11 || >=12 <13 || >=14" } }, + "node_modules/image-size": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", + "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", + "license": "MIT", + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, "node_modules/immutable": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz", @@ -6129,6 +6142,11 @@ "integrity": "sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw==", "dev": true }, + "image-size": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", + "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==" + }, "immutable": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz", diff --git a/package.json b/package.json index 9c9c43a..170c2d0 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "dependencies": { "@xmldom/xmldom": "^0.9.8", "@zip.js/zip.js": "^2.7.57", + "image-size": "^2.0.2", "ses": "^1.12.0" } } diff --git a/scripts/odf/templating/fillOdtElementTemplate.js b/scripts/odf/templating/fillOdtElementTemplate.js index 1cf5649..a03e5f2 100644 --- a/scripts/odf/templating/fillOdtElementTemplate.js +++ b/scripts/odf/templating/fillOdtElementTemplate.js @@ -1,6 +1,7 @@ import {traverse, Node, getAncestors, findCommonAncestor} from "../../DOMUtils.js"; import {closingIfMarker, eachClosingMarker, eachStartMarkerRegex, elseMarker, ifStartMarkerRegex, imageMarkerRegex, variableRegex} from './markers.js' import {isOdfjsImage} from "../../shared.js" +import imageSize from "image-size"; /** @import {OdfjsImage} from "../../types.js" */ /** @@ -810,10 +811,30 @@ export default function fillOdtElementTemplate(rootElements, compartment, addIma newImageNode.setAttribute("draw:mime-type", imageMarker.odfjsImage.mediaType) const newFrameNode = currentNode.ownerDocument?.createElement('draw:frame') - newFrameNode.setAttribute("text:anchor-type", "frame") - newFrameNode.setAttribute("svg:width", "7.28cm") - newFrameNode.setAttribute("svg:height", "10.239cm") - newFrameNode.setAttribute("draw:z-index", "0") + newFrameNode.setAttribute("text:anchor-type", "as-char") + const buffer = new Uint8Array(imageMarker.odfjsImage.content) + + const dimensions = imageSize(buffer) + + const MAX_WIDTH = 10 // cm + const MAX_HEIGHT = 10 // cm + + let width; + let height; + + if(dimensions.width > dimensions.height){ + // image in landscape + width = MAX_WIDTH; + height = width*dimensions.height/dimensions.width + } + else{ + // image in portrait + height = MAX_HEIGHT; + width = height*dimensions.width/dimensions.height + } + + newFrameNode.setAttribute("svg:width", `${width}cm`) + newFrameNode.setAttribute("svg:height", `${height}cm`) newFrameNode.appendChild(newImageNode) currentNode.parentNode?.replaceChild(newFrameNode, currentNode)