惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Threatpost
aimingoo的专栏
aimingoo的专栏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
Tailwind CSS Blog
J
Java Code Geeks
博客园_首页
Google Online Security Blog
Google Online Security Blog
Hugging Face - Blog
Hugging Face - Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
I
Intezer
P
Palo Alto Networks Blog
V
Vulnerabilities – Threatpost
雷峰网
雷峰网
O
OpenAI News
SecWiki News
SecWiki News
小众软件
小众软件
酷 壳 – CoolShell
酷 壳 – CoolShell
美团技术团队
N
News | PayPal Newsroom
Project Zero
Project Zero
Forbes - Security
Forbes - Security
IT之家
IT之家
A
Arctic Wolf
WordPress大学
WordPress大学
Jina AI
Jina AI
T
Tor Project blog
博客园 - 三生石上(FineUI控件)
S
Secure Thoughts
Google DeepMind News
Google DeepMind News
Attack and Defense Labs
Attack and Defense Labs
博客园 - 聂微东
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
P
Privacy International News Feed
Cloudbric
Cloudbric
G
GRAHAM CLULEY
博客园 - 叶小钗
H
Hacker News: Front Page
腾讯CDC
量子位
Help Net Security
Help Net Security
人人都是产品经理
人人都是产品经理
C
Cyber Attacks, Cyber Crime and Cyber Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
宝玉的分享
宝玉的分享
爱范儿
爱范儿
L
Lohrmann on Cybersecurity
Hacker News - Newest:
Hacker News - Newest: "LLM"
Recorded Future
Recorded Future
C
CERT Recently Published Vulnerability Notes

Inside Nutrient

