The API client supports three streaming modes for memory-efficient document processing.
Stream converted content directly to a writable stream without holding the full result in memory:
import { readFile } from "node:fs/promises";
import { createWriteStream } from "node:fs";
import { Docling } from "docling-sdk";
const client = new Docling({ api: { baseUrl: "http://localhost:5001" } });
const buffer = await readFile("./document.pdf");
await client.convertToStream(
buffer,
"document.pdf",
createWriteStream("./output.md"),
{ to_formats: ["md"] }
);This is useful when you need a single output format written directly to disk or piped to another process.
Submit a conversion asynchronously, then stream the result as a ZIP file:
import { createReadStream, createWriteStream } from "node:fs";
const result = await client.convertStreamToFile(
createReadStream("./document.pdf"),
"document.pdf",
{ to_formats: ["md", "json"] }
);
if (result.success && result.fileStream) {
result.fileStream.pipe(createWriteStream("./result.zip"));
}This is the recommended approach when you need multiple output formats or when the input is a stream (e.g., from an HTTP upload).
Convert directly from a readable stream, useful for Express or NestJS file upload middleware:
const result = await client.convertStream(
request.file.stream, // any ReadableStream
"upload.pdf",
{ to_formats: ["md"] }
);
console.log(result.document.md_content);Both convertToFile and convertStreamToFile return a ConversionFileResult:
interface ConversionFileResult {
success: boolean;
fileStream?: NodeReadable; // Node.js readable stream
data?: Uint8Array; // Raw bytes (browser, Deno, Bun)
fileMetadata?: {
filename: string;
contentType: string;
size?: number;
};
error?: ProcessingError;
}- In Node.js, use
fileStream(astream.Readable) - In browser, Deno, or Bun, use
data(aUint8Array)
if (result.success && result.fileStream) {
result.fileStream.pipe(createWriteStream("./output.zip"));
}if (result.success && result.data) {
await Bun.write("./output.zip", result.data);
}if (result.success && result.data) {
await Deno.writeFile("./output.zip", result.data);
}if (result.success && result.data) {
const blob = new Blob([result.data], { type: "application/zip" });
const url = URL.createObjectURL(blob);
// Use url for download link
}- API Client -- all conversion methods
- Async and Progress -- async as an alternative to streaming
- Cross-Runtime -- runtime-specific patterns