Skip to content

Quick Start

Use Xberg’s core API through extract, extract_batch, ExtractInput, and the ExtractionResult envelope. Install your binding first: Installation.

TypeScript users: @xberg-io/xberg for Node.js, @xberg-io/xberg-wasm for browsers and edge runtimes — see Language Support.

Pass an ExtractInput with kind = "uri" to extract a local path, file:// URI, or HTTP(S) URL. extract returns an ExtractionResult with a results list:

Tests URI extraction API

Python
import asyncio
from xberg import extract, ExtractInput, ExtractInputKind
async def main() -> None:
input = ExtractInput(kind=ExtractInputKind("uri"), uri="https://example.com/pdf/fake_memo.pdf")
result = await extract(input)
print(result.results[0].content)
asyncio.run(main())

For the command line:

Bash
# Extract to stdout
xberg extract document.pdf
# Save to file using shell redirection
xberg extract document.pdf > output.txt
# Extract with JSON format (includes metadata)
xberg extract document.pdf --format json

Handle extraction failures through your binding’s typed error surface. This example rejects an unsupported MIME type; missing files, parse failures, and OCR failures use the same language-appropriate error path:

Error when extracting with unsupported MIME type

Python
import asyncio
from pathlib import Path
from xberg import extract, ExtractInput, FileExtractionConfig, ExtractInputKind
from xberg._xberg import ExtractionConfig
from xberg import XbergError
async def main() -> None:
try:
input = ExtractInput(bytes=Path("text/plain.txt").read_bytes(), config=FileExtractionConfig(), filename="plain.txt", kind=ExtractInputKind("bytes"), mime_type="application/x-nonexistent")
config = ExtractionConfig.from_json("{}")
await extract(input, config)
except XbergError as error:
print(f"{type(error).__name__}: {error}")
asyncio.run(main())

Xberg runs OCR automatically when it detects an image or scanned PDF. You can also force OCR on any document:

C
#include "xberg.h"
#include <stdio.h>
int main(void) {
const char *config_json = "{"
"\"ocr\": {\"tesseract\": {\"language\": \"eng\"}}"
"}";
XBERGAlefHandle config = xberg_extraction_config_from_json(config_json);
if (config == 0) {
fprintf(stderr, "config parse failed (code %d): %s\n",
xberg_last_error_code(),
xberg_last_error_context());
return 1;
}
XBERGAlefHandle input = xberg_extract_input_from_uri("scanned.png");
if (input == 0) {
fprintf(stderr, "Failed to create input (code %d): %s\n",
xberg_last_error_code(),
xberg_last_error_context());
xberg_extraction_config_free(config);
return 1;
}
XBERGAlefHandle result = xberg_extract(input, config);
if (result != 0) {
char *results = xberg_extraction_result_results(result);
if (results) {
printf("OCR results: %s\n", results);
}
xberg_free_string(results);
} else {
fprintf(stderr, "OCR error (code %d): %s\n",
xberg_last_error_code(),
xberg_last_error_context());
}
xberg_extract_input_free(input);
xberg_extraction_result_free(result);
xberg_extraction_config_free(config);
return 0;
}

Pass a list of document URIs to extract_batch. Use extract_batch_bytes for in-memory data; ExtractInput variants can combine URI and byte inputs when a binding exposes the unified API.

extract_batch over URI inputs

Python
import asyncio
from xberg import extract_batch
async def main() -> None:
inputs = [{"kind": "uri", "uri": "https://example.com/pdf/fake_memo.pdf"}, {"kind": "uri", "uri": "https://example.com/text/fake_text.txt"}]
result = await extract_batch(inputs)
for result in result.results:
print(result.content)
asyncio.run(main())

For command-line batches:

Bash
# Process multiple files
xberg extract doc1.pdf doc2.docx doc3.pptx
# Use glob patterns
xberg extract documents/**/*.pdf

Every ExtractionResult contains document metadata in results. Each ExtractedDocument includes format-specific metadata: page count for PDFs, sheet names for Excel, dimensions for images:

