Aller au contenu principal
PPDF123

@pdf123/sdk : le SDK TypeScript de PDF123

@pdf123/sdk est le SDK TypeScript de l'API PDF de PDF123. Il exécute 95 outils comme la fusion, la division, la compression et l'OCR, type les options de chaque outil et ajoute lots, pipelines, gestion des mots de passe et erreurs typées. C'est un module ES sans dépendance d'exécution.

@pdf123/sdkNode 20.3 ou version ultérieure, ou Bun

Installation

npm install @pdf123/sdk
Sur cette page

Comment installer le SDK ?

Installez le paquet avec votre gestionnaire de paquets. Node 20.3 ou plus récent, Bun ou un bundler est requis. Les types TypeScript sont inclus et @types/node n'est pas nécessaire.

Installationbash
npm install @pdf123/sdk

bun add @pdf123/sdk et pnpm add @pdf123/sdk fonctionnent de la même façon.

Comment fusionner deux PDF ?

Créez un client, lancez l'outil merge sur deux fichiers et enregistrez le résultat. Sans option, le client appelle l'API publique de façon anonyme.

Fusionner et enregistrerts
import { Pdf123Client } from "@pdf123/sdk";
import { readFileInput, saveResult } from "@pdf123/sdk/node";

const client = new Pdf123Client();
const result = await client.run("merge", {
  input: [await readFileInput("a.pdf"), await readFileInput("b.pdf")],
});
const path = await saveResult(result, { output: "merged.pdf" });
console.log(path);

Le résultat contient les octets dans data, le contentType, le filename du serveur et json pour les outils qui renvoient un rapport. La même opération existe sous le nom Fusionner des PDF sur le site.

Quel point d'entrée importer ?

Point d'entréePrérequisContenu
@pdf123/sdkUniquement fetchPdf123Client, TOOLS, getTool, Pdf123Error et les fonctions utilitaires du catalogue
@pdf123/sdk/nodeNode ou BunreadFileInput, fileSource, saveResult, checkOutput et clientFromEnv

Importez depuis le point d'entrée racine dans les navigateurs et les environnements edge, et n'ajoutez le point d'entrée node que là où vous lisez ou écrivez des fichiers.

Quelles méthodes le client propose-t-il ?

MéthodeFonction
run(tool, { input, params })Lance un outil et renvoie un résultat
runBatch(tool, inputs, options)Lance un outil à fichier unique sur de nombreuses entrées et renvoie une entrée par fichier
pipeline(steps, input, options)Lance plusieurs outils en une seule requête
call(target, files, fields)Envoie une requête brute à un identifiant d'outil, un identifiant d'opération ou un chemin /api/...
upload(file)Envoie un fichier par l'API d'envoi par morceaux et renvoie son identifiant

Les utilitaires du catalogue sont de simples fonctions : TOOLS liste tous les outils, getTool(id) renvoie les champs, les valeurs par défaut et les types de fichiers acceptés d'un outil, et toolGroup, toolSummary, matchesQuery et suggestTools aident à construire des sélecteurs d'outils. La ligne de commande affiche le même catalogue avec pdfx list et pdfx describe.

Comment passer des options à un outil ?

params est typé pour chaque outil. Il n'accepte que les champs de cet outil, et les champs à choix n'acceptent que leurs valeurs autorisées. Les champs numériques sont comparés à leur minimum et à leur maximum, et un fichier au type accepté, avant tout envoi. Les valeurs par défaut dont le serveur a besoin sont renseignées.

Filigrane avec optionsts
const marked = await client.run("watermark", {
  input: await readFileInput("a.pdf"),
  params: { watermarkText: "DRAFT", fontSize: 40, rotation: -45 },
});
await saveResult(marked, { output: "draft.pdf" });

Une chaîne vide signifie « non défini », donc la valeur par défaut s'applique. Voir Filigrane PDF pour le rôle de chaque option.

Comment traiter de nombreux fichiers ?

runBatch lance un outil à fichier unique, comme Compresser, Pivoter ou Protéger, sur chaque entrée avec les mêmes options. Il traite deux fichiers à la fois par défaut. Un fichier défectueux n'arrête jamais les autres.

Lot avec annulationts
import { fileSource, saveResult } from "@pdf123/sdk/node";

const controller = new AbortController();
const entries = await client.runBatch("compress", [fileSource("a.pdf"), fileSource("b.pdf")], {
  concurrency: 2,
  signal: controller.signal,
  onResult: async (entry, index) => {
    if (entry.ok) await saveResult(entry.result, { output: "compressed/" });
  },
});
console.log(entries.map((entry) => entry.ok));
  • fileSource(path) est une source paresseuse, lue seulement quand un worker la prend en charge : de nombreux gros fichiers ne se retrouvent donc jamais ensemble en mémoire.
  • onResult reçoit chaque résultat dès qu'il est prêt. Enregistrez-le à cet endroit : une annulation au fichier 50 sur 100 conserve les 49 premiers. Avec retainData: false, le tableau renvoyé ne garde pas les octets.
  • Tout appel accepte timeoutMs et un signal pour l'annuler.
  • idempotencyKey devient <key>:<index> pour chaque fichier.

Les outils de filtre (identifiants commençant par filter-) se terminent avec matched: false au lieu de lever une exception lorsque leur condition n'est pas remplie. Dans un lot, un tel fichier compte quand même comme ok.

Comment enchaîner des outils en une seule requête ?

pipeline envoie une liste d'étapes et une ou plusieurs entrées. Le serveur transmet la sortie de chaque étape à la suivante.

Fusionner, filigraner, compresserts
const piped = await client.pipeline(
  [{ tool: "merge" }, { tool: "watermark", params: { watermarkText: "DRAFT" } }, { tool: "compress" }],
  [await readFileInput("a.pdf"), await readFileInput("b.pdf")],
);
await saveResult(piped, { output: "out.pdf" });

Les pipelines acceptent les mêmes options de mot de passe que run.

Comment traiter les PDF chiffrés ?

Passez password à run pour ouvrir d'abord une entrée chiffrée. Le déverrouillage et l'outil s'exécutent dans une seule requête. Pour les outils qui prennent plusieurs fichiers, comme Fusionner, passez passwords avec une entrée par fichier, en mettant une chaîne vide pour un fichier ouvert. Chaque fichier est déverrouillé séparément.

Mots de passets
await client.run("compress", { input: await readFileInput("locked.pdf"), password: "secret" });
await client.run("merge", {
  input: [await readFileInput("locked.pdf"), await readFileInput("open.pdf")],
  passwords: ["secret", ""],
});

Pour un lot, passwordFor(file, index) renvoie le mot de passe de chaque entrée. Pour retirer définitivement la protection, utilisez l'outil Déverrouiller.

Comment fonctionnent les erreurs ?

Les échecs lèvent Pdf123Error. Elle expose status (undefined s'il n'y a pas eu de réponse), code, reason pour la cause précise comme password_required, et problem avec le détail du problème renvoyé par le serveur, qui inclut hint quand il y en a un. Les erreurs de validation sont levées avant tout envoi.

Gérer une erreurts
import { Pdf123Error } from "@pdf123/sdk";

try {
  await client.run("compress", { input: await readFileInput("locked.pdf") });
} catch (error) {
  if (error instanceof Pdf123Error) {
    console.error(error.status, error.code, error.reason, error.problem?.hint);
  } else {
    throw error;
  }
}

Les codes du serveur sont listés dans Codes d'erreur. Le client ajoute ses propres codes :

CodeSignification
network_errorLa requête n'a reçu aucune réponse
timeoutUne requête a dépassé timeoutMs
cancelledVotre signal a interrompu l'appel
input_unreadableUn chemin local n'a pas pu être lu
output_unwritableLe résultat n'a pas pu être enregistré au chemin indiqué
output_mismatchsaveResult a refusé d'écrire un ZIP sous un nom .pdf
unsupported_file_typeLe type de fichier n'est pas accepté par l'outil
unknown_toolL'identifiant de l'outil n'existe pas ; le message propose des identifiants proches
invalid_targetcall a refusé un chemin /api/... contenant des segments .., . ou vides
no_contentL'outil n'avait rien à renvoyer (HTTP 204)

saveResult n'écrase jamais un fichier situé dans un répertoire. Appelez d'abord checkOutput(output, { several }) pour savoir, avant l'envoi, si un chemin est accessible en écriture.

Quels réglages TypeScript et modules fonctionnent ?

Les types se résolvent avec les réglages moduleResolution nodenext, node16, bundler et l'ancien node10, y compris pour le sous-chemin @pdf123/sdk/node. Le paquet est un module ES : import fonctionne partout. require("@pdf123/sdk") depuis CommonJS fonctionne à partir de Node 22.12 et n'est pas disponible sur Node 20.

Comment configurer le client ?

OptionVariable d'environnementValeur par défaut
baseUrlPDFX_API_BASEhttps://pdf123.xyz
apiKeyPDFX_API_KEYaucune, mode anonyme
timeoutMsaucune300000

new Pdf123Client() ne lit jamais l'environnement. clientFromEnv() de @pdf123/sdk/node lit les deux variables, et les options que vous passez l'emportent. La clé est envoyée dans l'en-tête X-API-KEY ; voir Authentification.

Pour utiliser votre propre serveur, définissez baseUrl sur son adresse, par exemple http://localhost:8080. Voir Auto-hébergement.

Puis-je utiliser le SDK dans un navigateur ?

Oui. Le point d'entrée racine @pdf123/sdk n'a besoin que de fetch et n'a aucune dépendance à Node. Construisez vous-même les objets FileInput à partir d'un File ou d'un Uint8Array, car les utilitaires de fichiers se trouvent dans le point d'entrée node. N'intégrez pas de clé d'API dans du code de navigateur que d'autres personnes peuvent lire.

FAQ

Le SDK exige-t-il une clé d'API ?

Non. Un client créé sans option appelle l'API publique de façon anonyme. Passez apiKey pour envoyer l'en-tête X-API-KEY.

Quelle version de Node le SDK exige-t-il ?

Node 20.3 ou version ultérieure, ou Bun. Le point d'entrée racine n'a besoin que de fetch : il fonctionne donc aussi dans les navigateurs et les bundlers.

Comment utiliser un outil plus récent que le SDK ?

Utilisez client.call. Elle prend un identifiant d'outil, un identifiant d'opération comme general/merge-pdfs ou un chemin /api/..., ainsi que des fichiers et des champs. Rien n'est validé ni complété par défaut en local.

Quelle taille de fichier puis-je envoyer ?

Les entrées de plus de 95 Mo au total passent automatiquement par l'API d'envoi par morceaux. Le corps d'une requête directe est limité à 100 MiB.

Pourquoi mon appel a-t-il levé une exception pour un PDF sans tableau ?

Des outils comme pdf-to-csv et pdf-to-xlsx répondent sans contenu quand le PDF ne contient aucun tableau détectable. Le SDK lève alors Pdf123Error avec le code no_content au lieu de renvoyer un fichier vide. Vérifiez ce code si un résultat vide est acceptable pour vous.