88 lines
3.6 KiB
TypeScript
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.");
|
|
} |