import * as pdfjsLib from 'pdfjs-dist/legacy/build/pdf.js'; import * as fs from 'fs'; async function analyzeImages(filePath: string) { console.log(`\nLese PDF für Bild-Analyse: ${filePath}`); const dataBuffer = fs.readFileSync(filePath); const loadingTask = pdfjsLib.getDocument({ data: new Uint8Array(dataBuffer) }); const pdfDocument = await loadingTask.promise; // Wir analysieren nur Seite 1 const page = await pdfDocument.getPage(1); const viewport = page.getViewport({ scale: 1.0 }); console.log(`Seitengröße: Breite = ${viewport.width.toFixed(2)}, Höhe = ${viewport.height.toFixed(2)}\n`); const opList = await page.getOperatorList(); // Um die Koordinaten zu berechnen, müssen wir den Grafik-Status (Stack) verfolgen let transformStack: number[][] = [[1, 0, 0, 1, 0, 0]]; // Standard-Matrix let currentTransform = [1, 0, 0, 1, 0, 0]; let imageCount = 0; console.log("--- GEFUNDENE BILDER AUF SEITE 1 ---"); for (let i = 0; i < opList.fnArray.length; i++) { const fn = opList.fnArray[i]; const args = opList.argsArray[i]; // Status speichern (q) if (fn === pdfjsLib.OPS.save) { transformStack.push([...currentTransform]); } // Status wiederherstellen (Q) else if (fn === pdfjsLib.OPS.restore) { if (transformStack.length > 0) { currentTransform = transformStack.pop()!; } } // Transformation anwenden (cm) - In PDFs werden Matrizen multipliziert, // für die einfache Bildanalyse reicht oft der letzte Transform-Befehl vor dem Bild, // da dieser die Skalierung (Breite/Höhe) und Position (X/Y) des 1x1 Pixel Objekts setzt. else if (fn === pdfjsLib.OPS.transform) { currentTransform = args; } // Wenn ein Bild gezeichnet wird! else if ( fn === pdfjsLib.OPS.paintImageXObject || fn === pdfjsLib.OPS.paintInlineImageXObject || fn === pdfjsLib.OPS.paintJpegXObject ) { imageCount++; // In der PDF-Matrix: // currentTransform[0] = Skalierung X (entspricht der Bild-Breite) // currentTransform[3] = Skalierung Y (entspricht der Bild-Höhe) // currentTransform[4] = Position X // currentTransform[5] = Position Y const width = currentTransform[0]; const height = currentTransform[3]; const x = currentTransform[4]; const y = currentTransform[5]; const isPageFilling = (width >= viewport.width - 10 && height >= viewport.height - 10); const mark = isPageFilling ? " <-- SEITENFÜLLENDER SCAN / HINTERGRUND" : ""; console.log(`Bild ${imageCount}:`); console.log(` Position: X = ${x.toFixed(2)}, Y = ${y.toFixed(2)}`); console.log(` Größe: Breite = ${width.toFixed(2)}, Höhe = ${height.toFixed(2)}${mark}`); console.log(` Interner Name: ${args[0]}`); console.log(`--------------------------------------------------`); } } if (imageCount === 0) { console.log("Keine Bilder gefunden. Das Dokument besteht rein aus Vektoren und Text."); } else { console.log(`\nInsgesamt ${imageCount} Bild(er) gefunden.`); } } // Aufruf mit dem Pfad aus den Parametern const args = process.argv.slice(2); const pdfArgIndex = args.indexOf('--pdf'); if (pdfArgIndex !== -1 && args[pdfArgIndex + 1]) { analyzeImages(args[pdfArgIndex + 1]).catch(console.error); } else { console.error("Bitte --pdf Parameter angeben."); }