Copy link to clipboard
Copied
Bonjour,
Dans le cadre d'un projet personnel, je chercher à réaliser un sommaire des images dans un livre de 200 pages (et 450/500 liens). J'aurai besoin d'éditer un fichier texte un liste des lien avec le nom de fichier, sa page, sa position X et sa position Y (afin de déduire l'ordonnancement).
J'ai fait quelques recherches (sur des scripts existants) au préalable mais en vain. Ne sachant pas écrire de script, j'ai interrogé ChatGpt. Cela marche plutôt mais valeurs de PosX et PosY semblent un peu étrange comparé à la réalité de la mise en page.
Est-ce que cela vous paraît cohérent ?
#target indesign
// Fonction pour convertir les points en millimètres
function pointsToMillimeters(points) {
return points * 25.4 / 72;
}
// Fonction principale
function listImageLinks() {
var doc = app.activeDocument; // Récupère le document actif
var imageLinks = []; // Tableau pour stocker les informations des liens
var pages = doc.pages; // Récupère toutes les pages du document
// Parcourt toutes les pages du document
for (var i = 0; i < pages.length; i++) {
var page = pages[i];
var pageItems = page.allPageItems; // Récupère tous les objets de la page
// Parcourt tous les éléments de la page
for (var j = 0; j < pageItems.length; j++) {
var item = pageItems[j];
// Vérifie si l'élément est une image (un graphique avec un lien)
if (item instanceof Image && item.itemLink != null && item.itemLink.isValid) {
var link = item.itemLink; // Récupère le lien de l'image
var fileName = link.name; // Nom du fichier lié
var filePath = link.filePath; // Chemin complet du fichier
var pageNum = page.name; // Numéro de la page
var xPos = pointsToMillimeters(item.geometricBounds[1]); // Position X (gauche) en mm
var yPos = pointsToMillimeters(item.geometricBounds[0]); // Position Y (haut) en mm
var layerIndex = pageItems.length - j; // Calculer l'ordre de positionnement (z-index)
// Enregistre les informations de l'image
imageLinks.push({
fileName: fileName,
filePath: filePath,
page: pageNum,
xPos: xPos,
yPos: yPos,
layerIndex: layerIndex // Ajoute l'ordre de positionnement
});
}
}
}
// Si des liens d'images ont été trouvés
if (imageLinks.length > 0) {
// Création du nom du fichier avec horodatage
var currentDate = new Date();
var timestamp = currentDate.getFullYear() + "-" +
("0" + (currentDate.getMonth() + 1)).slice(-2) + "-" +
("0" + currentDate.getDate()).slice(-2) + "_" +
("0" + currentDate.getHours()).slice(-2) + "-" +
("0" + currentDate.getMinutes()).slice(-2) + "-" +
("0" + currentDate.getSeconds()).slice(-2);
var fileName = "Liens_Images_" + timestamp + ".txt";
// Chemin du fichier sur le bureau
var filePath = "~/Desktop/" + fileName;
var file = new File(filePath);
// Ouvre ou crée le fichier
if (file.open("w")) {
var output = "Nom du fichier | Chemin complet | Page | Position X (mm) | Position Y (mm) | Ordre de Positionnement\n";
output += "---------------------------------------------------------------\n";
// Écrit les résultats dans le fichier
for (var k = 0; k < imageLinks.length; k++) {
var linkInfo = imageLinks[k];
output += linkInfo.fileName + " | " + linkInfo.filePath + " | " + linkInfo.page + " | " + linkInfo.xPos.toFixed(2) + " | " + linkInfo.yPos.toFixed(2) + " | " + linkInfo.layerIndex + "\n";
}
// Enregistre le fichier et le ferme
file.write(output);
file.close();
alert("Les informations des liens d'images ont été enregistrées dans le fichier : " + fileName);
} else {
alert("Impossible d'ouvrir ou de créer le fichier.");
}
} else {
alert("Aucun lien d'image trouvé dans ce document.");
}
}
// Appelle la fonction principale
listImageLinks();
Copy link to clipboard
Copied
Your script assumes that your document's meaurement units are points and converts that value to millimeters. But if your document's units are millimeters, then the x and y positions are reported wrong.
If that's the problem, there are three different ways to fix this:
1. Set your document's measurement units to points
2. Add this line below the line var doc = app.activeDocument:
app.scriptPreferences.measurementUnit = MeasurementUnits.POINTS;
3. Ideally, change these two lines:
var xPos = pointsToMillimeters(item.geometricBounds[1]); // Position X (gauche) en mm
var yPos = pointsToMillimeters(item.geometricBounds[0]); // Position Y (haut) en mm
as follows:
var xPos = item.geometricBounds[1]; // Position X (gauche) en mm
var yPos = item.geometricBounds[0]; // Position Y (haut) en mm
P.
Copy link to clipboard
Copied
Thanks you for your reply, Peter. I will watch.