A guide to the invisible work behind documents Introducing Nutrient Documents for Salesforce: Native document generation and signing Document AI vs. traditional OCR: Choosing between OCR, AI, and hybrid pipelines PDF SDK compliance and security evaluation checklist for enterprise teams (2026) Invariant Corp replaces paper processes with Nutrient Workflow and scales without limits What is process mapping? A complete guide Nutrient vs. Conga Composer for Salesforce document generation (2026) Document routing: How to automate document distribution The CTO’s AI playbook: Why accountability architecture beats orchestration Compliance workflow automation: Why built-in compliance is table stakes Workflow diagrams: Examples, symbols, and how to build one that actually runs Digital forms: Replace paper forms with automated workflows Approval workflow software: How to automate approvals Why document-centric automation is different The CEO’s AI playbook: Why decision architecture beats model selection Nutrient SDK product updates for Q1 2026 PDF redaction verification: How to prove sensitive data is permanently removed What is a VPAT? The complete guide to accessibility conformance reports What is PDF/UA? The accessible PDF standard explained Salesforce eSignatures: Generate, sign, and track documents in one flow Online document viewer: Options, tradeoffs, and how to embed one Document viewer for web apps: React, Vue, Angular (2026) Best document viewers in 2026: A buyer’s guide How to edit a PDF in Python: Add text, images, and annotations Nutrient advances Workflow platform with agentic AI for enterprise-grade speed and consistency in document-heavy operations How to create a Salesforce quote template from opportunity data The business case for accessibility: Five ways it drives enterprise value Python PDF library comparison (2026): 7 libraries for developers Why your AI agent hallucinates PDF table data PDF.js limitations: When to upgrade to a commercial PDF SDK How Subject scaled 5× with Nutrient’s PDF SDK without rebuilding its document layer I replaced our sales training with an AI coach that runs in Slack — here’s what broke Redirecting to: https://securitybuzz.com/cybersecurity-news/why-enterprise-permissions-are-ais-most-dangerous-inheritance/ Nutrient .NET SDK vs. iText Core: Complete comparison for .NET developers DocuVieware: Support’s most frequently asked setup questions Introducing Nutrient Workflow How to convert PDF to Word in C# (.NET) When email and spreadsheets stop working: Work order approval workflows for field teams on the move Compliance with confidence: Why document-centric automation is the foundation of your mission Nutrient expands AI Assistant, automating multistep document workflows inside any application What is document generation? A developer’s guide to PDF generation Document Converter data flow and how real-time watermarks skip the queue PDF/UA compliance guide: Requirements, standards, and best practices Computers still can’t understand you How Athena Intelligence built AI agents for regulated enterprises with Nutrient’s document infrastructure How to convert HTML to PDF (2026): 4 methods from browser print to SDK OCR vs. intelligent document processing: Choosing the right document extraction engine Beyond OCR: How document intelligence eliminates manual processing in regulated industries Nutrient vs. IronPDF: Complete comparison for .NET developers Nutrient vs. Aspose.PDF: Complete comparison for .NET developers Redirecting to: https://fortune.com/2026/02/19/openclaw-who-is-peter-steinberger-openai-sam-altman-anthropic-moltbook/ Lufthansa Systems uses Nutrient to deliver reliable, scalable PDF rendering for pilots worldwide Nutrient vs. Syncfusion: Complete comparison for .NET developers React’s useTransition: The hook you’re probably using wrong First City Monument Bank streamlines banking processes with Nutrient Workflow Redirecting to: https://www.sdcexec.com/warehousing/automation/article/22957364/nutrient-workflow-automation-the-missing-link-in-supply-chain-efficiency The complete guide to digital signatures: PAdES, CAdES, and XAdES explained Nutrient Python SDK: Production-grade document processing for Python Introducing agentic document editing for web applications with AI Assistant Nutrient vs. QuestPDF: Complete comparison for .NET developers How we fixed the GdPicture license expiration (and what to do if you’re affected) Red team security testing with agentic AI The future of healthcare document automation Best healthcare workflow software compared Nutrient SDK product updates for Q4 2025 How Harvey scaled legal document workflows 50 percent MoM without rebuilding infrastructure HIPAA-compliant document management in hospitals How we optimized rendering performance while handling thousands of annotations in React — Part 2 Automated PII removal with Nutrient API Redirecting to: https://www.devopsdigest.com/2026-low-code-no-code-predictions Redirecting to: https://www.kmworld.com/Articles/Editorial/ViewPoints/Leaders-predict-AI-to-continue-permeating-all-aspects-of-KM-in-2026-172594.aspx What are deep agents and how do they solve complex problems? Whipping up document magic: Your easy-bake recipe for Vue and Nutrient Web SDK 🧁 What I’ve learned about product iteration planning while building SDKs Passwordless document signing: Three-layer security guide New zip folder functionality streamlines file management in Document Automation Server The keyboard shortcuts playbook: Taking control of keyboard events in Nutrient Web SDK From experienced engineer to AI beginner: My unexpected journey AI-assisted manual testing: Handling Safari’s PDF rendering and UI quirks How to keep a 20-year-old SDK up to date How we optimized rendering performance while handling thousands of annotations in React — Part 1 Nutrient announces new executive hires to accelerate next phase of growth High performance UI using web workers Automate document conversion at scale with Python and Nutrient DCS From curiosity to PLG (and AI): My journey to understanding product-led growth Prost to progress: One year as Nutrient Pigeon usage at Nutrient: Bridging native SDKs to Flutter Modernizing CI build servers: How to migrate from Chef to Ansible Unix man pages: AI-friendly documentation since 1971 Consistent hashing for even load distribution Best AI redaction APIs: Complete comparison guide for 2025 Why AI document redaction matters for modern security From coding to coordinating: How AI transformed my workflow What is intelligent document processing (IDP)? A complete guide Enterprise PDF SDKs: Best PSPDFKit (now Nutrient) alternatives Nutrient SDK product updates for Q3 2025 GdPicture support best practices Redacting sensitive data with Nutrient AI redaction API How AI is transforming the customer experience at Nutrient: From instant answers to intelligent support How manual QA uses PR testing between releases
How to build a document extraction pipeline with Nutrient Vision API
Pavel Bogachevskyi · 2026-03-04 · via Inside Nutrient

You have a stack of scanned documents. Maybe they’re invoices, research papers, or hospital intake forms. You need to extract structured data from them, not as a blob of text, but as something your application can actually work with: tables with rows and columns, equations your search engine can index, and a reading order that makes sense.

If you’ve tried solving this with traditional OCR, you know the result. You get text. Lots of it. But the table structure is gone, the two-column layout is merged into nonsense, and the handwritten notes at the bottom are either garbled or missing entirely. For scanned PDFs with complex layouts, plain OCR isn’t enough.

Nutrient Vision API is a local-first alternative to cloud OCR services. Instead of just recognizing characters, it analyzes document structure using on-device AI models. It’s available in the Nutrient Python SDK and Nutrient Java SDK, and this post walks through how to build a document data extraction pipeline with it.

