Skip to content

Quick Start

This guide walks you through Xberg’s core API: extract, extract_batch, ExtractInput, and the ExtractionResult envelope. Install your binding first if you haven’t: 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:

C
#include "xberg.h"
#include <stdio.h>
int main(void) {
XBERGExtractionConfig *config = xberg_extraction_config_default();
XBERGExtractInput *input =
xberg_extract_input_from_json("{\"kind\":\"uri\",\"uri\":\"document.pdf\"}");
XBERGExtractionResult *output = xberg_extract(input, config);
if (!output) {
fprintf(stderr, "extraction failed: %s\n", xberg_last_error_context());
xberg_extract_input_free(input);
xberg_extraction_config_free(config);
return 1;
}
char *json = xberg_extraction_result_to_json(output);
puts(json);
xberg_free_string(json);
xberg_extraction_result_free(output);
xberg_extract_input_free(input);
xberg_extraction_config_free(config);
return 0;
}

Wrap extractions in error handling before going further. Xberg raises specific exceptions for missing files, parse failures, and OCR problems:

C
#include "xberg.h"
#include <stdio.h>
#include <stdlib.h>
int main(void) {
XBERGExtractionConfig *config = xberg_extraction_config_default();
/* Pass an unsupported MIME type to trigger an error. */
XBERGExtractInput *input =
xberg_extract_input_from_bytes(NULL, 0, "application/x-unknown", NULL);
if (!input) {
int32_t code = xberg_last_error_code();
const char *message = xberg_last_error_context();
/* message is valid until the next FFI call on this thread — copy if needed. */
fprintf(stderr, "error %d: %s\n", code, message ? message : "(no message)");
xberg_extraction_config_free(config);
return code != 0 ? code : 1;
}
XBERGExtractionResult *result = xberg_extract(input, config);
if (!result) {
int32_t code = xberg_last_error_code();
const char *message = xberg_last_error_context();
fprintf(stderr, "error %d: %s\n", code, message ? message : "(no message)");
xberg_extract_input_free(input);
xberg_extraction_config_free(config);
return code != 0 ? code : 1;
}
char *content = xberg_extraction_result_results(result);
printf("%s\n", content ? content : "(empty)");
xberg_free_string(content);
xberg_extract_input_free(input);
xberg_extraction_result_free(result);
xberg_extraction_config_free(config);
return 0;
}

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\"}}"
"}";
XBERGExtractionConfig *config = xberg_extraction_config_from_json(config_json);
if (!config) {
fprintf(stderr, "config parse failed (code %d): %s\n",
xberg_last_error_code(),
xberg_last_error_context());
return 1;
}
XBERGExtractInput *input = xberg_extract_input_from_uri("scanned.png");
if (!input) {
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;
}
XBERGExtractionResult *result = xberg_extract(input, config);
if (result) {
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 ExtractInput values to extract_batch. Mix kind = "uri" and kind = "bytes" inputs when needed:

C
#include "xberg.h"
#include <stdio.h>
int main(void) {
const char *inputs_json =
"["
"{\"kind\":\"uri\",\"uri\":\"document.pdf\"},"
"{\"kind\":\"bytes\",\"bytes\":[72,101,108,108,111],"
"\"mime_type\":\"text/plain\",\"filename\":\"note.txt\"}"
"]";
XBERGExtractionConfig *config = xberg_extraction_config_default();
XBERGExtractionResult *output = xberg_extract_batch(inputs_json, config);
if (!output) {
fprintf(stderr, "batch extraction failed: %s\n", xberg_last_error_context());
xberg_extraction_config_free(config);
return 1;
}
char *json = xberg_extraction_result_to_json(output);
puts(json);
xberg_free_string(json);
xberg_extraction_result_free(output);
xberg_extraction_config_free(config);
return 0;
}

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) {
XBERGExtractInput *input = xberg_extract_input_from_uri("document.pdf");
if (!input) {
fprintf(stderr, "Failed to create input (code %d): %s\n",
xberg_last_error_code(),
xberg_last_error_context());
return 1;
}
XBERGExtractionResult *result = xberg_extract(input, NULL);
if (!result) {
fprintf(stderr, "extraction failed (code %d): %s\n",
xberg_last_error_code(),
xberg_last_error_context());
xberg_extract_input_free(input);
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);
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) {
XBERGExtractInput *input = xberg_extract_input_from_uri("spreadsheet.xlsx");
if (!input) {
fprintf(stderr, "Failed to create input (code %d): %s\n",
xberg_last_error_code(),
xberg_last_error_context());
return 1;
}
XBERGExtractionResult *result = xberg_extract(input, NULL);
if (!result) {
fprintf(stderr, "extraction failed (code %d): %s\n",
xberg_last_error_code(),
xberg_last_error_context());
xberg_extract_input_free(input);
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);
return 0;
}

Use async extraction in web servers, background workers, or anywhere you need non-blocking I/O:

C
#include "xberg.h"
#include <stdio.h>
int main(void) {
XBERGExtractionConfig *config = xberg_extraction_config_default();
XBERGExtractInput *input =
xberg_extract_input_from_json("{\"kind\":\"uri\",\"uri\":\"document.pdf\"}");
XBERGExtractionResult *output = xberg_extract(input, config);
if (!output) {
fprintf(stderr, "extraction failed: %s\n", xberg_last_error_context());
xberg_extract_input_free(input);
xberg_extraction_config_free(config);
return 1;
}
char *json = xberg_extraction_result_to_json(output);
puts(json);
xberg_free_string(json);
xberg_extraction_result_free(output);
xberg_extract_input_free(input);
xberg_extraction_config_free(config);
return 0;
}

You’ve covered the core API. Go deeper: