Ein Dokumenten-OCR-Werkzeug mit GCP OCR und Node.js erstellen
Optical Character Recognition (OCR) erschließt Textinhalte in Bildern und PDFs und ermöglicht Funktionen wie durchsuchbare Dokumente, automatisierte Dateneingabe und Inhaltsanalyse. In diesem DevTip erstellen wir mit GCP OCR und Node.js ein Dokumenten-OCR-Werkzeug, um Text effizient aus Bildern und PDFs in Ihren Anwendungen zu extrahieren.
Einführung
GCP OCR basiert auf der Google Cloud Vision API und bietet robuste Funktionen zur Bildanalyse, einschließlich OCR zur Textextraktion. Durch die Integration dieses Dienstes in Ihre Node.js-Anwendung können Sie Bilder und PDFs programmatisch verarbeiten und Textdaten effizient extrahieren.
Diese Anleitung führt Sie durch die Einrichtung der Google Cloud Vision API, die Authentifizierung Ihrer Anwendung und das Schreiben von Node.js-Code, um OCR auf Bildern und PDFs durchzuführen.
Voraussetzungen
Stellen Sie sicher, dass Sie über Folgendes verfügen:
- Ein Konto bei der Google Cloud Platform (GCP)
- Node.js Version 22 oder neuer installiert
- Grundkenntnisse in JavaScript und Node.js
Google Cloud Vision API einrichten
1. Ein GCP-Projekt erstellen
- Rufen Sie die Google Cloud Console auf.
- Klicken Sie auf das Projekt-Drop-down und wählen Sie Neues Projekt.
- Geben Sie einen Projektnamen ein und klicken Sie auf Erstellen.
- Aktivieren Sie die Abrechnung für das Projekt.
2. Die Vision API aktivieren
- Navigieren Sie in der Cloud Console zu APIs und Dienste > Bibliothek.
- Suchen Sie nach Cloud Vision API.
- Klicken Sie auf Cloud Vision API und anschließend auf Aktivieren.
Authentifizierung einrichten
-
Erstellen Sie einen Dienstkontoschlüssel:
- Gehen Sie zu IAM und Verwaltung > Dienstkonten
- Erstellen Sie ein neues Dienstkonto oder wählen Sie ein vorhandenes aus
- Erstellen Sie einen neuen Schlüssel (JSON-Format)
- Laden Sie die JSON-Schlüsseldatei herunter und bewahren Sie sie sicher auf
-
Richten Sie die Authentifizierung in Ihrer Anwendung ein:
const vision = require('@google-cloud/vision') const client = new vision.ImageAnnotatorClient({ keyFilename: 'path/to/your/service-account-key.json', })Oder verwenden Sie Umgebungsvariablen:
export GOOGLE_APPLICATION_CREDENTIALS="path/to/your/service-account-key.json"
Bewahren Sie Schlüsseldateien außerhalb Ihres Repositorys auf. Die folgenden Beispiele verwenden
Application Default Credentials, die auch ein angehängtes Dienstkonto in Google Cloud oder lokale
Zugangsdaten nutzen können, die mit gcloud auth application-default login konfiguriert wurden.
Die Google Cloud Vision Client-Bibliothek installieren
Initialisieren Sie ein neues Node.js-Projekt und installieren Sie die erforderliche Bibliothek:
mkdir ocr-project
cd ocr-project
npm init -y
npm install @google-cloud/vision@4 @google-cloud/storage@7
Den Node.js-Code schreiben
Erstellen Sie in Ihrem Projektverzeichnis eine Datei index.js. Dieses
CommonJS-Beispiel verarbeitet einzelne Bilder; für mehrseitige Dokumente verwenden Sie die separate
PDF/TIFF-Datei-API weiter unten:
// index.js
const vision = require('@google-cloud/vision');
// Creates a client
const client = new vision.ImageAnnotatorClient();
async function extractTextFromImage(imagePath) {
try {
const [result] = await client.textDetection(imagePath);
if (result.error?.code) {
throw Object.assign(new Error('Vision text detection failed', { cause: result.error }), {
code: result.error.code,
});
}
const detections = result.textAnnotations ?? [];
return detections.map(text => text.description);
} catch (error) {
if (error.code === 8) {
console.error('API quota exceeded');
} else if (error.code === 7) {
console.error('Permission denied: check IAM permissions and API enablement');
}
throw error;
}
}
// Example usage
extractTextFromImage('images/sample.jpg')
.then(text => console.log('Extracted text:', text))
.catch(error => {
console.error('OCR failed:', error.message);
process.exitCode = 1;
});
PDF-Dateien verarbeiten
Um Text aus PDFs zu extrahieren, verwenden Sie die asynchrone Batch-Annotation zusammen mit Google
Cloud Storage. Laden Sie die PDF-Datei zunächst in einen privaten Bucket hoch. Die aufrufende
Identität benötigt die Berechtigung, die Eingabe zu lesen, Ausgabeobjekte zu erstellen sowie diese
Ausgaben aufzulisten und zu lesen. Geben Sie für jeden Job ein neues, leeres Ausgabepräfix an, das
auf / endet, damit sich Ergebnisse nicht mit älteren Jobs vermischen
können. Verwenden Sie client von oben erneut:
const { Storage } = require('@google-cloud/storage');
const storage = new Storage();
async function extractTextFromPDF(gcsSourceUri, gcsDestinationUri) {
const destination = /^gs:\/\/([^/]+)\/(.+\/)$/u.exec(gcsDestinationUri);
if (!destination) {
throw new Error('Use a gs://bucket/unique-output-prefix/ destination');
}
const [, bucketName, prefix] = destination;
const inputConfig = {
mimeType: 'application/pdf',
gcsSource: {
uri: gcsSourceUri
}
};
const outputConfig = {
gcsDestination: {
uri: gcsDestinationUri
},
batchSize: 1
};
const features = [{ type: 'DOCUMENT_TEXT_DETECTION' }];
const request = {
requests: [{
inputConfig,
features,
outputConfig,
}]
};
const [operation] = await client.asyncBatchAnnotateFiles(request);
await operation.promise();
// The operation returns output locations; OCR text lives in the JSON objects in Storage.
const [files] = await storage.bucket(bucketName).getFiles({ prefix });
const pages = [];
for (const file of files.filter(file => file.name.endsWith('.json'))) {
const [contents] = await file.download();
const result = JSON.parse(contents.toString('utf8'));
if (result.error?.code) {
throw Object.assign(new Error('PDF file failed', { cause: result.error }), {
code: result.error.code,
});
}
for (const page of result.responses ?? []) {
if (page.error?.code) {
throw Object.assign(new Error('PDF page failed', { cause: page.error }), {
code: page.error.code,
});
}
if (!Number.isInteger(page.context?.pageNumber)) {
throw new Error('PDF result is missing its page number');
}
pages.push({ number: page.context.pageNumber, text: page.fullTextAnnotation?.text ?? '' });
}
}
if (pages.length === 0) throw new Error('Vision returned no PDF pages');
return pages.sort((a, b) => a.number - b.number).map(page => page.text).join('\n');
}
Rufen Sie extractTextFromPDF('gs://your-input-bucket/document.pdf', 'gs://your-output-bucket/unique-job-id/') auf und behandeln Sie das abgelehnte Promise wie im
Bildbeispiel. Verwenden Sie für TIFF-Eingaben image/tiff als MIME-Typ.
Konfigurieren Sie eine Storage-Lifecycle-Richtlinie, die zu Ihren Dokumenten und der OCR-Ausgabe
passt; das Beispiel behält beides bei. Schließen Sie den gemeinsam genutzten Vision-Client mit
await client.close(), nachdem in einer CLI-Anwendung alle Arbeiten abgeschlossen sind.
Die Formate für Anfrage und Ausgabe finden Sie in Googles PDF/TIFF-OCR-Anleitung.
API-Beschränkungen und Preise
- Beschränkung der PDF-Verarbeitung: 2.000 Seiten pro Datei
- Jede PDF/TIFF-Seite zählt für die Abrechnung als einzelnes Bild; fünf Seiten sind fünf Einheiten pro Funktion, selbst wenn sie in einer Anfrage oder Ausgabedatei zusammengefasst sind.
- Prüfen Sie die Preise für Cloud Vision für aktuelle Sätze zu kostenlosem Kontingent und Volumen. Gebühren für Cloud Storage fallen separat an.
Regionale Konfiguration
Für Anforderungen an die Datenresidenz können Sie regionale Endpunkte angeben:
const client = new vision.ImageAnnotatorClient({
apiEndpoint: 'eu-vision.googleapis.com', // European Union
// or 'us-vision.googleapis.com' // United States
})
Fehlerbehebung
Häufige Probleme und Lösungen
-
Authentifizierungsfehler
- Überprüfen Sie den Pfad zur Dienstkonto-Schlüsseldatei
- Stellen Sie sicher, dass das Dienstkonto über die richtigen Berechtigungen verfügt
- Prüfen Sie, ob die API in Ihrem Projekt aktiviert ist
-
Probleme bei der PDF-Verarbeitung
- Vergewissern Sie sich, dass die PDF-Datei nicht mehr als 2.000 Seiten hat
- Überprüfen Sie die Berechtigungen des GCS-Buckets
- Prüfen Sie die Kompatibilität des PDF-Dateiformats
-
Ratenbegrenzung
- Implementieren Sie exponentielles Backoff für Retries
- Überwachen Sie die Kontingentnutzung in der GCP Console
- Erwägen Sie Batch-Verarbeitung für große Volumina
Bewährte Verfahren
-
Fehlerbehandlung
async function processDocument(filePath) { try { const result = await extractTextFromImage(filePath); return result; } catch (error) { if (error.code === 'ENOENT') { throw new Error('File not found', { cause: error }); } if (error.code === 8) { throw new Error('API quota exceeded', { cause: error }); } if (error.code === 7) { throw new Error('Permission denied: check IAM permissions and API enablement', { cause: error, }); } throw error; } } -
Batch-Verarbeitung
async function processBatch(files, concurrency = 3) { if (!Number.isInteger(concurrency) || concurrency < 1) { throw new Error('Concurrency must be a positive integer'); } const results = []; for (let i = 0; i < files.length; i += concurrency) { const batch = files.slice(i, i + concurrency); const batchResults = await Promise.all( batch.map(file => processDocument(file).catch(() => ({ error: 'Image OCR failed' }))) ); results.push(...batchResults); await new Promise(resolve => setTimeout(resolve, 1000)); // Rate limiting } return results; }
Fazit
Die Integration von GCP OCR in Ihre Node.js-Anwendungen ermöglicht leistungsstarke OCR-Funktionen. Indem Sie die Textextraktion aus Bildern und PDFs automatisieren, erweitern Sie die Funktionalität Ihrer Anwendung, straffen Arbeitsabläufe und bieten Ihren Nutzern einen größeren Mehrwert.
Transloadit bietet außerdem einen Document OCR Robot als Teil unseres Dienstes für Künstliche Intelligenz für nahtlose und skalierbare OCR-Verarbeitung.