What Vision API gives you that OCR doesn’t

Before getting into the code, it helps to understand what this document extraction SDK offers. Vision API ships three extraction engines, all accessible through the same API.

Optical character recognition (OCR)

This is the fast path, offering character recognition, word-level bounding boxes, and language detection. Use it when you need raw text at high throughput and don’t care about layout — think search indexing or receipt scanning.

Intelligent content recognition (ICR)

This is the default engine and the core of the structured data extraction pipeline. It runs local AI models that detect document layout, perform table extraction with cell-level coordinates, recognize equations (output as LaTeX), parse hierarchical content like nested lists and captions, and determine reading order. Everything stays on your machine.

VLM-enhanced ICR

This adds a cloud AI layer on top of ICR. It sends layout data to Claude or OpenAI for improved accuracy on tricky table boundaries and complex multicolumn documents. You control when this kicks in.

All three engines return JSON with bounding boxes for every extracted element. That means you can trace any value back to the exact pixel region in the source image.

Diagram showing Vision API engine selection: OCR for fast text extraction, ICR for local AI processing with layout analysis, and VLM-enhanced ICR for hybrid AI with highest accuracy — all accepting PNG, JPEG, or TIFF input and returning structured JSON output

The most common scenario is extracting structured data from a scanned document using ICR. Here’s the minimal code.

Python:

from nutrient_sdk import Document, Vision, VisionEngine

with Document.open("scanned_invoice.png") as document:

document.settings.vision_settings.engine = VisionEngine.ICR

vision = Vision.set(document)

content_json = vision.extract_content()

with open("output.json", "w") as f:

f.write(content_json)

Java:

import io.nutrient.sdk.Document;

import io.nutrient.sdk.Vision;

import io.nutrient.sdk.enums.VisionEngine;

import io.nutrient.sdk.exceptions.NutrientException;

import java.io.FileWriter;

import java.io.IOException;

public class ExtractDocument {

public static void main(String[] args)

throws NutrientException, IOException {

try (Document document =

Document.open("scanned_invoice.png")) {

document.getSettings()

.getVisionSettings()

.setEngine(VisionEngine.Icr);

Vision vision = Vision.set(document);

String contentJson = vision.extractContent();

try (FileWriter writer =

new FileWriter("output.json")) {

writer.write(contentJson);

}

}

}

}

That’s it. Open the image, set the engine, extract. The JSON output contains every detected element with its type, text content, bounding box coordinates, and position in the reading order.

What the output looks like

The JSON from ICR is structured, not flat. Here’s a simplified example of what you get back for a document containing a paragraph and a table:

{

"elements": [

{

"type": "paragraph",

"text": "Invoice #2024-0892",

"boundingBox": {

"x": 45,

"y": 120,

"width": 310,

"height": 28

},

"readingOrder": 0

},

{

"type": "table",

"boundingBox": {

"x": 45,

"y": 200,

"width": 680,

"height": 340

},

"readingOrder": 1,

"children": [

{

"type": "tableCell",

"text": "Item",

"row": 0,

"column": 0

},

{

"type": "tableCell",

"text": "Amount",

"row": 0,

"column": 1

}

]

}

]

}

Compare that with plain OCR output, which would give you something like "Invoice #2024-0892\nItem Amount\nWidget A $45.00" with no way to tell which value belongs to which column.

The bounding boxes are in pixel coordinates, so you can overlay them on the source image to build review user interfaces, highlight extracted regions, or let users click through to verify a specific value.

Comparing the three engines on the same image

In practice, picking the right engine depends on your use case. The table below offers a quick comparison of what each one returns for the same input.

CapabilityOCRICRVLM-enhanced ICR
Text extractionYesYesYes
Table structureNoYes, with cell coordinatesYes, with confidence scores
EquationsNoYes, as LaTeXYes, as LaTeX
Reading orderBasic left-to-rightLayout-awareLayout-aware, improved
HandwritingLimitedYesYes
Bounding boxesWord-levelElement-levelElement-level
Runs locallyYesYesLocal + cloud API call
Relative speedFastestModerateSlowest

Switching between engines is a one-line change. The rest of your code stays the same.

Generating image descriptions

