Zum Hauptinhalt springen

PDF4me JavaScript SDK Erste Schritte

Der pdf4me Paket auf npm ist der offizielle TypeScript/JavaScript ESM Kunde für den PDF4me REST APIEs bietet 106 Aktionen in 18 Modulen: Konvertieren, optimieren, zusammenführen, aufteilen, stempeln und Inhalte aus Dokumenten extrahieren mit asynchronen Funktionen und typisierten Ergebnissen. Die Typen sind im Paket enthalten, TypeScript Projekte benötigen keine separate @types installieren.

Verpackungsinformationen​

FeldWert
Paketnamepdf4me
Aktuelle Version10.0.1 (veröffentlicht am 14.09.2026)
LizenzMIT
Node.js Unterstützung>=22, erklärt in engines
ModulformatESM nur ("type": "module")
TypenGebündelt (dist/index.d.ts)
NebenwirkungenKeine ("sideEffects": false)
Aktionen106 über 18 Import-Unterpfade
LaufzeitabhängigkeitenFünf Microsoft Kiota Pakete (Abstraktionen plus die JSON(Formular-, Text- und Multipart-Serialisierer)
Quellegithub.com/pdf4me/pdf4me-clientapi-javascript
npmnpmjs.com/package/pdf4me

Voraussetzungen​

  • Node.js 22 oder neuer.
  • A PDF4me Konto und API Schlüssel.
  • Ein Projekt, das verwendet werden kann ESM import Syntax ("type": "module" in Ihrem package.json, oder .mjs Dateien).

Installieren​

npm install pdf4me@^10

Der ^10 Die Reichweite ist wichtig. ^9 Abhängigkeitsbereich wird nicht Installieren Sie Version 10 separat, da es sich um eine Neuentwicklung mit inkompatiblen Änderungen handelt. Siehe Upgrade von 9.x unten.

:::Warnung Node.js 22 ist erforderlich, aber npm Es werden lediglich Warnungen ausgesprochen. engines erklärt node: ">=22"und standardmäßig npm Gibt bei einer Abweichung eine Warnung anstelle eines Fehlers aus. Ein noch laufendes Projekt. Node.js Version 10 lässt sich mit Schritt 18 zwar erfolgreich installieren, schlägt dann aber zur Laufzeit fehl. Überprüfen Sie dies. node --versionvor dem Versand. :::

Um mit einem Quellcode-Checkout anstatt mit der Registry zu arbeiten, führen Sie Folgendes aus: npm install Und npm run build im Paketverzeichnis dann ausführen npm install /absolute/path/to/pdf4me aus Ihrem Anwendungsverzeichnis.

Authentifizieren​

Stellen Sie Ihre API Schlüsselelement in der Umwelt:

export PDF4ME_API_KEY="your-api-key"

Der Client sendet den Schlüssel als Authorization: Basic <apiKey> Bei jeder Anfrage wird ein Header gesendet. Die Bibliothek protokolliert weder Anmeldeinformationen noch Dokumentinhalte. Das Erstellen eines Clients mit einem leeren Schlüssel löst eine Ausnahme aus. TypeError sofort, vor jedem Netzwerkanruf.

Schnellstart​

Speichern Sie dies unter optimize-pdf.mjs und setze ein input.pdf im selben Arbeitsverzeichnis. Das Beispiel lädt die Datei hoch. PDF zur Optimierung und speichert das Ergebnis als optimized.pdfDie

import { readFile, writeFile } from "node:fs/promises";
import { Pdf4meClient } from "pdf4me";
import { optimize } from "pdf4me/optimize";

const apiKey = process.env.PDF4ME_API_KEY;
if (!apiKey) {
throw new Error("Set PDF4ME_API_KEY before running this example.");
}

const client = new Pdf4meClient(apiKey);
const data = await readFile("input.pdf");
const result = await optimize(client, data, { docName: "input.pdf" });
await writeFile("optimized.pdf", result);
console.log("Saved optimized.pdf");

Führen Sie es aus mit:

node optimize-pdf.mjs

Die gleichen Importe funktionieren in TypeScript ESM Projekte, wobei die Typen im Paket enthalten sind.

Drei Dinge, die man beachten sollte:

  1. Ein Kunde, viele Aktionen. new Pdf4meClient(apiKey) enthält die Konfiguration. fetch besitzt den Verbindungspool, daher gibt es keinen close() Methode zum Aufrufen und nichts zum Freigeben, wenn Sie fertig sind.
  2. Aktionen sind eigenständige Funktionen, keine Clientmethoden. Jedes Element wird aus seinem eigenen Unterpfad importiert (pdf4me/optimize, pdf4me/merge-split, pdf4me/editund genannt als action(client, source, options)Die
  3. Die Argumentreihenfolge ist festgelegt. Wiederverwendbarer Client zuerst, Quellinhalt als nächstes, wenn die Aktion eine solche ausführt, und zuletzt ein Optionsobjekt.

Was das Paket-Root-Element exportiert​

Der Wurzel-Unterpfad (pdf4me) enthält den Client und seine unterstützenden Typen. Aktionen werden hier niemals ausgeführt.

ExportArtZweck
Pdf4meClientKlasseHält die API Schlüssel- und Transporteinstellungen; werden als erstes Argument an jede Aktion übergeben
Pdf4meExceptionKlasseWird ausgelöst, wenn der Dienst einen Fehler zurückgibt.
Pdf4meTimeoutErrorKlasseWird ausgelöst, wenn ein Zeitlimit für eine Anfrage oder einen Auftrag erreicht ist.
Pdf4meClientOptionsTypDas vom Client-Konstruktor akzeptierte Optionen-Objekt
DocumentSourceTypUint8Array | string — die akzeptierte Form des Quellinhalts
DEFAULT_BASE_URLKonstantehttps://api.pdf4me.com
DEFAULT_TIMEOUTKonstante100000
DEFAULT_MAX_WAITKonstante300000
DEFAULT_POLL_INTERVALKonstante10000

Anfragen und Ergebnisse​

Jede Aktion wird übermittelt isAsync: true und wartet auf das Endergebnis. Ein sofortiger HTTP 200 Rückgaben sofort. Ein HTTP 202 gibt eine Job-ID zurück, die der Client dann abfragt bei GetActionStatus bis der Job abgeschlossen ist. Ihr Code sieht einen await So oder so.

Was Sie weitergeben​

DocumentSource Ist Uint8Array | string, das vier praktische Formen umfasst:

QuellformularAnmerkungen
Uint8ArrayBeinhaltet Node.js Bufferwelche Unterklassen Uint8ArrayDie Bytes werden für Sie Base64-kodiert, und zwar in begrenzten Blöcken, damit große Dokumente den Stack nicht überlaufen.
Base64-ZeichenketteGing direkt durch.
pdf4meblobid://...Ein Verweis auf bereits vorhandene Inhalte PDF4meDie
URLDer Dienst ruft das Dokument selbst ab.

Leere Inhalte werden lokal mit einem Fehler abgelehnt. TypeError anstatt gesendet zu werden.

Aktionen mit mehreren Eingaben akzeptieren geordnete Arrays. addAttachmentToPdf ist die Ausnahme: Es benötigt einen attachments Objektzuordnung von Dateinamen zu Inhalten.

Was Sie zurückbekommen​

ErgebnisartTypBeispiel
DateiaktionenUint8ArrayDirekt akzeptiert von Node.js writeFile
JSON AktionenTypisierte ModelleDocMetadata, SplitPdfRes

Modelle und Enum-Konstanten werden sowohl aus dem eigenen Modul der Aktion als auch aus dem exportiert. pdf4me/models Unterpfad. Unbekannte Antwortfelder werden beibehalten in additionalDataalso ein neueres API Das Spielfeld wird niemals stillschweigend fallen gelassen.

Zwei weitere Anrufe​

import { merge } from "pdf4me/merge-split";
import { stamp, StampAlignX } from "pdf4me/edit";

const merged = await merge(client, [firstPdf, secondPdf]);
const stamped = await stamp(client, merged, {
text: "DRAFT",
alignX: StampAlignX.Center,
});

StampAlignX.Center ist eine typisierte Konstante, daher vervollständigt Ihr Editor automatisch die zulässigen Werte und tsc erkennt Tippfehler, bevor die Anfrage überhaupt gesendet wird.

Optionen und Standardeinstellungen​

Alle Optionsschnittstellen werden exportiert, zum Beispiel OptimizeOptionsZwei Verhaltensweisen sind es wert, bekannt zu sein:

  • Standardwerte werden angewendet, wenn eine Option ausgewählt ist. abwesendDas Standard-Optimierungsprofil ist MaxEine explizite null tut nicht Wählen Sie einen Standardwert.
  • Jede Handlung akzeptiert extra, ein Objekt, das als zusätzliche Anforderungsfelder serialisiert wird. Verwenden Sie die APIeigene Feldnamen verwenden und Schlüssel vermeiden, die die Aktionsoptionen bereits bereitstellen.

Clientkonfiguration​

const client = new Pdf4meClient(apiKey, {
baseUrl: "https://api.pdf4me.com",
timeout: 100_000,
maxWait: 300_000,
pollInterval: 10_000,
});
Alle Zeitangaben sind in Millisekunden.

Die Python Der Client benötigt für dieselben Einstellungen Sekunden. Wenn Sie Code zwischen den beiden Systemen portieren. SDKs, alle Dauer neu skalieren.

OptionStandardWas es begrenzt
baseUrlhttps://api.pdf4me.comDer API Jede Anfrage wird an den Host gesendet
timeout100000 MSJede einzelne Anfrage, einschließlich des Lesens ihres Inhalts
maxWait300000 MSAbfragen nach der ersten Auftragsübermittlung, einschließlich Anfragen zum Status während des laufenden Auftrags
pollInterval10000 MSDie Ausfalllücke zwischen Statusprüfungen
fetchglobalThis.fetchEin benutzerdefinierter Transport, nützlich für Test- oder Proxy-Konfigurationen

Jeder Standardwert wird auch als Konstante exportiert (DEFAULT_TIMEOUT und Freunde), sodass Sie vom Lieferwert ausgehen können, anstatt eine Zahl fest zu codieren.

Der Konstruktor prüft die übergebenen Daten:

  • baseUrl muss ein http: oder https: URL ohne Anmeldeinformationen, Abfragezeichenfolge oder Fragment. Alles andere löst eine Ausnahme aus. TypeErrorDie
  • timeout, maxWait, Und pollInterval muss jeweils eine positive, endliche Anzahl von Millisekunden sein, die nicht größer ist als 2147483647Alles andere führt zu einem Fehler. RangeErrorDie

Numerisch und HTTP-Datum Retry-After Die vom Dienst bereitgestellten Werte steuern die Abfragefrequenz; pollInterval wird nur verwendet, wenn der Dienst keine Abfrage sendet. Wenn die nächste Abfrage nach dem maxWait Nach Ablauf der Frist gibt der Kunde sofort auf, anstatt erst das restliche Budget aufzubrauchen.

:::Achtung: Weiterleitungen werden abgelehnt Der Client setzt redirect: "error"Wenn Sie den Datenverkehr über einen Proxy leiten, der mit einer 3xx-Adresse antwortet, weisen Sie darauf hin baseUrlam endgültigen Zielort, anstatt sich darauf zu verlassen, dass der Weiterleitung gefolgt wird. :::

Fehler​

GeworfenWann
Pdf4meExceptionDer Dienst meldete einen Fehler. message, responseStatusCode, traceId, Und responseHeadersDie
Pdf4meTimeoutErrorEine Frist für die Anfrage (timeout) oder eine zeitliche Begrenzung des Auftrags (maxWaitwurde erreicht.
TypeErrorUngültige lokale Eingabe: ein leerer Eintrag API Schlüssel, ein schlechter baseUrloder leerer Dokumentinhalt.
RangeErrorEine Laufzeitoption außerhalb des zulässigen Bereichs.
Normal ErrorEine 202, deren Wanne keine brauchbaren Teile enthielt jobIdoder ein JSON Aktion, die ein leeres Ergebnis lieferte.
NetzwerkfehlerVermehrt von fetch unverändert.

Pdf4meException.message stammt aus den eigenen Daten des Dienstes. message Feld, falls vorhanden, ansonsten auf das zurückgreifen HTTP Status-Text. Zitieren Sie den traceId Wenn Sie den Support kontaktieren, wird der genaue Vorgang auf der Serviceseite identifiziert.

import { Pdf4meException, Pdf4meTimeoutError } from "pdf4me";
import { optimize } from "pdf4me/optimize";

try {
const result = await optimize(client, data, { docName: "input.pdf" });
} catch (error) {
if (error instanceof Pdf4meTimeoutError) {
// The job exceeded maxWait. Retry, or raise maxWait for large documents.
} else if (error instanceof Pdf4meException) {
console.error(error.responseStatusCode, error.traceId);
} else {
throw error;
}
}

Die 18 Module​

Jedes Modul hat seinen eigenen Import-Unterpfad, sodass Bundler und Editoren nur das laden, was Sie benötigen. Die Paketeinstellungen "sideEffects": false, wodurch Bundler ungenutzte Module vollständig entfernen können.

Einige Aktionen befinden sich in einem Modul, dessen Name es vielleicht nicht vermuten lässt – OCR ist in find-search, PDF/A Die Schöpfung ist in convert, Und pdf4me Enthält eine einzelne Hyperlink-Aktion. Die folgende Tabelle listet alle exportierten Aktionen auf, sodass Sie nicht raten müssen.

Unterpfad importierenAktionenExportierte Funktionen
pdf4me/ai-document-extraction14aiDocumentParser, processBankCheque, processBankStatement, processContract, processCreditCard, processHealthCard, processInvoice, processMarriageCertificate, processMortgageDocument, processOrder, processPayStub, processReceipt, processShippingLabel, processTaxDocument
pdf4me/barcode7addBarcode, createBarcode, createSwissQrBill, readBarcodes, readSwissQrBill, createEpcQrCode, readBarcodesFromImage
pdf4me/convert13convertHtmlToPdf, convertJsonToExcel, convertMdToPdf, convertPdfToExcel, convertPdfToPowerpoint, convertPdfToWord, convertToPdf, convertUrlToPdf, convertVisio, convertWordToPdfForm, createPdfA, flattenPdf, linearizePdf
pdf4me/edit7addAttachmentToPdf, addHtmlHeaderFooter, imageStamp, addMargin, addPageNumber, stamp, signPdf
pdf4me/excel1findAndReplaceTextInExcel
pdf4me/extract8classifyDocument, extractAttachmentFromPdf, extractPdfFormData, extractResources, extractTableFromPdf, extractTextByExpression, extractTextFromWord, parseDocument
pdf4me/find-search2findAndReplace, convertOcrPdf
pdf4me/forms2addFormField, fillPdfForm
pdf4me/generate6enableTrackingChangesInWord, generateDocumentSingle, generateDocumentMultiple, getTrackingChangesInWord, replaceTextWithImageInWord, generateDocumentSingleV2
pdf4me/image13addImageWatermarkToImage, addTextWatermarkToImage, compressImage, convertImageFormat, createImages, cropImage, flipImage, getImageMetadata, imageExtractText, removeExifTagsFromImage, resizeImage, rotateImage, rotateImageByExifData
pdf4me/merge-split5merge, mergeOverlay, splitPdf, splitPdfByBarcode, splitByText
pdf4me/optimize1optimize
pdf4me/organize5deleteBlankPages, deletePages, extractPages, rotate, rotatePage
pdf4me/pdf16getPdfMetadata, repairPdf, createHyperlinkAnnotation, deleteHyperlinkAnnotation, digitalSignPdf, extractHyperlinkAnnotation, getDocumentByText, getTextAndCoordinates, getTextByPosition, highlightText, mergeV3, prepareForPrint, replaceTextWithImage, resizePdf, setPdfMetadata, signDocument
pdf4me/pdf4me1updateHyperlinkAnnotation
pdf4me/security2protect, unlock
pdf4me/word2disableTrackingChangesInWord, findAndReplaceTextInWord
pdf4me/zugferd1createZugferdInvoice

Neben den Aktionsmodulen befinden sich zwei weitere Unterpfade: das Paketstammverzeichnis (pdf4me), wie oben beschrieben, und pdf4me/models, wodurch jedes Modell und jede Enum-Konstante erneut exportiert wird.

Die Parameter und die Antwortform jeder Aktion finden Sie unter PDF4me REST API Referenz oder die generierten Typdeklarationen in node_modules/pdf4me/dist/Die

Upgrade von 9.x​

Version 10 ist eine Neuentwicklung. Um auf der 9.x-Reihe zu bleiben, pinnen Sie die entsprechende Datei an. pdf4me@^9.10.15Die

Zwei Änderungen führen zu Problemen auf jeder Anrufseite​

Sie werden diese Fehler sofort bemerken, denn nichts lässt sich kompilieren oder ausführen, bis sie behoben sind.

1. ESM nur. require("pdf4me") Das Problem lässt sich nicht mehr lösen. Verwenden Sie importDie

2. Ein Client plus eigenständige Aktionen. pdf4me.createClient(key), das ein einzelnes Objekt mit Methoden zurückgab, wird ersetzt durch new Pdf4meClient(key) plus Aktionsfunktionen, die aus Unterpfaden importiert und aufgerufen werden als action(client, source, options)Die

// 9.x
const pdf4me = require("pdf4me");
const client = pdf4me.createClient(key);
const result = await client.optimize(/* ... */);

// 10
import { Pdf4meClient } from "pdf4me";
import { optimize } from "pdf4me/optimize";
const client = new Pdf4meClient(key);
const result = await optimize(client, data, { docName: "input.pdf" });

Drei Änderungen lassen sich kompilieren und ausführen, verhalten sich aber fehlerhaft.​

Diese müssen manuell überprüft werden, denn nichts wird Ihnen sagen, ob sie falsch sind.

1. Binäre Ergebnisse sind Uint8Array, nicht BufferDie Buffer Unterklassen Uint8Array, Also writeFile Und Freunde arbeiten immer noch. Aber Buffer-nur Methoden erzeugen stillschweigend Unsinn, anstatt eine Fehlermeldung auszulösen:

result.toString("base64"); // 9.x: base64. 10: "0,255,65,128"
Buffer.from(result).toString("base64"); // do this instead

2. Jede Aktion wird befragt. Version 10 reicht ein isAsync: true und Umfragen, bis der Auftrag abgeschlossen ist, sodass ein Anruf, der ursprünglich nur eine Hin- und Rückreise erforderte, nun bis zu maxWait (Standard 300000 ms) und kann werfen Pdf4meTimeoutError — ein Fehlermodus, den Version 9.x nicht hatte.

3. Weiterleitungen werden abgelehnt. Version 9.x folgte ihnen; Version 10 setzt redirect: "error"Wenn Sie den Datenverkehr über einen Proxy leiten, der 3xx-Anfragen beantwortet, weisen Sie darauf hin baseUrl am endgültigen Zielort.

Ebenfalls wissenswert​

  • Node.js 22 ist nun erforderlich und wird deklariert in engines, Aber npm Standardmäßig wird nur bei einer Nichtübereinstimmung eine Warnung ausgegeben.
  • Thumbnail-Erstellung (createThumbnail / createThumbnails) Und PDF/A Validierung (validate / validateDocument) haben Es gibt keine entsprechende Version 10.weil die v2 API setzt sie nicht aus.
  • Die Lizenz änderte sich von ISC Zu MITDie

Die vollständige Methoden-für-Methoden-Zuordnung, einschließlich Umbenennungen und der integrationConfig Ersatzteil wird mit dem Paket geliefert. Mehr dazu unter node_modules/pdf4me/MIGRATION.md nach der Installation.

Fehlerbehebung​

Error [ERR_REQUIRE_ESM] oder require() of ES Module ... not supportedDie Version 10 ist ESM Nur hinzufügen. "type": "module" zu Ihrem package.json, benennen Sie die Einstiegsdatei um in .mjsoder Anstecknadel pdf4me@^9.10.15 wenn das Projekt nicht vorankommt CommonJS noch.

ERR_MODULE_NOT_FOUND für pdf4me/optimizeDie Subpfad-Importe werden über das Paket aufgelöst exports Karte, die eine einigermaßen aktuelle Node.js und Bundler. Bestätigen node --version Berichte 22 oder neuer, und dass Sie den Unterpfad genau so importieren, wie er in der Modultabelle angegeben ist (zum Beispiel pdf4me/merge-split(mit Bindestrich).

Die Base64-Ausgabe sieht folgendermaßen aus: "0,255,65,128"Die Du hast angerufen .toString("base64") auf einem Uint8ArrayZuerst einwickeln: Buffer.from(result).toString("base64")Die

Pdf4meTimeoutError bei großen Dokumenten. Die Aufgabe wurde übertroffen maxWait, was standardmäßig auf 300000 Frau [Name], sprechen Sie das Thema beim Kunden an, zum Beispiel new Pdf4meClient(apiKey, { maxWait: 900_000 })und bestätigen timeout ist noch groß genug, um den Antworttext zu lesen. Beachten Sie, dass beide Werte auf einen Maximalwert begrenzt sind. 2147483647 MS.

Ein 401 in Pdf4meException.responseStatusCodeDie Der API Der Schlüssel ist vorhanden, wurde aber abgelehnt. Generieren Sie ihn neu. PDF4me Armaturenbrett und bestätigen, dass die Umgebungsvariable für den Prozess tatsächlich sichtbar ist — set unter Windows CMD wird nicht über Sitzungen hinweg gespeichert, daher verwenden Sie setx für einen dauerhaften Wert.

TypeError: an API key is requiredDie Der Konstruktor erhielt eine leere Zeichenkette oder eine Zeichenkette, die nur aus Leerzeichen bestand, normalerweise weil process.env.PDF4ME_API_KEY war nicht definiert. Überprüfen Sie die Variable, bevor Sie den Client erstellen, wie es in der Schnellstartanleitung beschrieben ist.

TypeError: document content is emptyDie Der Uint8Array Oder die übergebene Zeichenkette ist leer. Dies ist eine lokale Prüfung, es wurde also keine Anfrage gesendet – überprüfen Sie, ob die Datei tatsächlich erfolgreich gelesen wurde.

Anfragen schlagen hinter einem Unternehmensproxy fehl. Die Kundensätze redirect: "error" und folgt nicht den 3xx-Protokollen eines Proxys. baseUrl am endgültigen Bestimmungsort oder liefern Sie eine kundenspezifische fetch das kümmert sich um Ihren Transport.

createThumbnail oder validate wird nicht exportiert. Beide wurden in Version 10 entfernt, da die v2 API Sie werden dadurch nicht offengelegt. Es gibt keinen direkten Ersatz; bleiben Sie bei Version 9.x, wenn Sie darauf angewiesen sind.

Wohin als Nächstes?​