> For the complete documentation index, see [llms.txt](https://docs.apryse.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.apryse.com/core/smart-data-extraction/workflow.md).

# Smart Data Extraction on Server/Desktop

Learn how to install Data Extraction Module using PIP with Python or NPM with Node.js on Windows, Linux, and other platforms. Follow step-by-step instructions for JSON output specifications and usage

{% hint style="info" %}
**Requirements**

*These packages are required to use these features in production. Trial keys have unlimited access to all features*

<a href="https://apryse.com/capabilities#SmartDataExtraction" class="button primary">Package: Smart Data Extraction</a><a href="/core/learn-more/modules.md#data-extraction-module" class="button primary">Module: Data Extraction</a><a href="https://showcase.apryse.com/document-structure-extraction" class="button primary">Live demo</a>
{% endhint %}

## Installation Instructions

This guide walks you through installing and configuring Apryse’s Data Extraction Module so you can start extracting data from PDFs quickly and reliably.

{% hint style="info" %}
**Trial mode page limit**

When in trial mode, output is limited to 100 pages, and a random evaluation page is inserted in the output content. Once licensed, there is no page limit and the demo page will no longer be inserted.
{% endhint %}

### Using PIP with Python

When using Python on Windows or Linux you can install the package via PIP with this command:

{% hint style="info" %}
x64 is supported, but Arm and 32 bit are not.
{% endhint %}

{% tabs %}
{% tab title="Shell" %}
{% code lineNumbers="true" %}

```sh
pip install --extra-index-url=https://pypi.apryse.com apryse-data-extraction
```

{% endcode %}
{% endtab %}
{% endtabs %}

### Using NPM with Node.js

When using Node.js on Windows or Linux you can install the package via NPM with this command:

{% hint style="info" %}
x64 is supported, but Arm and 32 bit are not.
{% endhint %}

{% tabs %}
{% tab title="Shell" %}
{% code lineNumbers="true" %}

```sh
npm install @pdftron/data-extraction
```

{% endcode %}
{% endtab %}
{% endtabs %}

### Installing directly on other platforms

For Windows, just copy [DataExtractionModuleWindows.zip](https://docs.apryse.com/downloads/DataExtractionModuleWindows.zip) in your PDFNetC folder, then extract it locally. You should have files like:

{% hint style="info" %}
x64 is supported, but Arm and 32 bit are not.
{% endhint %}

* Lib\Windows\StructuredOutput.exe
* Lib\Windows\OCRModule.exe
* Lib\Windows\TabularData\TabularData.dll
* Lib\Windows\AIPageObjectExtractor\AIPageObjectExtractor.dll

For Linux, just copy [DataExtractionModuleLinux.tar.gz](https://docs.apryse.com/downloads/DataExtractionModuleLinux.tar.gz) in your PDFNetC directory, then extract it locally. You should have files like

* Lib/Linux/StructuredOutput
* Lib/Linux/OCRModule
* Lib/Linux/TabularData/TabularData
* Lib/Linux/AIPageObjectExtractor/AIPageObjectExtractor

## JSON Output Specification

Refer to the following specifications to learn more about the output JSON format:

* [JSON Specification for Tabular Data and Document Structure](https://sdk.apryse.com/api/structurejson/index.html)
* [JSON Specification for Form Field Identification](https://sdk.apryse.com/api/formextractjson/index.html)
* [JSON Specification for Generic Key-Value Extraction](https://sdk.apryse.com/api/keyvalueextractjson/modules.html)
* [JSON Specification for Document Classification](https://sdk.apryse.com/api/classificationjson/index.html)

## Usage

If you are using PIP or NPM, you may skip setting `AddResourceSearchPath`. Otherwise, follow the directions below.

The first thing to set up before the module can be used is the location of the Lib directory under which the external add-ons are installed, so that the SDK knows where to look for them. This is achieved via the PDFNet `AddResourceSearchPath` function. If a relative path is used, it is based on the end-user executable.

{% tabs %}
{% tab title="C#" %}
{% code lineNumbers="true" %}

```csharp
PDFNet.AddResourceSearchPath("../../../../../Lib/");
```

{% endcode %}
{% endtab %}

{% tab title="C++" %}
{% code lineNumbers="true" %}

```cpp
PDFNet::AddResourceSearchPath("../../../Lib/");
```

{% endcode %}
{% endtab %}

{% tab title="Go" %}
{% code lineNumbers="true" %}

```go
PDFNetAddResourceSearchPath("../../../PDFNetC/Lib/")
```

{% endcode %}
{% endtab %}

{% tab title="Java" %}
{% code lineNumbers="true" %}

```java
PDFNet.addResourceSearchPath("../../../Lib/");
```

{% endcode %}
{% endtab %}

{% tab title="JavaScript" %}
{% code lineNumbers="true" %}

```js
await PDFNet.addResourceSearchPath('../../lib/');
```

{% endcode %}
{% endtab %}

{% tab title="PHP" %}
{% code lineNumbers="true" %}

```php
PDFNet::AddResourceSearchPath("../../../PDFNetC/Lib/");
```

{% endcode %}
{% endtab %}

{% tab title="Python" %}
{% code lineNumbers="true" %}

```python
PDFNet.AddResourceSearchPath("../../../PDFNetC/Lib/")
```

{% endcode %}
{% endtab %}

{% tab title="Ruby" %}
{% code lineNumbers="true" %}

```ruby
PDFNet.AddResourceSearchPath("../../../PDFNetC/Lib/")
```

{% endcode %}
{% endtab %}

{% tab title="VB" %}
{% code lineNumbers="true" %}

```vb
PDFNet.AddResourceSearchPath("../../../../../Lib/")
```

{% endcode %}
{% endtab %}
{% endtabs %}

Note: do not specify the actual Windows, Linux, MacOS directory, where the individual executables are, but its parent folder.

For error handling purposes, it is generally advisable to test whether the module is available via the `IsModuleAvailable` function. Since the Data Extraction suite consists of multiple modules, an extra parameter is used to clarify the component to test.

{% tabs %}
{% tab title="C#" %}
{% code lineNumbers="true" %}

```csharp
if (!DataExtractionModule.IsModuleAvailable(DataExtractionModule.DataExtractionEngine.e_tabular))
{
   // Unable to run Data Extraction: PDFTron SDK Tabular Data module not available.
}
if (!DataExtractionModule.IsModuleAvailable(DataExtractionModule.DataExtractionEngine.e_doc_structure))
{
   // Unable to run Data Extraction: PDFTron SDK Structured Output module not available.
}
if (!DataExtractionModule.IsModuleAvailable(DataExtractionModule.DataExtractionEngine.e_form))
{
   // Unable to run Data Extraction: PDFTron SDK AIFormFieldExtractor module not available.
}
if (!DataExtractionModule.IsModuleAvailable(DataExtractionModule.DataExtractionEngine.e_generic_key_value))
{
   // Unable to run Data Extraction: PDFTron SDK AIGenericKeyValue module not available.
}
if (!DataExtractionModule.IsModuleAvailable(DataExtractionModule.DataExtractionEngine.e_doc_classification))
{
   // Unable to run Data Extraction: PDFTron SDK AIDocClassification module not available.
}
```

{% endcode %}
{% endtab %}

{% tab title="C++" %}
{% code lineNumbers="true" %}

```cpp
if (!DataExtractionModule::IsModuleAvailable(DataExtractionModule::e_Tabular))
{
   // Unable to run Data Extraction: PDFTron SDK Tabular Data module not available.
}
if (!DataExtractionModule::IsModuleAvailable(DataExtractionModule::e_DocStructure))
{
   // Unable to run Data Extraction: PDFTron SDK Structured Output module not available.
}
if (!DataExtractionModule::IsModuleAvailable(DataExtractionModule::e_Form))
{
   // Unable to run Data Extraction: PDFTron SDK AIFormFieldExtractor module not available.
}
if (!DataExtractionModule::IsModuleAvailable(DataExtractionModule::e_GenericKeyValue))
{
   // Unable to run Data Extraction: PDFTron SDK AIGenericKeyValue module not available.
}
if (!DataExtractionModule::IsModuleAvailable(DataExtractionModule::e_DocClassification))
{
   // Unable to run Data Extraction: PDFTron SDK AIDocClassification module not available.
}
```

{% endcode %}
{% endtab %}

{% tab title="Go" %}
{% code lineNumbers="true" %}

```go
if !DataExtractionModuleIsModuleAvailable(DataExtractionModuleE_Tabular) {
   // Unable to run Data Extraction: PDFTron SDK Tabular Data module not available.
}
if !DataExtractionModuleIsModuleAvailable(DataExtractionModuleE_DocStructure) {
   // Unable to run Data Extraction: PDFTron SDK Structured Output module not available.
}
if !DataExtractionModuleIsModuleAvailable(DataExtractionModuleE_Form) {
   // Unable to run Data Extraction: PDFTron SDK AIFormFieldExtractor module not available.
}
if !DataExtractionModuleIsModuleAvailable(DataExtractionModuleE_GenericKeyValue) {
   // Unable to run Data Extraction: PDFTron SDK AIGenericKeyValue module not available.
}
if !DataExtractionModuleIsModuleAvailable(DataExtractionModuleE_DocClassification) {
   // Unable to run Data Extraction: PDFTron SDK AIDocClassification module not available.
}
```

{% endcode %}
{% endtab %}

{% tab title="Java" %}
{% code lineNumbers="true" %}

```java
if (!DataExtractionModule.isModuleAvailable(DataExtractionModule.DataExtractionEngine.e_tabular))
{
   // Unable to run Data Extraction: PDFTron SDK Tabular Data module not available.
}
if (!DataExtractionModule.isModuleAvailable(DataExtractionModule.DataExtractionEngine.e_doc_structure))
{
   // Unable to run Data Extraction: PDFTron SDK Structured Output module not available.
}
if (!DataExtractionModule.isModuleAvailable(DataExtractionModule.DataExtractionEngine.e_form))
{
   // Unable to run Data Extraction: PDFTron SDK AIFormFieldExtractor module not available.
}
if (!DataExtractionModule.isModuleAvailable(DataExtractionModule.DataExtractionEngine.e_generic_key_value))
{
   // Unable to run Data Extraction: PDFTron SDK AIGenericKeyValue module not available.
}
if (!DataExtractionModule.isModuleAvailable(DataExtractionModule.DataExtractionEngine.e_doc_classification))
{
   // Unable to run Data Extraction: PDFTron SDK AIDocClassification module not available.
}
```

{% endcode %}
{% endtab %}

{% tab title="JavaScript" %}
{% code lineNumbers="true" %}

```js
if (!await PDFNet.DataExtractionModule.isModuleAvailable(PDFNet.DataExtractionModule.DataExtractionEngine.e_Tabular)) {
   // Unable to run Data Extraction: PDFTron SDK Tabular Data module not available.
}
if (!await PDFNet.DataExtractionModule.isModuleAvailable(PDFNet.DataExtractionModule.DataExtractionEngine.e_DocStructure)) {
   // Unable to run Data Extraction: PDFTron SDK Structured Output module not available.
}
if (!await PDFNet.DataExtractionModule.isModuleAvailable(PDFNet.DataExtractionModule.DataExtractionEngine.e_Form)) {
   // Unable to run Data Extraction: PDFTron SDK AIFormFieldExtractor module not available.
}
if (!await PDFNet.DataExtractionModule.isModuleAvailable(PDFNet.DataExtractionModule.DataExtractionEngine.e_GenericKeyValue)) {
   // Unable to run Data Extraction: PDFTron SDK AIGenericKeyValue module not available.
}
if (!await PDFNet.DataExtractionModule.isModuleAvailable(PDFNet.DataExtractionModule.DataExtractionEngine.e_DocClassification)) {
   // Unable to run Data Extraction: PDFTron SDK AIDocClassification module not available.
}
```

{% endcode %}
{% endtab %}

{% tab title="PHP" %}
{% code lineNumbers="true" %}

```php
if (!DataExtractionModule::IsModuleAvailable(DataExtractionModule::e_Tabular)) {
   // Unable to run Data Extraction: PDFTron SDK Tabular Data module not available.
}
if (!DataExtractionModule::IsModuleAvailable(DataExtractionModule::e_DocStructure)) {
   // Unable to run Data Extraction: PDFTron SDK Structured Output module not available.
}
if (!DataExtractionModule::IsModuleAvailable(DataExtractionModule::e_Form)) {
   // Unable to run Data Extraction: PDFTron SDK AIFormFieldExtractor module not available.
}
if (!DataExtractionModule::IsModuleAvailable(DataExtractionModule::e_GenericKeyValue)) {
   // Unable to run Data Extraction: PDFTron SDK AIGenericKeyValue module not available.
}
if (!DataExtractionModule::IsModuleAvailable(DataExtractionModule::e_DocClassification)) {
   // Unable to run Data Extraction: PDFTron SDK AIDocClassification module not available.
}
```

{% endcode %}
{% endtab %}

{% tab title="Python" %}
{% code lineNumbers="true" %}

```python
if not DataExtractionModule.IsModuleAvailable(DataExtractionModule.e_Tabular):
   pass # Unable to run Data Extraction: PDFTron SDK Tabular Data module not available.
if not DataExtractionModule.IsModuleAvailable(DataExtractionModule.e_DocStructure):
   pass # Unable to run Data Extraction: PDFTron SDK Structured Output module not available.
if not DataExtractionModule.IsModuleAvailable(DataExtractionModule.e_Form):
   pass # Unable to run Data Extraction: PDFTron SDK AIFormFieldExtractor module not available.
if not DataExtractionModule.IsModuleAvailable(DataExtractionModule.e_GenericKeyValue):
   pass # Unable to run Data Extraction: PDFTron SDK AIGenericKeyValue module not available.
if not DataExtractionModule.IsModuleAvailable(DataExtractionModule.e_DocClassification):
   pass # Unable to run Data Extraction: PDFTron SDK AIDocClassification module not available.
```

{% endcode %}
{% endtab %}

{% tab title="Ruby" %}
{% code lineNumbers="true" %}

```ruby
if !DataExtractionModule.IsModuleAvailable(DataExtractionModule::E_Tabular) then
   # Unable to run Data Extraction: PDFTron SDK Tabular Data module not available.
end
if !DataExtractionModule.IsModuleAvailable(DataExtractionModule::E_DocStructure) then
   # Unable to run Data Extraction: PDFTron SDK Structured Output module not available.
end
if !DataExtractionModule.IsModuleAvailable(DataExtractionModule::E_Form) then
   # Unable to run Data Extraction: PDFTron SDK AIFormFieldExtractor module not available.
end
if !DataExtractionModule.IsModuleAvailable(DataExtractionModule::E_GenericKeyValue) then
   # Unable to run Data Extraction: PDFTron SDK AIGenericKeyValue module not available.
end
if !DataExtractionModule.IsModuleAvailable(DataExtractionModule::E_DocClassification) then
   # Unable to run Data Extraction: PDFTron SDK AIDocClassification module not available.
end
```

{% endcode %}
{% endtab %}

{% tab title="VB" %}
{% code lineNumbers="true" %}

```vb
If Not DataExtractionModule.IsModuleAvailable(DataExtractionModule.DataExtractionEngine.e_tabular) Then
   ' Unable to run Data Extraction: PDFTron SDK Tabular Data module not available.
End If
If Not DataExtractionModule.IsModuleAvailable(DataExtractionModule.DataExtractionEngine.e_doc_structure) Then
   ' Unable to run Data Extraction: PDFTron SDK Structured Output module not available.
End If
If Not DataExtractionModule.IsModuleAvailable(DataExtractionModule.DataExtractionEngine.e_form) Then
   ' Unable to run Data Extraction: PDFTron SDK AIFormFieldExtractor module not available.
End If
If Not DataExtractionModule.IsModuleAvailable(DataExtractionModule.DataExtractionEngine.e_generic_key_value) Then
   ' Unable to run Data Extraction: PDFTron SDK AIGenericKeyValue module not available.
End If
If Not DataExtractionModule.IsModuleAvailable(DataExtractionModule.DataExtractionEngine.e_doc_classification) Then
   ' Unable to run Data Extraction: PDFTron SDK AIDocClassification module not available.
End If
```

{% endcode %}
{% endtab %}
{% endtabs %}

If you have the module installed but the function still returns false, please double check that the correct path was used in `AddResourceSearchPath` earlier.

## Data Extraction Options

Although the default options will satisfy most common use cases, we offer a couple of options to customize the extraction behavior and unlock lesser-used functionality.

The options object is passed as the last parameter to any extraction function, as shown below.

### Select OCR Language

Use the `Language` option to set the preferred OCR language(s). If you work with scanned documents in languages other than English, specify one or more 3-letter [ISO 639-2](https://en.wikipedia.org/wiki/List_of_ISO_639-2_codes) language codes, separated by spaces. For example, `"eng deu spa fra"` for English, German, Spanish, French. You may also use comma or plus as a separator.

Supported languages:

* `eng`: English
* `deu` or `ger`: German
* `fra` or `fre`: French
* `ita`: Italian
* `rus`: Russian
* `spa`: Spanish

Note: Listing too many languages at once may hurt performance and accuracy. If you know the exact language, it is always best to use that single setting.

{% tabs %}
{% tab title="C#" %}
{% code lineNumbers="true" %}

```csharp
DataExtractionOptions options = new DataExtractionOptions();
options.SetLanguage("fra spa"); // French and Spanish
DataExtractionModule.ExtractData("table.pdf", "table.json", DataExtractionModule.DataExtractionEngine.e_tabular, options);
```

{% endcode %}
{% endtab %}

{% tab title="C++" %}
{% code lineNumbers="true" %}

```cpp
DataExtractionOptions options;
options.SetLanguage("fra spa"); // French and Spanish
DataExtractionModule::ExtractData("table.pdf", "table.json", DataExtractionModule::e_Tabular, &options);
```

{% endcode %}
{% endtab %}

{% tab title="Go" %}
{% code lineNumbers="true" %}

```go
options := NewDataExtractionOptions()
options.SetLanguage("fra spa"); // French and Spanish
DataExtractionModuleExtractData("table.pdf", "table.json", DataExtractionModuleE_Tabular, options)
```

{% endcode %}
{% endtab %}

{% tab title="Java" %}
{% code lineNumbers="true" %}

```java
DataExtractionOptions options = new DataExtractionOptions();
options.setLanguage("fra spa"); // French and Spanish
DataExtractionModule.extractData("table.pdf", "table.json", DataExtractionModule.DataExtractionEngine.e_tabular, options);
```

{% endcode %}
{% endtab %}

{% tab title="JavaScript" %}
{% code lineNumbers="true" %}

```js
const options = new PDFNet.DataExtractionModule.DataExtractionOptions();
options.setLanguage("fra spa"); // French and Spanish
await PDFNet.DataExtractionModule.extractData('table.pdf', 'table.json', PDFNet.DataExtractionModule.DataExtractionEngine.e_Tabular, options);
```

{% endcode %}
{% endtab %}

{% tab title="PHP" %}
{% code lineNumbers="true" %}

```php
$options = new DataExtractionOptions();
$options.setLanguage("fra spa"); // French and Spanish
DataExtractionModule::ExtractData("table.pdf", "table.json", DataExtractionModule::e_Tabular, $options);
```

{% endcode %}
{% endtab %}

{% tab title="Python" %}
{% code lineNumbers="true" %}

```python
options = DataExtractionOptions()
options.SetLanguage("fra spa") # French and Spanish
DataExtractionModule.ExtractData("table.pdf", "table.json", DataExtractionModule.e_Tabular, options)
```

{% endcode %}
{% endtab %}

{% tab title="Ruby" %}
{% code lineNumbers="true" %}

```ruby
options = DataExtractionOptions.new()
options.SetLanguage("fra spa") # French and Spanish
DataExtractionModule.ExtractData("table.pdf", "table.json", DataExtractionModule::E_Tabular, options)
```

{% endcode %}
{% endtab %}

{% tab title="VB" %}
{% code lineNumbers="true" %}

```vb
Dim options As DataExtractionOptions = New DataExtractionOptions()
options.SetLanguage("fra spa") ' French and Spanish
DataExtractionModule.ExtractData("table.pdf", "table.json", DataExtractionModule.DataExtractionEngine.e_tabular, options)
```

{% endcode %}
{% endtab %}
{% endtabs %}

### Specify PDF Password

Use the `PDFPassword` option to specify a PDF password if one is required.

Encrypted PDF files that are protected by a password may only be opened when the password is specified in addition to the filename. No password is necessary for files that can be viewed without any authentication.

{% tabs %}
{% tab title="C#" %}
{% code lineNumbers="true" %}

```csharp
DataExtractionOptions options = new DataExtractionOptions();
options.SetPDFPassword("password123"); // password for input PDF
DataExtractionModule.ExtractData("table.pdf", "table.json", DataExtractionModule.DataExtractionEngine.e_tabular, options);
```

{% endcode %}
{% endtab %}

{% tab title="C++" %}
{% code lineNumbers="true" %}

```cpp
DataExtractionOptions options;
options.SetPDFPassword("password123"); // password for input PDF
DataExtractionModule::ExtractData("table.pdf", "table.json", DataExtractionModule::e_Tabular, &options);
```

{% endcode %}
{% endtab %}

{% tab title="Go" %}
{% code lineNumbers="true" %}

```go
options := NewDataExtractionOptions()
options.SetPDFPassword("password123") // password for input PDF
DataExtractionModuleExtractData("table.pdf", "table.json", DataExtractionModuleE_Tabular, options)
```

{% endcode %}
{% endtab %}

{% tab title="Java" %}
{% code lineNumbers="true" %}

```java
DataExtractionOptions options = new DataExtractionOptions();
options.setPDFPassword("password123"); // password for input PDF
DataExtractionModule.extractData("table.pdf", "table.json", DataExtractionModule.DataExtractionEngine.e_tabular, options);
```

{% endcode %}
{% endtab %}

{% tab title="JavaScript" %}
{% code lineNumbers="true" %}

```js
const options = new PDFNet.DataExtractionModule.DataExtractionOptions();
options.setPDFPassword("password123"); // password for input PDF
await PDFNet.DataExtractionModule.extractData('table.pdf', 'table.json', PDFNet.DataExtractionModule.DataExtractionEngine.e_Tabular, options);
```

{% endcode %}
{% endtab %}

{% tab title="PHP" %}
{% code lineNumbers="true" %}

```php
$options = new DataExtractionOptions();
$options.setPDFPassword("password123"); // password for input PDF
DataExtractionModule::ExtractData("table.pdf", "table.json", DataExtractionModule::e_Tabular, $options);
```

{% endcode %}
{% endtab %}

{% tab title="Python" %}
{% code lineNumbers="true" %}

```python
options = DataExtractionOptions()
options.SetPDFPassword("password123") # password for input PDF
DataExtractionModule.ExtractData("table.pdf", "table.json", DataExtractionModule.e_Tabular, options)
```

{% endcode %}
{% endtab %}

{% tab title="Ruby" %}
{% code lineNumbers="true" %}

```ruby
options = DataExtractionOptions.new()
options.SetPDFPassword("password123") # password for input PDF
DataExtractionModule.ExtractData("table.pdf", "table.json", DataExtractionModule::E_Tabular, options)
```

{% endcode %}
{% endtab %}

{% tab title="VB" %}
{% code lineNumbers="true" %}

```vb
Dim options As DataExtractionOptions = New DataExtractionOptions()
options.SetPDFPassword("password123") ' password for input PDF
DataExtractionModule.ExtractData("table.pdf", "table.json", DataExtractionModule.DataExtractionEngine.e_tabular, options)
```

{% endcode %}
{% endtab %}
{% endtabs %}

### Select a Page Range

Use the `Pages` option to restrict the extraction to a selected range of pages.

This can be a single page number (such as `"1"` for the first page), or a range separated by a dash (such as `"1-5"`, or `"7-"` for 7 and beyond). An empty string means all pages are extracted.

{% tabs %}
{% tab title="C#" %}
{% code lineNumbers="true" %}

```csharp
DataExtractionOptions options = new DataExtractionOptions();
options.SetPages("1"); // extract page 1
DataExtractionModule.ExtractData("table.pdf", "table.json", DataExtractionModule.DataExtractionEngine.e_tabular, options);
```

{% endcode %}
{% endtab %}

{% tab title="C++" %}
{% code lineNumbers="true" %}

```cpp
DataExtractionOptions options;
options.SetPages("1"); // extract page 1
DataExtractionModule::ExtractData("table.pdf", "table.json", DataExtractionModule::e_Tabular, &options);
```

{% endcode %}
{% endtab %}

{% tab title="Go" %}
{% code lineNumbers="true" %}

```go
options := NewDataExtractionOptions()
options.SetPages("1") // page 1
DataExtractionModuleExtractData("table.pdf", "table.json", DataExtractionModuleE_Tabular, options)
```

{% endcode %}
{% endtab %}

{% tab title="Java" %}
{% code lineNumbers="true" %}

```java
DataExtractionOptions options = new DataExtractionOptions();
options.setPages("1"); // extract page 1
DataExtractionModule.extractData("table.pdf", "table.json", DataExtractionModule.DataExtractionEngine.e_tabular, options);
```

{% endcode %}
{% endtab %}

{% tab title="JavaScript" %}
{% code lineNumbers="true" %}

```js
const options = new PDFNet.DataExtractionModule.DataExtractionOptions();
options.setPages("1"); // page 1
await PDFNet.DataExtractionModule.extractData('table.pdf', 'table.json', PDFNet.DataExtractionModule.DataExtractionEngine.e_Tabular, options);
```

{% endcode %}
{% endtab %}

{% tab title="PHP" %}
{% code lineNumbers="true" %}

```php
$options = new DataExtractionOptions();
$options.setPages("1"); // page 1
DataExtractionModule::ExtractData("table.pdf", "table.json", DataExtractionModule::e_Tabular, $options);
```

{% endcode %}
{% endtab %}

{% tab title="Python" %}
{% code lineNumbers="true" %}

```python
options = DataExtractionOptions()
options.SetPages("1") # page 1
DataExtractionModule.ExtractData("table.pdf", "table.json", DataExtractionModule.e_Tabular, options)
```

{% endcode %}
{% endtab %}

{% tab title="Ruby" %}
{% code lineNumbers="true" %}

```ruby
options = DataExtractionOptions.new()
options.SetPages("1") # page 1
DataExtractionModule.ExtractData("table.pdf", "table.json", DataExtractionModule::E_Tabular, options)
```

{% endcode %}
{% endtab %}

{% tab title="VB" %}
{% code lineNumbers="true" %}

```vb
Dim options As DataExtractionOptions = New DataExtractionOptions()
options.SetPages("1") ' extract page 1
DataExtractionModule.ExtractData("table.pdf", "table.json", DataExtractionModule.DataExtractionEngine.e_tabular, options)
```

{% endcode %}
{% endtab %}
{% endtabs %}

### Specify Regions of Interest

You can specify regions to include or exclude from analysis for each page in a document using the Inclusion Zone and Exclusion Zone options for a page. These options specify rectangles in user-space coordinates that allow developers to either include or exclude a region from analysis. For example, if a document has a table that you don't want to analyze, you could specify it's bounding box as an exclusion zone, or if a document has only one paragraph that you care about, you could use an inclusion zone. If no zones are specified for a page, the entire page is included in analysis.

Inclusion and exclusion zones can be combined to create complex regions of interest. Inclusions zones are combined by union, and exclusion zones are subtracted.

This option is only supported for the Form, FormKeyValue, and GenericKeyValue engines at this time.

{% tabs %}
{% tab title="C#" %}
{% code lineNumbers="true" %}

```csharp
DataExtractionOptions options = new DataExtractionOptions();

RectCollection p4InclusionZones = new RectCollection();
RectCollection p4ExclusionZones = new RectCollection();
p4InclusionZones.AddRect(30, 432, 562, 684);
p4ExclusionZones.AddRect(30, 657, 295, 684);
options.AddInclusionZonesForPage(p4InclusionZones, 4);
options.AddExclusionZonesForPage(p4ExclusionZones, 4);

DataExtractionModule.ExtractData("newsletter.pdf", "newsletter_key_val_with_zones.json", DataExtractionModule.DataExtractionEngine.e_generic_key_value, options);
```

{% endcode %}
{% endtab %}

{% tab title="C++" %}
{% code lineNumbers="true" %}

```cpp
DataExtractionOptions options;

RectCollection p4_inclusion_zones, p4_exclusion_zones;
p4_inclusion_zones.AddRect(30, 432, 562, 684);
p4_exclusion_zones.AddRect(30, 657, 295, 684);
options.AddInclusionZonesForPage(p4_inclusion_zones, 4);
options.AddExclusionZonesForPage(p4_exclusion_zones, 4);

DataExtractionModule::ExtractData("newsletter.pdf", "newsletter_key_val_with_zones.json", DataExtractionModule::e_GenericKeyValue, &options);
```

{% endcode %}
{% endtab %}

{% tab title="Go" %}
{% code lineNumbers="true" %}

```go
options := NewDataExtractionOptions()

p4InclusionZones := NewRectCollection()
p4ExclusionZones := NewRectCollection()
p4InclusionZones.AddRect(NewRect(30, 432, 562, 684))
p4ExclusionZones.AddRect(NewRect(30, 657, 295, 684))
options.AddInclusionZonesForPage(p4InclusionZones, 4)
options.AddExclusionZonesForPage(p4ExclusionZones, 4)

DataExtractionModuleExtractData("newsletter.pdf", "newsletter_key_val_with_zones.json", DataExtractionModuleE_GenericKeyValue, options)
```

{% endcode %}
{% endtab %}

{% tab title="Java" %}
{% code lineNumbers="true" %}

```java
DataExtractionOptions options = new DataExtractionOptions();

RectCollection p4InclusionZones = new RectCollection();
RectCollection p4ExclusionZones = new RectCollection();
p4InclusionZones.addRect(30, 432, 562, 684);
p4ExclusionZones.addRect(30, 657, 295, 684);
options.addInclusionZonesForPage(p4InclusionZones, 4);
options.addExclusionZonesForPage(p4ExclusionZones, 4);

DataExtractionModule.extractData("newsletter.pdf", "newsletter_key_val_with_zones.json", DataExtractionModule.DataExtractionEngine.e_generic_key_value, options);
```

{% endcode %}
{% endtab %}

{% tab title="JavaScript" %}
{% code lineNumbers="true" %}

```js
const options = new PDFNet.DataExtractionModule.DataExtractionOptions();
					
const p4InclusionZones = [];
const p4ExclusionZones = [];
p4InclusionZones.push(new PDFNet.Rect(30, 432, 562, 684));
p4ExclusionZones.push(new PDFNet.Rect(30, 657, 295, 684));
options.addInclusionZonesForPage(p4InclusionZones, 4);
options.addExclusionZonesForPage(p4ExclusionZones, 4);

await PDFNet.DataExtractionModule.extractData('newsletter.pdf', 'newsletter_key_val_with_zones.json', PDFNet.DataExtractionModule.DataExtractionEngine.e_GenericKeyValue, options);
```

{% endcode %}
{% endtab %}

{% tab title="PHP" %}
{% code lineNumbers="true" %}

```php
$options = new DataExtractionOptions();

$p4InclusionZones = new RectCollection();
$p4ExclusionZones = new RectCollection();
$p4InclusionZones->AddRect(new Rect(30.0, 432.0, 562.0, 684.0));
$p4ExclusionZones->AddRect(new Rect(30.0, 657.0, 295.0, 684.0));
$options->AddInclusionZonesForPage($p4InclusionZones, 4);
$options->AddExclusionZonesForPage($p4ExclusionZones, 4);

DataExtractionModule::ExtractData("newsletter.pdf", "newsletter_key_val_with_zones.json", DataExtractionModule::e_GenericKeyValue, $options);
```

{% endcode %}
{% endtab %}

{% tab title="Python" %}
{% code lineNumbers="true" %}

```python
options = DataExtractionOptions()

p4_inclusion_zones = RectCollection()
p4_exclusion_zones = RectCollection()
p4_inclusion_zones.AddRect(Rect(30, 432, 562, 684))
p4_exclusion_zones.AddRect(Rect(30, 657, 295, 684))
options.AddInclusionZonesForPage(p4_inclusion_zones, 4)
options.AddExclusionZonesForPage(p4_exclusion_zones, 4)

DataExtractionModule.ExtractData("newsletter.pdf", "newsletter_key_val_with_zones.json", DataExtractionModule.e_GenericKeyValue, options)
```

{% endcode %}
{% endtab %}

{% tab title="Ruby" %}
{% code lineNumbers="true" %}

```ruby
options = DataExtractionOptions.new()

p4_inclusion_zones = RectCollection.new()
p4_exclusion_zones = RectCollection.new()
p4_inclusion_zones.AddRect(Rect.new(30, 432, 562, 684))
p4_exclusion_zones.AddRect(Rect.new(30, 657, 295, 684))
options.AddInclusionZonesForPage(p4_inclusion_zones, 4)
options.AddExclusionZonesForPage(p4_exclusion_zones, 4)

DataExtractionModule.ExtractData("newsletter.pdf", "newsletter_key_val_with_zones.json", DataExtractionModule::E_GenericKeyValue, options)
```

{% endcode %}
{% endtab %}

{% tab title="VB" %}
{% code lineNumbers="true" %}

```vb
Dim options As New DataExtractionOptions()

Dim p4InclusionZones As New RectCollection()
Dim p4ExclusionZones As New RectCollection()
p4InclusionZones.AddRect(30, 432, 562, 684)
p4ExclusionZones.AddRect(30, 657, 295, 684)
options.AddInclusionZonesForPage(p4InclusionZones, 4)
options.AddExclusionZonesForPage(p4ExclusionZones, 4)

DataExtractionModule.ExtractData("newsletter.pdf", "newsletter_key_val_with_zones.json",DataExtractionModule.DataExtractionEngine.e_generic_key_value, options)
```

{% endcode %}
{% endtab %}
{% endtabs %}

### Deep Learning Assist

Specifies if Deep Learning is used with table recognition in the DocStructure engine. Table recognition accuracy improves at the cost of increased processing time. This only affects the DocStructure engine.

{% tabs %}
{% tab title="C#" %}
{% code lineNumbers="true" %}

```csharp
DataExtractionOptions options = new DataExtractionOptions();
options.SetDeepLearningAssist(true); // Enable Deep learning assistant
DataExtractionModule.ExtractData("table.pdf", "table.json", DataExtractionModule.DataExtractionEngine.e_DocStructure, options);
```

{% endcode %}
{% endtab %}

{% tab title="C++" %}
{% code lineNumbers="true" %}

```cpp
DataExtractionOptions options;
options.SetDeepLearningAssist(true); // Enable Deep learning assistant
DataExtractionModule::ExtractData("table.pdf", "table.json", DataExtractionModule::e_DocStructure, &options);
```

{% endcode %}
{% endtab %}

{% tab title="Go" %}
{% code lineNumbers="true" %}

```go
options := NewDataExtractionOptions()
options.SetDeepLearningAssist(true) // Enable Deep learning assistant
DataExtractionModuleExtractData("table.pdf", "table.json", DataExtractionModuleE_DocStructure, options)
```

{% endcode %}
{% endtab %}

{% tab title="Java" %}
{% code lineNumbers="true" %}

```java
DataExtractionOptions options = new DataExtractionOptions();
options.setDeepLearningAssist(true); // Enable Deep learning assistant
DataExtractionModule.extractData("table.pdf", "table.json", DataExtractionModule.DataExtractionEngine.e_DocStructure, options);
```

{% endcode %}
{% endtab %}

{% tab title="JavaScript" %}
{% code lineNumbers="true" %}

```js
const options = new PDFNet.DataExtractionModule.DataExtractionOptions();
options.setDeepLearningAssist(true); // Enable Deep learning assistant
await PDFNet.DataExtractionModule.extractData('table.pdf', 'table.json', PDFNet.DataExtractionModule.DataExtractionEngine.e_DocStructure, options);
```

{% endcode %}
{% endtab %}

{% tab title="PHP" %}
{% code lineNumbers="true" %}

```php
$options = new DataExtractionOptions();
$options.setDeepLearningAssist(true); // Enable Deep learning assistant
DataExtractionModule::ExtractData("table.pdf", "table.json", DataExtractionModule::e_DocStructure, $options);
```

{% endcode %}
{% endtab %}

{% tab title="Python" %}
{% code lineNumbers="true" %}

```python
options = DataExtractionOptions()
options.SetDeepLearningAssist(True) # Enable Deep learning assistant
DataExtractionModule.ExtractData("table.pdf", "table.json", DataExtractionModule.e_DocStructure, options)
```

{% endcode %}
{% endtab %}

{% tab title="Ruby" %}
{% code lineNumbers="true" %}

```ruby
options = DataExtractionOptions.new()
options.SetDeepLearningAssist(true) # Enable Deep learning assistant
DataExtractionModule.ExtractData("table.pdf", "table.json", DataExtractionModule::E_DocStructure, options)
```

{% endcode %}
{% endtab %}

{% tab title="VB" %}
{% code lineNumbers="true" %}

```vb
Dim options As DataExtractionOptions = New DataExtractionOptions()
options.SetDeepLearningAssist(True) ' Enable Deep learning assistant
DataExtractionModule.ExtractData("table.pdf", "table.json", DataExtractionModule.DataExtractionEngine.e_DocStructure, options)
```

{% endcode %}
{% endtab %}
{% endtabs %}

### Preserve existing form fields when adding to PDF

When automatically detecting form fields and adding them to a document, you can force the module to preserve any existing form annotations that are already present in the document, only adding newly detected fields.

{% tabs %}
{% tab title="C#" %}
{% code lineNumbers="true" %}

```csharp
PDFDoc doc = new PDFDoc("formfields.pdf");
DataExtractionOptions options = new DataExtractionOptions();
options.SetOverlappingFormFieldBehavior("KeepOld");
DataExtractionModule.DetectAndAddFormFieldsToPDF(doc, options);
```

{% endcode %}
{% endtab %}

{% tab title="C++" %}
{% code lineNumbers="true" %}

```cpp
PDFDoc doc("formfields.pdf");
DataExtractionOptions options;
options.SetOverlappingFormFieldBehavior("KeepOld");
DataExtractionModule::DetectAndAddFormFieldsToPDF(doc, &options);
```

{% endcode %}
{% endtab %}

{% tab title="Go" %}
{% code lineNumbers="true" %}

```go
doc = NewPDFDoc("formfields.pdf")
options := NewDataExtractionOptions()
options.SetOverlappingFormFieldBehavior("KeepOld")
DataExtractionModuleDetectAndAddFormFieldsToPDF(doc, options)
```

{% endcode %}
{% endtab %}

{% tab title="Java" %}
{% code lineNumbers="true" %}

```java
PDFDoc doc = new PDFDoc("formfields.pdf");
DataExtractionOptions options = new DataExtractionOptions();
options.setOverlappingFormFieldBehavior("KeepOld");
DataExtractionModule.detectAndAddFormFieldsToPDF(doc, options);
```

{% endcode %}
{% endtab %}

{% tab title="JavaScript" %}
{% code lineNumbers="true" %}

```js
const doc = await PDFNet.PDFDoc.createFromFilePath("formfields.pdf");
const options = new PDFNet.DataExtractionModule.DataExtractionOptions();
options.setOverlappingFormFieldBehavior('KeepOld');
await PDFNet.DataExtractionModule.detectAndAddFormFieldsToPDF(doc, options);
```

{% endcode %}
{% endtab %}

{% tab title="PHP" %}
{% code lineNumbers="true" %}

```php
$doc = new PDFDoc("formfields.pdf");
$options = new DataExtractionOptions();
$options->SetOverlappingFormFieldBehavior("KeepOld");
DataExtractionModule::DetectAndAddFormFieldsToPDF($doc, $options);
```

{% endcode %}
{% endtab %}

{% tab title="Python" %}
{% code lineNumbers="true" %}

```python
doc = PDFDoc("formfields.pdf")
options = DataExtractionOptions()
options.SetOverlappingFormFieldBehavior("KeepOld")
DataExtractionModule.DetectAndAddFormFieldsToPDF(doc, options)
```

{% endcode %}
{% endtab %}

{% tab title="Ruby" %}
{% code lineNumbers="true" %}

```ruby
doc = PDFDoc.new("formfields.pdf")
options = DataExtractionOptions.new()
options.SetOverlappingFormFieldBehavior("KeepOld")
DataExtractionModule.DetectAndAddFormFieldsToPDF(doc, options)
```

{% endcode %}
{% endtab %}

{% tab title="VB" %}
{% code lineNumbers="true" %}

```vb
Dim doc as PDFDoc = New PDFDoc("formfields.pdf")
Dim options = New DataExtractionOptions()
options.SetOverlappingFormFieldBehavior("KeepOld")
DataExtractionModule.DetectAndAddFormFieldsToPDF(doc, options)
```

{% endcode %}
{% endtab %}
{% endtabs %}

### Detect Empty Fields

{% hint style="info" %}
**NEW FEATURE**

New in 11.8!
{% endhint %}

Specifies if empty fields should be recognized in the `GenericKeyValue` engine. The default is true. Users who don't require empty fields could benefit from setting this option to false, thus reducing processing time.

This option only affects the `GenericKeyValue` engine.

{% tabs %}
{% tab title="C#" %}
{% code lineNumbers="true" %}

```csharp
DataExtractionOptions options = new DataExtractionOptions();
options.SetDetectEmptyFields(false);
DataExtractionModule.ExtractData("newsletter.pdf", "newsletter_key_val_with_zones.json", DataExtractionModule.DataExtractionEngine.e_generic_key_value, options);
```

{% endcode %}
{% endtab %}

{% tab title="C++" %}
{% code lineNumbers="true" %}

```cpp
DataExtractionOptions options;
options.SetDetectEmptyFields(false);
DataExtractionModule::ExtractData("newsletter.pdf", "newsletter_key_val_with_zones.json", DataExtractionModule::e_GenericKeyValue, &options);
```

{% endcode %}
{% endtab %}

{% tab title="Go" %}
{% code lineNumbers="true" %}

```go
options := NewDataExtractionOptions()
options.SetDetectEmptyFields(false)
DataExtractionModuleExtractData("newsletter.pdf", "newsletter_key_val_with_zones.json", DataExtractionModuleE_GenericKeyValue, options)
```

{% endcode %}
{% endtab %}

{% tab title="Java" %}
{% code lineNumbers="true" %}

```java
DataExtractionOptions options = new DataExtractionOptions();
options.setDetectEmptyFields(false);
DataExtractionModule.extractData("newsletter.pdf", "newsletter_key_val_with_zones.json", DataExtractionModule.DataExtractionEngine.e_generic_key_value, options);
```

{% endcode %}
{% endtab %}

{% tab title="JavaScript" %}
{% code lineNumbers="true" %}

```js
const options = new PDFNet.DataExtractionModule.DataExtractionOptions();
options.setDetectEmptyFields(false);
await PDFNet.DataExtractionModule.extractData('newsletter.pdf', 'newsletter_key_val_with_zones.json', PDFNet.DataExtractionModule.DataExtractionEngine.e_GenericKeyValue, options);
```

{% endcode %}
{% endtab %}

{% tab title="PHP" %}
{% code lineNumbers="true" %}

```php
$options = new DataExtractionOptions();
$options->SetDetectEmptyFields(false);
DataExtractionModule::ExtractData("newsletter.pdf", "newsletter_key_val_with_zones.json", DataExtractionModule::e_GenericKeyValue, $options);
```

{% endcode %}
{% endtab %}

{% tab title="Python" %}
{% code lineNumbers="true" %}

```python
options = DataExtractionOptions()
options.SetDetectEmptyFields(False)
DataExtractionModule.ExtractData("newsletter.pdf", "newsletter_key_val_with_zones.json", DataExtractionModule.e_GenericKeyValue, options)
```

{% endcode %}
{% endtab %}

{% tab title="Ruby" %}
{% code lineNumbers="true" %}

```ruby
options = DataExtractionOptions.new()
options.SetDetectEmptyFields(false)
DataExtractionModule.ExtractData("newsletter.pdf", "newsletter_key_val_with_zones.json", DataExtractionModule::E_GenericKeyValue, options)
```

{% endcode %}
{% endtab %}

{% tab title="VB" %}
{% code lineNumbers="true" %}

```vb
Dim options = New DataExtractionOptions()
options.SetDetectEmptyFields(False)
DataExtractionModule.ExtractData("newsletter.pdf", "newsletter_key_val_with_zones.json",DataExtractionModule.DataExtractionEngine.e_generic_key_value, options)
```

{% endcode %}
{% endtab %}
{% endtabs %}

### Minimum Confidence Threshold

{% hint style="info" %}
**NEW FEATURE**

New in 11.8!
{% endhint %}

Specifies the minimum confidence threshold for a class to be accepted in the `DocClassification` engine. The default is 0.25. Classes that don't meet the minimum threshold will not be listed in the output JSON.

This option only affects the `DocClassification` engine.

{% tabs %}
{% tab title="C#" %}
{% code lineNumbers="true" %}

```csharp
DataExtractionOptions options = new DataExtractionOptions();
options.SetMinimumConfidenceThreshold(0.7);
DataExtractionModule.ExtractData("Email.pdf", "Email_Classified.json", DataExtractionModule.DataExtractionEngine.e_doc_classification, options);
```

{% endcode %}
{% endtab %}

{% tab title="C++" %}
{% code lineNumbers="true" %}

```cpp
DataExtractionOptions options;
options.SetMinimumConfidenceThreshold(0.7);
DataExtractionModule::ExtractData("Email.pdf", "Email_Classified.json", DataExtractionModule::e_DocClassification, &options);
```

{% endcode %}
{% endtab %}

{% tab title="Go" %}
{% code lineNumbers="true" %}

```go
options := NewDataExtractionOptions()
options.SetMinimumConfidenceThreshold(0.7)
DataExtractionModuleExtractData("Email.pdf", "Email_Classified.json", DataExtractionModuleE_DocClassification, options)
```

{% endcode %}
{% endtab %}

{% tab title="Java" %}
{% code lineNumbers="true" %}

```java
DataExtractionOptions options = new DataExtractionOptions();
options.setMinimumConfidenceThreshold(0.7);
DataExtractionModule.extractData("Email.pdf", "Email_Classified.json", DataExtractionModule.DataExtractionEngine.e_doc_classification, options);
```

{% endcode %}
{% endtab %}

{% tab title="JavaScript" %}
{% code lineNumbers="true" %}

```js
const options = new PDFNet.DataExtractionModule.DataExtractionOptions();
options.setMinimumConfidenceThreshold(0.7);
await PDFNet.DataExtractionModule.extractData('Email.pdf', 'Email_Classified.json', PDFNet.DataExtractionModule.DataExtractionEngine.e_DocClassification, options);
```

{% endcode %}
{% endtab %}

{% tab title="PHP" %}
{% code lineNumbers="true" %}

```php
$options = new DataExtractionOptions();
$options->SetMinimumConfidenceThreshold(0.7);
DataExtractionModule::ExtractData("Email.pdf", "Email_Classified.json", DataExtractionModule::e_DocClassification, $options);
```

{% endcode %}
{% endtab %}

{% tab title="Python" %}
{% code lineNumbers="true" %}

```python
options = DataExtractionOptions()
options.SetMinimumConfidenceThreshold(0.7)
DataExtractionModule.ExtractData("Email.pdf", "Email_Classified.json", DataExtractionModule.e_DocClassification, options)
```

{% endcode %}
{% endtab %}

{% tab title="Ruby" %}
{% code lineNumbers="true" %}

```ruby
options = DataExtractionOptions.new()
options.SetMinimumConfidenceThreshold(0.7)
DataExtractionModule.ExtractData("Email.pdf", "Email_Classified.json", DataExtractionModule::E_DocClassification, options)
```

{% endcode %}
{% endtab %}

{% tab title="VB" %}
{% code lineNumbers="true" %}

```vb
Dim options = New DataExtractionOptions()
options.SetMinimumConfidenceThreshold(0.7)
DataExtractionModule.ExtractData("Email.pdf", "Email_Classified.json", DataExtractionModule.DataExtractionEngine.e_doc_classification, options)
```

{% endcode %}
{% endtab %}
{% endtabs %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.apryse.com/core/smart-data-extraction/workflow.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