C
#include "xberg.h"
#include <stdio.h>
int main(void) {
/* A config handle is required — zero is rejected as an invalid handle. */
XBERGAlefHandle config = xberg_extraction_config_from_json("{}");
if (config == 0) {
fprintf(stderr, "config init failed (code %d): %s\n",
xberg_last_error_code(),
xberg_last_error_context());
return 1;
}
XBERGAlefHandle input = xberg_extract_input_from_uri("document.pdf");
if (input == 0) {
fprintf(stderr, "Failed to create input (code %d): %s\n",
xberg_last_error_code(),
xberg_last_error_context());
xberg_extraction_config_free(config);
return 1;
}
XBERGAlefHandle result = xberg_extract(input, config);
if (result == 0) {
fprintf(stderr, "extraction failed (code %d): %s\n",
xberg_last_error_code(),
xberg_last_error_context());
xberg_extract_input_free(input);
xberg_extraction_config_free(config);
return 1;
}
char *results_json = xberg_extraction_result_results(result);
if (results_json) {
printf("Results: %s\n", results_json);
}
xberg_free_string(results_json);
char *full_json = xberg_extraction_result_to_json(result);
if (full_json) {
printf("Full result: %s\n", full_json);
}
xberg_free_string(full_json);
xberg_extract_input_free(input);
xberg_extraction_result_free(result);
xberg_extraction_config_free(config);
return 0;
}

Xberg extracts format-specific metadata for:

  • PDF: page count, title, authors (list), creation date, modification date
  • HTML: SEO tags, Open Graph, Twitter Card, structured data, headers, links, images
  • Excel: sheet count, sheet names
  • Email: from, to, CC, BCC, message ID, attachments
  • PowerPoint: title, author, description, fonts
  • Images: dimensions, format, EXIF data
  • Archives: format, file count, file list, sizes
  • XML: element count, unique elements
  • Text/Markdown: word count, line count, headers, links

See Types Reference for complete metadata reference.

Tables come back as both structured cells and Markdown. Xberg extracts them from PDFs, spreadsheets, and HTML:

C
#include "xberg.h"
#include <stdio.h>
int main(void) {
/* A config handle is required — zero is rejected as an invalid handle. */
XBERGAlefHandle config = xberg_extraction_config_from_json("{}");
if (config == 0) {
fprintf(stderr, "config init failed (code %d): %s\n",
xberg_last_error_code(),
xberg_last_error_context());
return 1;
}
XBERGAlefHandle input = xberg_extract_input_from_uri("spreadsheet.xlsx");
if (input == 0) {
fprintf(stderr, "Failed to create input (code %d): %s\n",
xberg_last_error_code(),
xberg_last_error_context());
xberg_extraction_config_free(config);
return 1;
}
XBERGAlefHandle result = xberg_extract(input, config);
if (result == 0) {
fprintf(stderr, "extraction failed (code %d): %s\n",
xberg_last_error_code(),
xberg_last_error_context());
xberg_extract_input_free(input);
xberg_extraction_config_free(config);
return 1;
}
char *result_json = xberg_extraction_result_to_json(result);
if (result_json) {
printf("Extraction result (JSON): %s\n", result_json);
} else {
printf("No extraction result available\n");
}
xberg_free_string(result_json);
xberg_extract_input_free(input);
xberg_extraction_result_free(result);
xberg_extraction_config_free(config);
return 0;
}

Async-capable bindings expose extraction as an awaitable operation for web servers and background workers. Synchronous bindings expose the same input and result contract directly:

Tests URI extraction API

Python
import asyncio
from xberg import extract, ExtractInput, ExtractInputKind
async def main() -> None:
input = ExtractInput(kind=ExtractInputKind("uri"), uri="https://example.com/pdf/fake_memo.pdf")
result = await extract(input)
print(result.results[0].content)
asyncio.run(main())

You’ve covered the core API. Go deeper: