Wie kann ich eine Datentabelle im PDF-Format in n8n extrahieren? Die Tabelle hat viele Daten.
Hey Azizul,
Ich kann dir dabei helfen, große Tabellen aus PDF-Dateien in n8n mit hoher Genauigkeit zu extrahieren – egal ob die PDFs digital oder gescannt sind – und die Daten in Excel, Google Sheets, Airtable oder deine Datenbank zu strukturieren.
• PDF-Tabellen effizient parsen
• Gescannte PDFs bei Bedarf mit OCR verarbeiten
• Extrahierte Daten bereinigen und strukturieren
• In dein bevorzugtes Ziel exportieren
• Den gesamten Workflow automatisieren
Lass uns einen Termin vereinbaren, um die Details weiter zu besprechen.
Hey Azizul, gerne! Kommt stark drauf an wie deine PDFs aussehen, deshalb erstmal ein paar Fragen:
- Ist die Tabellenstruktur bei allen Dokumenten gleich, oder ändert sich das je nach PDF?
- Sind die PDFs digital erzeugt oder eingescannt?
- Wie viele Dokumente bzw. Zeilen sind das ungefähr, was meinst du genau mit “viele Daten”?
- Wie sensibel sind die Daten?
Je nach Antwort gibt es unterschiedliche Wege. Ein klassischer Weg wäre:
- OCR, Daten auslesen
- Daten aufarbeiten (kann mit einem Script gemacht werden)
- Daten abspeichern
Gerne können wir das auch besprechen: Termin
n8n hat ein eingebautes „Extract from PDF
Danke Loic Lavachy für die E-Mail. Ich habe die PDF-Datei tatsächlich extrahiert, aber beim Senden der Daten ins Blatt war es nur eine Zeile. Ich weiß nicht, warum nicht alle Daten aus der PDF-Tabelle gespeichert werden. Ok, ich gebe eine Antwort: 1. Die Datenstruktur der Tabelle bleibt gleich. 2. Alle PDFs sind digital erstellt. 3. Bitte überprüfe die angehängte Beispieldatei. Die Datei wird gleich sein. Aber nicht viele Daten auf einmal. 4. Wenn die PDF-Datei in bengalischer Sprache ist, was sollte ich tun? Ich habe eine weitere Challan-Beispieldatei angehängt, damit du es besser verstehst.
(Anhänge)
Data.pdf (17,9 KB)
challan.pdf (60,2 KB)
Danke Sachin Karma für deine E-Mail. Ich freue mich zu erfahren, dass du mir helfen kannst. Eigentlich kann ich Daten aus einer PDF-Datentabellendatei mit Mistral extrahieren. Aber wenn ich die Daten dann in ein Sheet speichere, sehe ich nur eine Zeile hinzugefügt und nicht alle. Ich weiß nicht, warum. Ich sende dir eine Beispiel-Datentabellen-PDF-Datei. Bitte überprüfe die angehängte Datei.
Meine andere Frage ist, dass ich noch eine PDF-Datei in bengalischer Sprache habe. Ich habe diese auch beigefügt. Wenn die Datei in bengalischer Sprache ist, was sollte ich tun?
Azizul
Willkommen @Azizul_Khan!
Das Single-Row-Problem tritt fast immer auf, weil Mistral die gesamte Tabelle als ein JSON-Array in einem einzelnen Element zurückgibt, sodass Sheets nur Element 1 sieht. Fügen Sie direkt nach dem Mistral-Node einen Split Out-Node (oder einen Code-Node mit return items) hinzu, um dieses Array-Feld in separate Elemente aufzuteilen – ein Element pro Tabellenzeile – bevor es Google Sheets erreicht. Überprüfen Sie zuerst direkt die JSON-Ausgabe des Mistral-Nodes, um zu bestätigen, dass die Zeilen unter einem Feld wie „rows
Vielen Dank für deine E-Mail, Herr Jay Nguyen. Es tut mir leid, dass ich deinen wertvollen Rat nicht verstanden habe. Ich bin eigentlich neu bei n8n und JSON. Wenn ich ein Video bekommen würde, könnte ich es verstehen. Wenn möglich, könntest du mir ein Beispiel mit Details geben, wie ich alle Rohdaten in ein Sheet bekommen kann, dann könnte ich es versuchen. Ich habe die Beispieldatei angehängt, bitte überprüfe sie.
Azizul.
Hey Azizul,
ich habe mir die PDFs nochmal angeschaut und dir im Anhang einen Beispiel Workflow (JSON) hochgeladen, der eine mögliche Herangehensweise zeigt.
Damit er bei dir läuft, musst du:
- die Credentials selbst anlegen (Google Drive und die LLM, aktuell Mistral)
- den Pfad zum Ordner angeben, in dem die PDFs abgelegt werden
Den Input kannst du natürlich austauschen, zum Beispiel auf einen Formular Upload statt Google Drive. Die LLM kannst du ebenfalls gegen ein anderes Modell tauschen. Voraussetzung ist, dass die PDFs digital erzeugt sind, bei gescannten Dokumenten bräuchte es vorher noch eine OCR Stufe.
Zum bengalischen Beispiel: das Script teilt den Text aktuell nur zeilenweise auf und legt das als JSON ab, das ist noch keine strukturierte Extraktion wie beim englischen Zweig. Müsste noch weiter ausgebaut werden, je nachdem wie die Tabelle dort genau aufgebaut ist.
Allgemein zu PDFs und Datenschutz: Man könnte den ganzen Prozess auch direkt über eine LLM laufen lassen, aber hier sind sensible Daten dabei (Mail und Adresse). Ohne AVV mit einem EU Anbieter und passender Rechtsgrundlage würde ich davon abraten, das ungeprüft in eine LLM zu geben. Da sich Name und Vatername nicht sauber automatisch trennen lassen, gebe ich nur diese beiden Felder an die LLM weiter, was rechtlich trotzdem ein Graubereich bleibt und im Einzelfall geprüft werden sollte.
Für den Feinschliff empfehle ich, mit Claude Code oder einer anderen LLM direkt am Workflow weiterzuarbeiten. Bei Bedarf kannst du mich auch gerne persönlich kontaktieren.
pdf-tin-table-extraction.json (17,3 KB)
Wenn Mistral bereits das PDF extrahiert, aber Google Sheets nur eine Zeile erhält, ist das übliche Problem, dass das Extraktionsergebnis immer noch ein n8n-Element enthält, das eine Tabelle/ein Array darstellt. Google Sheets fügt eine Zeile pro Eingabeelement hinzu, daher benötigst du einen Code-Knoten zwischen Mistral und Sheets, der die extrahierte Tabelle in mehrere Elemente umwandelt.
Für digital erstellte PDFs mit derselben Struktur würde ich diesen Ablauf verwenden:
- Form Trigger / Gmail / Manueller Upload — das PDF-Binär empfangen.
- Mistral OCR / Dokumentenextraktion — Markdown oder Text zurückgeben.
- Code-Knoten — die Markdown-Tabelle analysieren und ein Element pro PDF-Zeile zurückgeben.
- Google Sheets → Zeile anhängen — Spalten von jedem Element zuordnen.
Wenn Mistral eine Markdown-Tabelle wie | name | amount | date | zurückgibt, versuchen Sie diesen Code-Knoten nach dem OCR-Knoten:
const markdown = $json.markdown || $json.text || $json.output || '';
const tableLines = markdown
.split('\n')
.map((line) => line.trim())
.filter((line) => line.startsWith('|') && line.endsWith('|'));
if (tableLines.length < 2) {
throw new Error('No Markdown table found in OCR output');
}
const splitRow = (line) =>
line
.split('|')
.slice(1, -1)
.map((cell) => cell.trim());
const headers = splitRow(tableLines[0]);
const dataRows = tableLines
.slice(1)
.filter((line) => !/^\|?\s*:?-{3,}/.test(line.replace(/\|/g, '').trim()));
return dataRows.map((line) => {
const cells = splitRow(line);
const row = {};
headers.forEach((header, index) => {
row[header || `column_${index + 1}`] = cells[index] || '';
});
return { json: row };
});
Fügen Sie dann in Google Sheets mithilfe von Feldern aus dem eingehenden Element ein. Legen Sie nicht das gesamte OCR-Ergebnis in eine Zelle, und wrappen Sie nicht alle Zeilen in einem einzigen rows-Array, es sei denn, du splittest es vorher erneut vor Sheets.
Für Bangla-PDFs: Wenn das PDF digital generiert/wählbarer Text ist, sollte Bangla als Unicode durchgeleitet werden und in Google Sheets gut gespeichert werden. Wenn es gescannt/bildbasiert ist, verwende einen OCR-Anbieter mit Bangla-Sprachunterstützung oder Sprachanweisungen, und führe dann denselben „eine extrahierte Zeile = ein n8n-Element
Vielen Dank für deine E-Mail. Ja, Mistral gibt eine Markdown-Tabelle wie | name | amount | date | zurück. Soll ich diesen Code in den Extract Information Node in n8n einfügen? Oder wo soll ich den Code einfügen?
Hallo Azizul,
Danke für die Beispiele; sie haben die Probleme deutlich gemacht.
Zwei Antworten:
- Nur eine Zeile wird gespeichert
Das ist kein Mistral-Problem — deine Extraktion funktioniert eigentlich; Mistral liest die vollständige Tabelle. Das Problem liegt bei dem Schritt, der in Google Sheets schreibt. Momentan kommen alle Zeilen zusammen als EIN Element an, daher wird der Schritt „Zeile hinzufügen