Files
ai-bayarea/find_images.ts
2026-07-11 17:08:41 -05:00

88 lines
3.6 KiB
TypeScript

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.");
}