Vision API also supports generating natural language descriptions of images. This is useful for accessibility compliance (WCAG alt text), content cataloging, or feeding context into downstream AI systems.

You can use cloud providers like OpenAI or Claude, or run a local VLM server for complete privacy.

Python with Claude:

from nutrient_sdk import Document, Vision

from nutrient_sdk.settings import VlmProvider

with Document.open("diagram.png") as document:

document.settings.vision_settings.provider = (

VlmProvider.Claude

)

document.settings.claude_api_settings.api_key = (

"CLAUDE_API_KEY"

)

vision = Vision.set(document)

description = vision.describe()

print(description)

Java with OpenAI:

import io.nutrient.sdk.Document;

import io.nutrient.sdk.Vision;

import io.nutrient.sdk.enums.VlmProvider;

import io.nutrient.sdk.exceptions.NutrientException;

import io.nutrient.sdk.settings.OpenAIApiEndpointSettings;

import io.nutrient.sdk.settings.VisionSettings;

import java.io.FileWriter;

import java.io.IOException;

public class DescribeImage {

public static void main(String[] args)

throws NutrientException, IOException {

try (Document document =

Document.open("diagram.png")) {

VisionSettings visionSettings = document

.getSettings().getVisionSettings();

visionSettings.setProvider(VlmProvider.OpenAI);

OpenAIApiEndpointSettings openaiSettings =

document.getSettings()

.getOpenAIApiEndpointSettings();

openaiSettings.setApiKey("OPENAI_API_KEY");

Vision vision = Vision.set(document);

String description = vision.describe();

try (FileWriter writer =

new FileWriter("description.txt")) {

writer.write(description);

}

}

}

}

If you want to keep everything local, point the API at a local VLM server like LM Studio or Ollama. The default configuration expects an OpenAI-compatible endpoint at http://localhost:1234/v1 with the qwen/qwen3-vl-4b model:

with Document.open("diagram.png") as document:

vlm_settings = (

document.settings.custom_vlm_api_settings

)

vlm_settings.api_endpoint = (

"http://localhost:1234/v1"

)

vlm_settings.model = "qwen/qwen3-vl-4b"

vision = Vision.set(document)

description = vision.describe()

Getting production-ready

Two things matter when you move from a prototype to a production deployment: startup time and engine selection.

Predownload models with warmup

The first time you call extract_content() with ICR, the SDK downloads several gigabytes of AI models. In production, you don’t want that happening on the first user request. Use warmup() during application startup to predownload everything.

Python:

from nutrient_sdk import Document, Vision

from nutrient_sdk.settings import VisionEngine

with Document.open("any_image.png") as document:

document.settings.vision_settings.engine = (

VisionEngine.Icr

)

vision = Vision.set(document)

# Call this during app startup.

vision.warmup()

print("Models downloaded and ready.")

Java:

try (Document document = Document.open("any_image.png")) {

document.getSettings()

.getVisionSettings()

.setEngine(VisionEngine.Icr);

Vision vision = Vision.set(document);

// Call this during app startup.

System.out.println("Downloading models...");

vision.warmup();

System.out.println("Models ready.");

}

Models are cached locally after the first download and persist across application restarts. For containerized deployments, mount a persistent volume to the model directory so you don’t redownload on every pod restart.

Choosing your engine

Here’s a quick decision tree:

  • Need raw text fast? Use OCR. It has the smallest memory footprint and highest throughput.
  • Need tables, equations, or layout structure? Use ICR. It handles the vast majority of documents well and runs entirely offline.
  • Dealing with irregular table layouts or complex scientific documents? Add VLM enhancement. The accuracy improvement is real, but you’ll pay for cloud API calls and accept higher latency.

You can also mix engines in the same pipeline. Run ICR as the default and selectively route documents with low-confidence table extractions to VLM-enhanced mode.

What formats are supported

Vision API works with common image formats: PNG, JPEG, GIF, BMP, and TIFF (including multipage). If your source documents are scanned PDFs, convert them to images first using the rendering capabilities of Nutrient Python SDK or Nutrient Java SDK, and then run extraction on each page.

Next steps

If you’ve been looking for an OCR alternative that extracts document structure locally without sending data to cloud APIs, Vision API is worth trying. The best way to get started is to grab one of the sample projects and run it against your own documents:

If you hit an edge case or want to talk through your extraction pipeline architecture, reach out to our team.