Text und Bilder aus PDFs mit /document/extract extrahieren
Ihre Nutzer laden PDFs hoch, doch Ihr Suchindex, Ihre RAG-Pipeline und Ihr Compliance-Archiv brauchen den Text darin. Ergänzen Sie Ihre Assembly um einen Step, der den Text eines PDFs zusammen mit den eingebetteten Bildern zurückgibt, auf Wunsch seitenweise und als JSON. Sie können diese Ergebnisse an Ihre bestehenden Tools weitergeben, ohne einen separaten Extraktionsdienst zu betreiben.
Der Robot 🤖 /document/extract ist allgemein verfügbar.
Was Sie damit entwickeln können
- Suche. Indexieren Sie den Text jeder Seite, damit ein Treffer direkt auf Seite 7 eines Vertrags verlinken kann.
- RAG- und LLM-Pipelines. Seiten eignen sich als natürliche Textabschnitte für Embeddings, und Sie müssen keinen Parsing-Dienst betreiben.
- Compliance-Archive. Bewahren Sie neben jedem Original eine Klartextkopie auf, die Tools zur Aufbewahrung und Recherche lesen können.
- Automatisch ausgefüllte Formulare. Befüllen Sie Felder mit dem Text eines hochgeladenen Dokuments vor. Um benannte Felder wie Rechnungsnummern oder Gesamtbeträge zu extrahieren, geben Sie den Text an ein LLM weiter, wie unsere Pipeline zur intelligenten Dokumentenverarbeitung zeigt.
Da die Extraktion mit einem Robot erfolgt, läuft sie in derselben
Assembly wie Ihre übrige Dateiverarbeitung. Der Upload
trifft ein, 🤖 /document/thumbs rendert eine Vorschau, /document/extract
liest den Text, und ein Robot zum Speichern wie 🤖 /s3/store bewahrt alle drei auf.
Ihre App erhält ein einziges Assembly-Ergebnis, statt separate Dienste koordinieren zu müssen.
Was der Robot extrahiert
- Text aus der Textebene des PDFs. Das ist die Standardeinstellung (
text_method: "native"). Dafür kommt Popplerspdftotextim Layout-Modus zum Einsatz: Das ist schnell, verursacht keine OCR-Gebühren und hält Spalten und Tabellenzeilen durch Leerzeichen ausgerichtet. Wählen Sietext_format"txt"oder"json"sowietext_granularity"document"(ein Ergebnis) oder"page"(ein Ergebnis pro Seite). - Text aus Scans. Mit
text_method: "auto"wird ein PDF ohne Textebene an 🤖 /document/ocr übergeben. Verwenden Sieocr_provider: "gcp"undtext_format: "txt"für den erkannten Text.text_method: "ocr"verwendet immer OCR. - Eingebettete Bilder. Das sind die Rasterbilder im PDF, etwa Fotos, gescannte Abbildungen und
Logos. Identische Bilder werden einmal zurückgegeben (
dedupe_images), und mitmin_image_width,min_image_heightundmin_image_byteskönnen Sie Symbole und Abstandshalter ausschließen.image_formatbehält nach Möglichkeit das eingebettete Format bei oder konvertiert in PNG oder JPEG.
Jedes Extraktionsergebnis enthält meta.document_extract. Es kennzeichnet Text oder Bilder und
bei Text zusätzlich, ob er aus der Textebene oder aus OCR stammt. Native seitenweise Textergebnisse
und Bildergebnisse geben auch ihre Seite an. Dokumentweite Metadaten wie Seitenzahl, Autor und
Erstellungsdatum stehen in meta des Uploads, sofern sie im PDF verfügbar sind.
Der Robot gibt Klartext oder JSON zurück, kein Markdown, und zerlegt Tabellen nicht in Zeilen und
Zellen: Die native Extraktion gibt Überschriften, Listen und Tabellen als Text mit erhaltenem Layout
zurück. Um Markdown als HTML oder PDF zu rendern, verwenden Sie 🤖 /document/convert.
/document/extract rendert ebenfalls keine Seiten; das übernimmt
/document/thumbs.
An einem echten PDF ausprobieren
Wir verwenden das Bitcoin-Whitepaper, ein neunseitiges PDF aus unseren Demo-Eingabedateien. Sie benötigen Node.js 20.10 oder neuer und ein Transloadit-Konto.
mkdir pdf-text && cd pdf-text
npm init -y && npm pkg set type=module
npm install @transloadit/node
curl -fsSLo bitcoin.pdf https://demos.transloadit.com/inputs/bitcoin.pdf
Speichern Sie Ihren Auth Key und Ihr Auth Secret aus der Console in einer Datei namens .env:
TRANSLOADIT_KEY=MY_AUTH_KEY
TRANSLOADIT_SECRET=MY_SECRET_KEY
Diese Assembly Instructions extrahieren den
Text als JSON und rendern in derselben Assembly eine Vorschau von Seite 1. Speichern Sie sie als instructions.json:
{
"steps": {
"text": {
"robot": "/document/extract",
"use": ":original",
"extract": ["text"],
"text_format": "json"
},
"preview": {
"robot": "/document/thumbs",
"use": ":original",
"page": 1,
"width": 600,
"format": "jpg"
}
}
}
Das Skript lädt das PDF hoch, wartet auf die Assembly, lädt das JSON herunter und gibt pro Seite eine Zeile aus:
import { readFile } from 'node:fs/promises'
import { Transloadit } from '@transloadit/node'
const client = new Transloadit({
authKey: process.env.TRANSLOADIT_KEY,
authSecret: process.env.TRANSLOADIT_SECRET,
})
const assembly = await client.createAssembly({
files: { document: './bitcoin.pdf' },
params: JSON.parse(await readFile('./instructions.json', 'utf8')),
waitForCompletion: true,
})
const res = await fetch(assembly.results.text[0].ssl_url)
if (!res.ok) throw new Error(`Could not download the text: HTTP ${res.status}`)
const { pages } = await res.json()
for (const { page, text } of pages) {
const words = text.split(/\s+/).filter(Boolean).length
const firstLine = text.trim().split('\n')[0].replaceAll(/\s+/g, ' ')
console.log(`Page ${page}: ${words} words, starts with "${firstLine.slice(0, 50)}"`)
}
console.log(`Preview of page 1: ${assembly.results.preview[0].ssl_url}`)
$ node --env-file=.env extract.js
Page 1: 461 words, starts with "Bitcoin: A Peer-to-Peer Electronic Cash System"
Page 2: 430 words, starts with "2. Transactions"
Page 3: 526 words, starts with "4. Proof-of-Work"
Page 4: 488 words, starts with "New transaction broadcasts do not necessarily need"
…
Page 9: 159 words, starts with "References"
Preview of page 1: https://…/d650f05c….jpg
Unser Produktionstest mit Node.js 20.10 benötigte etwa 14 Sekunden für Upload und Verarbeitung;
die Dauer variiert. Hier sehen Sie den Anfang der JSON-Datei, die der Step text
erzeugt hat, bitcoin-text.json:
{
"text": " Bitcoin: A Peer-to-Peer Electronic Cash System\n\n …",
"pages": [
{
"page": 1,
"text": " Bitcoin: A Peer-to-Peer Electronic Cash System\n\n … Abstract. A purely peer-to-peer version of electronic cash would allow online\n …"
},
{
"page": 2,
"text": "2. Transactions\nWe define an electronic coin as a chain of digital signatures. …"
}
// … pages 3 to 9
]
}
Auf oberster Ebene enthält text das gesamte Dokument; Seitenvorschubzeichen (\f) trennen die Seiten.
pages liefert denselben Text bereits aufgeteilt, bereit zur Indexierung oder
zur Erstellung von Embeddings pro Seite. Ergebnis-URLs sind temporär. Ergänzen Sie daher einen
Step zum Speichern, wenn Sie die Dateien aufbewahren möchten.
Bilder extrahieren
Die Diagramme im Whitepaper sind Vektorzeichnungen. Deshalb liefert eine Anfrage nach Bildern kein Ergebnis. Ein aus Word exportiertes PDF eignet sich besser als Test. Unsere Demo-Kopie des AWS-Whitepapers Architecting for the Cloud hat 42 Seiten, ein Logo auf jeder Seite und ein einziges Architekturdiagramm:
{
"steps": {
"images": {
"robot": "/document/extract",
"use": ":original",
"extract": ["images"],
"min_image_width": 300
}
}
}
Der Step gibt ein PNG zurück: das Diagramm mit 1.016 × 594 von Seite 17. Vor der Deduplizierung
enthält das PDF 43 Rasterbilder, darunter 42 Kopien des Logos. Transparenzmasken werden standardmäßig
ausgelassen (include_image_masks: false), die Deduplizierung fasst die wiederholten Logos zusammen,
und min_image_width schließt das Logo aus. Setzen Sie include_image_masks: true, wenn Sie auch die separaten Transparenzmasken möchten.
Scans und andere Dokumentformate verarbeiten
Setzen Sie bei einem gescannten Vertrag ohne Textebene text_method auf "auto".
Der Robot greift nur dann auf OCR zurück, wenn die native Extraktion keinen Text findet:
{
"steps": {
"text": {
"robot": "/document/extract",
"use": ":original",
"extract": ["text"],
"text_method": "auto",
"text_format": "txt",
"ocr_provider": "gcp"
}
}
}
Wir haben diese Instructions mit dem Whitepaper und einem neunseitigen Scan davon ausgeführt.
Einschließlich Upload benötigte das Original etwa zwei Sekunden und wurde nativ gelesen. Beim Scan
kam OCR zum Einsatz; er benötigte etwa 12 Sekunden, und sein Ergebnis wurde mit "method": "ocr"
gekennzeichnet. Die Dauer variiert je nach Dokument und Anbieter.
Der Robot liest nur PDFs und überspringt andere Dateien. Konvertieren Sie Uploads aus Word,
PowerPoint oder Excel zunächst mit /document/convert und verweisen Sie mit /document/extract auf diesen Step:
{
"steps": {
"pdf": {
"robot": "/document/convert",
"use": ":original",
"format": "pdf"
},
"text": {
"robot": "/document/extract",
"use": "pdf",
"extract": ["text"],
"text_format": "json"
}
}
}
Grenzen und Preise
page_range(zum Beispiel"1,3-5") beschränkt die Verarbeitung auf die benötigten Seiten und kann bis zu 1.000 Seiten auswählen. Die Ausgabe als JSON oder als Text pro Seite kann höchstens 1.000 ausgewählte Seiten pro Auftrag umfassen.page_rangeundpassword(für verschlüsselte PDFs) gelten für die native Extraktion von Text und eingebetteten Bildern. Die Textausgabe pro Seite erforderttext_method: "native". OCR verarbeitet das gesamte Dokument, lässt sich nicht mit diesen Optionen kombinieren und kann keine verschlüsselten PDFs öffnen."auto"entscheidet pro Dokument, nicht pro Seite. Enthält ein PDF sowohl getippte als auch gescannte Seiten, hat der native Text Vorrang und die gescannten Seiten bleiben leer; verwenden Sie"ocr"für solche Dateien.- Verwenden Sie für OCR-Text
text_format: "txt". Die oben gezeigte JSON-Struktur mittextundpagesgilt für die native Extraktion. - Vektorgrafiken, Diagramme und Seitenhintergründe sind häufig keine eingebetteten Bilder und werden
daher nicht extrahiert. Verwenden Sie dafür
/document/thumbs.
Bei der nativen Extraktion werden Eingabe- und Ausgabebytes auf Ihren Tarif angerechnet, mindestens
jedoch 1 MiB pro Dokument. Der Step text in unserem neunseitigen Beispiel wurde
mit diesem Minimum von 1 MiB angerechnet. Wenn OCR zum Einsatz kommt, fallen zusätzlich Gebühren pro
Seite an; siehe die Preise für /document/ocr.
Loslegen
/document/extract ist für jedes Konto verfügbar. Lesen Sie die
Parameterreferenz, ergänzen Sie ein bereits verwendetes Template um
den Step oder erstellen Sie ein kostenloses Konto und führen Sie das
obige Beispiel aus. Wenn Ihre Dokumente etwas benötigen, das der Robot noch nicht kann,
lassen Sie es uns wissen.
