This is an automated email from the ASF dual-hosted git repository.

oscerd pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new 8b95ef19002a CAMEL-24422: camel-docling - make message body 
input-source interpretation explicit and configurable (#25596)
8b95ef19002a is described below

commit 8b95ef19002a86ed530563a6df0772140ddb5cd0
Author: Andrea Cosentino <[email protected]>
AuthorDate: Mon Aug 24 17:57:16 2026 +0200

    CAMEL-24422: camel-docling - make message body input-source interpretation 
explicit and configurable (#25596)
    
    DoclingProducer.getInputPath() decided what a String message body meant by
    inspecting its prefix: http:// or https:// was handed to Docling as a remote
    URL to fetch, a leading / or an embedded \ was read from the local 
filesystem,
    and anything else was converted as document content. The mode was chosen
    implicitly and the route author had no way to influence it.
    
    The two location readings are now opt-in:
    
    - allowUrlSource (default false) interprets a body starting with http:// or
      https:// as a URL.
    - allowFilePathSource (default false) interprets a body starting with / or
      containing \ as a local file path, including the single directory-or-file
      String body accepted by the batch operations.
    
    Refusing to interpret a body names the option that would enable it. A body
    that is neither a URL nor a path is still converted as content, unchanged.
    
    Only a bare String body is gated, because only it is ambiguous. The
    CamelDoclingInputFilePath header, File/byte[]/InputStream bodies and the
    explicit path collections used by the batch operations state their meaning
    already and keep working without an opt-in.
    
    A new inputBaseDirectory option bounds local input paths to a configured
    directory. It applies to the header, to file path bodies and to the batch
    paths, and covers all of them by resolving the path in one place. 
Containment
    normalizes lexically and compares on path-segment boundaries, so a sibling
    directory sharing a name prefix with the base is not accepted. When the base
    directory is set, relative paths resolve against it and the validated path 
is
    the one used downstream, so the path that was checked is the path that is 
read.
    
    The four independent copies of the http:// / https:// prefix test in
    getInputPath, addSourceToRequest, addSourceToChunkRequest and
    extractMetadataUsingApi now call a single isRemoteSource() helper, so new
    handling cannot be added to some of them and missed in others.
    
    validateFileSize is renamed to validateFileSizeIfPresent: it was wrapped in
    Files.exists() and so silently skipped a path that resolved to nothing, 
while
    reading at the call site as though a check had happened. Local input paths 
now
    go through validateLocalInputPath, which requires the path to exist and 
reports
    a missing one as File not found before Docling is invoked.
    
    Adds DoclingInputSourceValidationTest. The existing custom-argument test and
    the integration tests pass the input location in the body and have been 
updated
    to opt in, which is the same migration users perform.
    
    Signed-off-by: Andrea Cosentino <[email protected]>
    Co-authored-by: Claude Opus 5 (1M context) <[email protected]>
---
 .../apache/camel/catalog/components/docling.json   |  26 +-
 .../camel/catalog/docs/docling-component.adoc      |  49 +++-
 .../docling/DoclingComponentConfigurer.java        |  18 ++
 .../docling/DoclingConfigurationConfigurer.java    |  18 ++
 .../docling/DoclingEndpointConfigurer.java         |  18 ++
 .../docling/DoclingEndpointUriFactory.java         |   5 +-
 .../apache/camel/component/docling/docling.json    |  26 +-
 .../src/main/docs/docling-component.adoc           |  49 +++-
 .../component/docling/DoclingConfiguration.java    |  47 ++++
 .../camel/component/docling/DoclingProducer.java   | 129 ++++++++--
 .../docling/DoclingCustomArgsValidationTest.java   |   5 +-
 .../docling/DoclingInputSourceValidationTest.java  | 263 +++++++++++++++++++++
 .../integration/DoclingServeProducerIT.java        |  22 +-
 .../integration/ExtractStructuredDataIT.java       |   2 +-
 .../docling/integration/MetadataExtractionIT.java  |  12 +-
 .../docling/integration/OcrExtractionIT.java       |   8 +-
 .../java/org/apache/camel/util/SecurityUtils.java  |   2 +
 .../ROOT/pages/camel-4x-upgrade-guide-4_23.adoc    |  29 +++
 .../dsl/DoclingComponentBuilderFactory.java        |  62 +++++
 .../dsl/DoclingEndpointBuilderFactory.java         |  91 +++++++
 20 files changed, 818 insertions(+), 63 deletions(-)

diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/docling.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/docling.json
index 076ef6b2c72c..38f6f0002620 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/docling.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/docling.json
@@ -72,11 +72,14 @@
     "chunkingUseMarkdownTables": { "index": 45, "kind": "property", 
"displayName": "Chunking Use Markdown Tables", "group": "chunking", "label": 
"chunking", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "defaultValue": false, "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Use markdown format for  
[...]
     "includeMetadataInHeaders": { "index": 46, "kind": "property", 
"displayName": "Include Metadata In Headers", "group": "metadata", "label": 
"metadata", "required": false, "type": "boolean", "javaType": "boolean", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "defaultValue": true, "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Include metadata in 
message headers w [...]
     "includeRawMetadata": { "index": 47, "kind": "property", "displayName": 
"Include Raw Metadata", "group": "metadata", "label": "metadata", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "defaultValue": 
false, "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Include raw metadata as 
returned by the parser" },
-    "apiKeyHeader": { "index": 48, "kind": "property", "displayName": "Api Key 
Header", "group": "security", "label": "security", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "defaultValue": 
"X-API-Key", "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Header name for API key 
authentication" },
-    "authenticationScheme": { "index": 49, "kind": "property", "displayName": 
"Authentication Scheme", "group": "security", "label": "security", "required": 
false, "type": "enum", "javaType": 
"org.apache.camel.component.docling.AuthenticationScheme", "enum": [ "NONE", 
"BEARER", "API_KEY" ], "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "defaultValue": "NONE", "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", "configuration [...]
-    "authenticationToken": { "index": 50, "kind": "property", "displayName": 
"Authentication Token", "group": "security", "label": "security", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": true, "security": 
"secret", "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Authentication token for 
docling-serve API [...]
-    "maxFileSize": { "index": 51, "kind": "property", "displayName": "Max File 
Size", "group": "security", "label": "security", "required": false, "type": 
"integer", "javaType": "long", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "defaultValue": 52428800, 
"configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Maximum file size in 
bytes for processing" },
-    "oauthProfile": { "index": 52, "kind": "property", "displayName": "Oauth 
Profile", "group": "security", "label": "security", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, 
"configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "OAuth profile name for 
obtaining an access token via the OAuth 2.0 Client Cre [...]
+    "allowFilePathSource": { "index": 48, "kind": "property", "displayName": 
"Allow File Path Source", "group": "security", "label": "security", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "security": 
"insecure:dev", "defaultValue": false, "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Whether a String m [...]
+    "allowUrlSource": { "index": 49, "kind": "property", "displayName": "Allow 
Url Source", "group": "security", "label": "security", "required": false, 
"type": "boolean", "javaType": "boolean", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "security": 
"insecure:dev", "defaultValue": false, "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Whether a String message 
body [...]
+    "apiKeyHeader": { "index": 50, "kind": "property", "displayName": "Api Key 
Header", "group": "security", "label": "security", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "defaultValue": 
"X-API-Key", "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Header name for API key 
authentication" },
+    "authenticationScheme": { "index": 51, "kind": "property", "displayName": 
"Authentication Scheme", "group": "security", "label": "security", "required": 
false, "type": "enum", "javaType": 
"org.apache.camel.component.docling.AuthenticationScheme", "enum": [ "NONE", 
"BEARER", "API_KEY" ], "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "defaultValue": "NONE", "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", "configuration [...]
+    "authenticationToken": { "index": 52, "kind": "property", "displayName": 
"Authentication Token", "group": "security", "label": "security", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": true, "security": 
"secret", "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Authentication token for 
docling-serve API [...]
+    "inputBaseDirectory": { "index": 53, "kind": "property", "displayName": 
"Input Base Directory", "group": "security", "label": "security", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, 
"configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "When set, every local 
input file path must resolve inside this d [...]
+    "maxFileSize": { "index": 54, "kind": "property", "displayName": "Max File 
Size", "group": "security", "label": "security", "required": false, "type": 
"integer", "javaType": "long", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "defaultValue": 52428800, 
"configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Maximum file size in 
bytes for processing" },
+    "oauthProfile": { "index": 55, "kind": "property", "displayName": "Oauth 
Profile", "group": "security", "label": "security", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, 
"configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "OAuth profile name for 
obtaining an access token via the OAuth 2.0 Client Cre [...]
   },
   "headers": {
     "CamelDoclingOperation": { "index": 0, "kind": "header", "displayName": 
"", "group": "producer", "label": "", "required": false, "javaType": 
"DoclingOperations", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The operation to perform", 
"constantName": "org.apache.camel.component.docling.DoclingHeaders#OPERATION" },
@@ -160,10 +163,13 @@
     "chunkingUseMarkdownTables": { "index": 44, "kind": "parameter", 
"displayName": "Chunking Use Markdown Tables", "group": "chunking", "label": 
"chunking", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "defaultValue": false, "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Use markdown format for 
[...]
     "includeMetadataInHeaders": { "index": 45, "kind": "parameter", 
"displayName": "Include Metadata In Headers", "group": "metadata", "label": 
"metadata", "required": false, "type": "boolean", "javaType": "boolean", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "defaultValue": true, "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Include metadata in 
message headers  [...]
     "includeRawMetadata": { "index": 46, "kind": "parameter", "displayName": 
"Include Raw Metadata", "group": "metadata", "label": "metadata", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "defaultValue": 
false, "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Include raw metadata as 
returned by the parser" },
-    "apiKeyHeader": { "index": 47, "kind": "parameter", "displayName": "Api 
Key Header", "group": "security", "label": "security", "required": false, 
"type": "string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "defaultValue": 
"X-API-Key", "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Header name for API key 
authentication" },
-    "authenticationScheme": { "index": 48, "kind": "parameter", "displayName": 
"Authentication Scheme", "group": "security", "label": "security", "required": 
false, "type": "enum", "javaType": 
"org.apache.camel.component.docling.AuthenticationScheme", "enum": [ "NONE", 
"BEARER", "API_KEY" ], "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "defaultValue": "NONE", "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", "configuratio [...]
-    "authenticationToken": { "index": 49, "kind": "parameter", "displayName": 
"Authentication Token", "group": "security", "label": "security", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": true, "security": 
"secret", "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Authentication token for 
docling-serve AP [...]
-    "maxFileSize": { "index": 50, "kind": "parameter", "displayName": "Max 
File Size", "group": "security", "label": "security", "required": false, 
"type": "integer", "javaType": "long", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "defaultValue": 52428800, 
"configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Maximum file size in 
bytes for processing" },
-    "oauthProfile": { "index": 51, "kind": "parameter", "displayName": "Oauth 
Profile", "group": "security", "label": "security", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, 
"configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "OAuth profile name for 
obtaining an access token via the OAuth 2.0 Client Cr [...]
+    "allowFilePathSource": { "index": 47, "kind": "parameter", "displayName": 
"Allow File Path Source", "group": "security", "label": "security", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "security": 
"insecure:dev", "defaultValue": false, "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Whether a String  [...]
+    "allowUrlSource": { "index": 48, "kind": "parameter", "displayName": 
"Allow Url Source", "group": "security", "label": "security", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "security": 
"insecure:dev", "defaultValue": false, "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Whether a String message 
bod [...]
+    "apiKeyHeader": { "index": 49, "kind": "parameter", "displayName": "Api 
Key Header", "group": "security", "label": "security", "required": false, 
"type": "string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "defaultValue": 
"X-API-Key", "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Header name for API key 
authentication" },
+    "authenticationScheme": { "index": 50, "kind": "parameter", "displayName": 
"Authentication Scheme", "group": "security", "label": "security", "required": 
false, "type": "enum", "javaType": 
"org.apache.camel.component.docling.AuthenticationScheme", "enum": [ "NONE", 
"BEARER", "API_KEY" ], "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "defaultValue": "NONE", "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", "configuratio [...]
+    "authenticationToken": { "index": 51, "kind": "parameter", "displayName": 
"Authentication Token", "group": "security", "label": "security", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": true, "security": 
"secret", "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Authentication token for 
docling-serve AP [...]
+    "inputBaseDirectory": { "index": 52, "kind": "parameter", "displayName": 
"Input Base Directory", "group": "security", "label": "security", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, 
"configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "When set, every local 
input file path must resolve inside this  [...]
+    "maxFileSize": { "index": 53, "kind": "parameter", "displayName": "Max 
File Size", "group": "security", "label": "security", "required": false, 
"type": "integer", "javaType": "long", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "defaultValue": 52428800, 
"configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Maximum file size in 
bytes for processing" },
+    "oauthProfile": { "index": 54, "kind": "parameter", "displayName": "Oauth 
Profile", "group": "security", "label": "security", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, 
"configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "OAuth profile name for 
obtaining an access token via the OAuth 2.0 Client Cr [...]
   }
 }
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/docling-component.adoc
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/docling-component.adoc
index 5749758df6fb..0aef255d2be8 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/docling-component.adoc
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/docling-component.adoc
@@ -118,11 +118,58 @@ include::partial$component-endpoint-headers.adoc[]
 
 The component accepts the following input types in the message body:
 
-- `String` - File path or document content
+- `String` - Document content. It is only read as a location when the endpoint 
opts in - see <<_input_sources>> below
 - `byte[]` - Binary document content
 - `File` - File object
 - `InputStream` - Input stream containing document data
 
+For the batch operations the body may also be a `List<String>` or `String[]` 
of file paths, a `List<File>`
+or `File[]`, or a single directory path `String`.
+
+[#_input_sources]
+=== Input Sources
+
+A `String` body is ambiguous: it could be the document itself, a URL to fetch, 
or a path to read. By default
+the component treats it as the document, and the two location readings must be 
enabled explicitly:
+
+[cols="1,1,3", options="header"]
+|===
+| Option | Default | Effect when enabled
+
+| `allowUrlSource`
+| `false`
+| A body starting with `http://` or `https://` is handed to Docling as a 
remote URL to fetch.
+
+| `allowFilePathSource`
+| `false`
+| A body starting with `/`, or containing `\`, is read from the local 
filesystem. This also covers the single
+directory-or-file `String` body accepted by the batch operations.
+
+| `inputBaseDirectory`
+| _(none)_
+| When set, every local input path must resolve inside this directory once 
normalized. Applies to the
+`CamelDoclingInputFilePath` header, to file path bodies, and to the paths used 
by the batch operations.
+|===
+
+With both options left at their defaults, a body that is neither a URL nor a 
path is written to a temporary
+file and converted as document content, exactly as before.
+
+The `CamelDoclingInputFilePath` header is an explicit "the document lives 
here" signal from the route, so it
+keeps working without `allowFilePathSource`. It is still subject to 
`inputBaseDirectory` when one is set.
+Typed bodies - `File`, `byte[]`, `InputStream`, and the explicit path 
collections used by the batch
+operations - are unambiguous and are likewise unaffected.
+
+[source,java]
+----
+// the body is the document itself - no opt-in needed
+from("direct:content")
+    .to("docling:convert?operation=CONVERT_TO_MARKDOWN");
+
+// the body is a path, confined to /var/docs
+from("direct:paths")
+    
.to("docling:convert?operation=CONVERT_TO_MARKDOWN&allowFilePathSource=true&inputBaseDirectory=/var/docs");
+----
+
 === Output Behavior
 
 The component behavior depends on the `contentInBody` configuration option:
diff --git 
a/components/camel-ai/camel-docling/src/generated/java/org/apache/camel/component/docling/DoclingComponentConfigurer.java
 
b/components/camel-ai/camel-docling/src/generated/java/org/apache/camel/component/docling/DoclingComponentConfigurer.java
index d55a7a8724ac..db93f1ea2817 100644
--- 
a/components/camel-ai/camel-docling/src/generated/java/org/apache/camel/component/docling/DoclingComponentConfigurer.java
+++ 
b/components/camel-ai/camel-docling/src/generated/java/org/apache/camel/component/docling/DoclingComponentConfigurer.java
@@ -32,6 +32,10 @@ public class DoclingComponentConfigurer extends 
PropertyConfigurerSupport implem
         switch (ignoreCase ? name.toLowerCase() : name) {
         case "abortonerror":
         case "abortOnError": 
getOrCreateConfiguration(target).setAbortOnError(property(camelContext, 
java.lang.Boolean.class, value)); return true;
+        case "allowfilepathsource":
+        case "allowFilePathSource": 
getOrCreateConfiguration(target).setAllowFilePathSource(property(camelContext, 
boolean.class, value)); return true;
+        case "allowurlsource":
+        case "allowUrlSource": 
getOrCreateConfiguration(target).setAllowUrlSource(property(camelContext, 
boolean.class, value)); return true;
         case "apikeyheader":
         case "apiKeyHeader": 
getOrCreateConfiguration(target).setApiKeyHeader(property(camelContext, 
java.lang.String.class, value)); return true;
         case "asyncpollinterval":
@@ -101,6 +105,8 @@ public class DoclingComponentConfigurer extends 
PropertyConfigurerSupport implem
         case "includeMetadataInHeaders": 
getOrCreateConfiguration(target).setIncludeMetadataInHeaders(property(camelContext,
 boolean.class, value)); return true;
         case "includerawmetadata":
         case "includeRawMetadata": 
getOrCreateConfiguration(target).setIncludeRawMetadata(property(camelContext, 
boolean.class, value)); return true;
+        case "inputbasedirectory":
+        case "inputBaseDirectory": 
getOrCreateConfiguration(target).setInputBaseDirectory(property(camelContext, 
java.lang.String.class, value)); return true;
         case "lazystartproducer":
         case "lazyStartProducer": 
target.setLazyStartProducer(property(camelContext, boolean.class, value)); 
return true;
         case "maxfilesize":
@@ -142,6 +148,10 @@ public class DoclingComponentConfigurer extends 
PropertyConfigurerSupport implem
         switch (ignoreCase ? name.toLowerCase() : name) {
         case "abortonerror":
         case "abortOnError": return java.lang.Boolean.class;
+        case "allowfilepathsource":
+        case "allowFilePathSource": return boolean.class;
+        case "allowurlsource":
+        case "allowUrlSource": return boolean.class;
         case "apikeyheader":
         case "apiKeyHeader": return java.lang.String.class;
         case "asyncpollinterval":
@@ -211,6 +221,8 @@ public class DoclingComponentConfigurer extends 
PropertyConfigurerSupport implem
         case "includeMetadataInHeaders": return boolean.class;
         case "includerawmetadata":
         case "includeRawMetadata": return boolean.class;
+        case "inputbasedirectory":
+        case "inputBaseDirectory": return java.lang.String.class;
         case "lazystartproducer":
         case "lazyStartProducer": return boolean.class;
         case "maxfilesize":
@@ -253,6 +265,10 @@ public class DoclingComponentConfigurer extends 
PropertyConfigurerSupport implem
         switch (ignoreCase ? name.toLowerCase() : name) {
         case "abortonerror":
         case "abortOnError": return 
getOrCreateConfiguration(target).getAbortOnError();
+        case "allowfilepathsource":
+        case "allowFilePathSource": return 
getOrCreateConfiguration(target).isAllowFilePathSource();
+        case "allowurlsource":
+        case "allowUrlSource": return 
getOrCreateConfiguration(target).isAllowUrlSource();
         case "apikeyheader":
         case "apiKeyHeader": return 
getOrCreateConfiguration(target).getApiKeyHeader();
         case "asyncpollinterval":
@@ -322,6 +338,8 @@ public class DoclingComponentConfigurer extends 
PropertyConfigurerSupport implem
         case "includeMetadataInHeaders": return 
getOrCreateConfiguration(target).isIncludeMetadataInHeaders();
         case "includerawmetadata":
         case "includeRawMetadata": return 
getOrCreateConfiguration(target).isIncludeRawMetadata();
+        case "inputbasedirectory":
+        case "inputBaseDirectory": return 
getOrCreateConfiguration(target).getInputBaseDirectory();
         case "lazystartproducer":
         case "lazyStartProducer": return target.isLazyStartProducer();
         case "maxfilesize":
diff --git 
a/components/camel-ai/camel-docling/src/generated/java/org/apache/camel/component/docling/DoclingConfigurationConfigurer.java
 
b/components/camel-ai/camel-docling/src/generated/java/org/apache/camel/component/docling/DoclingConfigurationConfigurer.java
index 44c19bdc57bb..acba9c6e6930 100644
--- 
a/components/camel-ai/camel-docling/src/generated/java/org/apache/camel/component/docling/DoclingConfigurationConfigurer.java
+++ 
b/components/camel-ai/camel-docling/src/generated/java/org/apache/camel/component/docling/DoclingConfigurationConfigurer.java
@@ -25,6 +25,10 @@ public class DoclingConfigurationConfigurer extends 
org.apache.camel.support.com
         switch (ignoreCase ? name.toLowerCase() : name) {
         case "abortonerror":
         case "abortOnError": target.setAbortOnError(property(camelContext, 
java.lang.Boolean.class, value)); return true;
+        case "allowfilepathsource":
+        case "allowFilePathSource": 
target.setAllowFilePathSource(property(camelContext, boolean.class, value)); 
return true;
+        case "allowurlsource":
+        case "allowUrlSource": target.setAllowUrlSource(property(camelContext, 
boolean.class, value)); return true;
         case "apikeyheader":
         case "apiKeyHeader": target.setApiKeyHeader(property(camelContext, 
java.lang.String.class, value)); return true;
         case "asyncpollinterval":
@@ -91,6 +95,8 @@ public class DoclingConfigurationConfigurer extends 
org.apache.camel.support.com
         case "includeMetadataInHeaders": 
target.setIncludeMetadataInHeaders(property(camelContext, boolean.class, 
value)); return true;
         case "includerawmetadata":
         case "includeRawMetadata": 
target.setIncludeRawMetadata(property(camelContext, boolean.class, value)); 
return true;
+        case "inputbasedirectory":
+        case "inputBaseDirectory": 
target.setInputBaseDirectory(property(camelContext, java.lang.String.class, 
value)); return true;
         case "maxfilesize":
         case "maxFileSize": target.setMaxFileSize(property(camelContext, 
long.class, value)); return true;
         case "mdpagebreakplaceholder":
@@ -130,6 +136,10 @@ public class DoclingConfigurationConfigurer extends 
org.apache.camel.support.com
         switch (ignoreCase ? name.toLowerCase() : name) {
         case "abortonerror":
         case "abortOnError": return java.lang.Boolean.class;
+        case "allowfilepathsource":
+        case "allowFilePathSource": return boolean.class;
+        case "allowurlsource":
+        case "allowUrlSource": return boolean.class;
         case "apikeyheader":
         case "apiKeyHeader": return java.lang.String.class;
         case "asyncpollinterval":
@@ -196,6 +206,8 @@ public class DoclingConfigurationConfigurer extends 
org.apache.camel.support.com
         case "includeMetadataInHeaders": return boolean.class;
         case "includerawmetadata":
         case "includeRawMetadata": return boolean.class;
+        case "inputbasedirectory":
+        case "inputBaseDirectory": return java.lang.String.class;
         case "maxfilesize":
         case "maxFileSize": return long.class;
         case "mdpagebreakplaceholder":
@@ -236,6 +248,10 @@ public class DoclingConfigurationConfigurer extends 
org.apache.camel.support.com
         switch (ignoreCase ? name.toLowerCase() : name) {
         case "abortonerror":
         case "abortOnError": return target.getAbortOnError();
+        case "allowfilepathsource":
+        case "allowFilePathSource": return target.isAllowFilePathSource();
+        case "allowurlsource":
+        case "allowUrlSource": return target.isAllowUrlSource();
         case "apikeyheader":
         case "apiKeyHeader": return target.getApiKeyHeader();
         case "asyncpollinterval":
@@ -302,6 +318,8 @@ public class DoclingConfigurationConfigurer extends 
org.apache.camel.support.com
         case "includeMetadataInHeaders": return 
target.isIncludeMetadataInHeaders();
         case "includerawmetadata":
         case "includeRawMetadata": return target.isIncludeRawMetadata();
+        case "inputbasedirectory":
+        case "inputBaseDirectory": return target.getInputBaseDirectory();
         case "maxfilesize":
         case "maxFileSize": return target.getMaxFileSize();
         case "mdpagebreakplaceholder":
diff --git 
a/components/camel-ai/camel-docling/src/generated/java/org/apache/camel/component/docling/DoclingEndpointConfigurer.java
 
b/components/camel-ai/camel-docling/src/generated/java/org/apache/camel/component/docling/DoclingEndpointConfigurer.java
index b671a1aa3145..483440f5e27a 100644
--- 
a/components/camel-ai/camel-docling/src/generated/java/org/apache/camel/component/docling/DoclingEndpointConfigurer.java
+++ 
b/components/camel-ai/camel-docling/src/generated/java/org/apache/camel/component/docling/DoclingEndpointConfigurer.java
@@ -25,6 +25,10 @@ public class DoclingEndpointConfigurer extends 
PropertyConfigurerSupport impleme
         switch (ignoreCase ? name.toLowerCase() : name) {
         case "abortonerror":
         case "abortOnError": 
target.getConfiguration().setAbortOnError(property(camelContext, 
java.lang.Boolean.class, value)); return true;
+        case "allowfilepathsource":
+        case "allowFilePathSource": 
target.getConfiguration().setAllowFilePathSource(property(camelContext, 
boolean.class, value)); return true;
+        case "allowurlsource":
+        case "allowUrlSource": 
target.getConfiguration().setAllowUrlSource(property(camelContext, 
boolean.class, value)); return true;
         case "apikeyheader":
         case "apiKeyHeader": 
target.getConfiguration().setApiKeyHeader(property(camelContext, 
java.lang.String.class, value)); return true;
         case "asyncpollinterval":
@@ -91,6 +95,8 @@ public class DoclingEndpointConfigurer extends 
PropertyConfigurerSupport impleme
         case "includeMetadataInHeaders": 
target.getConfiguration().setIncludeMetadataInHeaders(property(camelContext, 
boolean.class, value)); return true;
         case "includerawmetadata":
         case "includeRawMetadata": 
target.getConfiguration().setIncludeRawMetadata(property(camelContext, 
boolean.class, value)); return true;
+        case "inputbasedirectory":
+        case "inputBaseDirectory": 
target.getConfiguration().setInputBaseDirectory(property(camelContext, 
java.lang.String.class, value)); return true;
         case "lazystartproducer":
         case "lazyStartProducer": 
target.setLazyStartProducer(property(camelContext, boolean.class, value)); 
return true;
         case "maxfilesize":
@@ -132,6 +138,10 @@ public class DoclingEndpointConfigurer extends 
PropertyConfigurerSupport impleme
         switch (ignoreCase ? name.toLowerCase() : name) {
         case "abortonerror":
         case "abortOnError": return java.lang.Boolean.class;
+        case "allowfilepathsource":
+        case "allowFilePathSource": return boolean.class;
+        case "allowurlsource":
+        case "allowUrlSource": return boolean.class;
         case "apikeyheader":
         case "apiKeyHeader": return java.lang.String.class;
         case "asyncpollinterval":
@@ -198,6 +208,8 @@ public class DoclingEndpointConfigurer extends 
PropertyConfigurerSupport impleme
         case "includeMetadataInHeaders": return boolean.class;
         case "includerawmetadata":
         case "includeRawMetadata": return boolean.class;
+        case "inputbasedirectory":
+        case "inputBaseDirectory": return java.lang.String.class;
         case "lazystartproducer":
         case "lazyStartProducer": return boolean.class;
         case "maxfilesize":
@@ -240,6 +252,10 @@ public class DoclingEndpointConfigurer extends 
PropertyConfigurerSupport impleme
         switch (ignoreCase ? name.toLowerCase() : name) {
         case "abortonerror":
         case "abortOnError": return 
target.getConfiguration().getAbortOnError();
+        case "allowfilepathsource":
+        case "allowFilePathSource": return 
target.getConfiguration().isAllowFilePathSource();
+        case "allowurlsource":
+        case "allowUrlSource": return 
target.getConfiguration().isAllowUrlSource();
         case "apikeyheader":
         case "apiKeyHeader": return 
target.getConfiguration().getApiKeyHeader();
         case "asyncpollinterval":
@@ -306,6 +322,8 @@ public class DoclingEndpointConfigurer extends 
PropertyConfigurerSupport impleme
         case "includeMetadataInHeaders": return 
target.getConfiguration().isIncludeMetadataInHeaders();
         case "includerawmetadata":
         case "includeRawMetadata": return 
target.getConfiguration().isIncludeRawMetadata();
+        case "inputbasedirectory":
+        case "inputBaseDirectory": return 
target.getConfiguration().getInputBaseDirectory();
         case "lazystartproducer":
         case "lazyStartProducer": return target.isLazyStartProducer();
         case "maxfilesize":
diff --git 
a/components/camel-ai/camel-docling/src/generated/java/org/apache/camel/component/docling/DoclingEndpointUriFactory.java
 
b/components/camel-ai/camel-docling/src/generated/java/org/apache/camel/component/docling/DoclingEndpointUriFactory.java
index da2cec58aafc..e0462bf46ed4 100644
--- 
a/components/camel-ai/camel-docling/src/generated/java/org/apache/camel/component/docling/DoclingEndpointUriFactory.java
+++ 
b/components/camel-ai/camel-docling/src/generated/java/org/apache/camel/component/docling/DoclingEndpointUriFactory.java
@@ -24,8 +24,10 @@ public class DoclingEndpointUriFactory extends 
org.apache.camel.support.componen
     private static final Set<String> ENDPOINT_IDENTITY_PROPERTY_NAMES;
     private static final Map<String, String> MULTI_VALUE_PREFIXES;
     static {
-        Set<String> props = new HashSet<>(52);
+        Set<String> props = new HashSet<>(55);
         props.add("abortOnError");
+        props.add("allowFilePathSource");
+        props.add("allowUrlSource");
         props.add("apiKeyHeader");
         props.add("asyncPollInterval");
         props.add("asyncTaskTtl");
@@ -59,6 +61,7 @@ public class DoclingEndpointUriFactory extends 
org.apache.camel.support.componen
         props.add("includeLayoutInfo");
         props.add("includeMetadataInHeaders");
         props.add("includeRawMetadata");
+        props.add("inputBaseDirectory");
         props.add("lazyStartProducer");
         props.add("maxFileSize");
         props.add("mdPageBreakPlaceholder");
diff --git 
a/components/camel-ai/camel-docling/src/generated/resources/META-INF/org/apache/camel/component/docling/docling.json
 
b/components/camel-ai/camel-docling/src/generated/resources/META-INF/org/apache/camel/component/docling/docling.json
index 076ef6b2c72c..38f6f0002620 100644
--- 
a/components/camel-ai/camel-docling/src/generated/resources/META-INF/org/apache/camel/component/docling/docling.json
+++ 
b/components/camel-ai/camel-docling/src/generated/resources/META-INF/org/apache/camel/component/docling/docling.json
@@ -72,11 +72,14 @@
     "chunkingUseMarkdownTables": { "index": 45, "kind": "property", 
"displayName": "Chunking Use Markdown Tables", "group": "chunking", "label": 
"chunking", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "defaultValue": false, "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Use markdown format for  
[...]
     "includeMetadataInHeaders": { "index": 46, "kind": "property", 
"displayName": "Include Metadata In Headers", "group": "metadata", "label": 
"metadata", "required": false, "type": "boolean", "javaType": "boolean", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "defaultValue": true, "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Include metadata in 
message headers w [...]
     "includeRawMetadata": { "index": 47, "kind": "property", "displayName": 
"Include Raw Metadata", "group": "metadata", "label": "metadata", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "defaultValue": 
false, "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Include raw metadata as 
returned by the parser" },
-    "apiKeyHeader": { "index": 48, "kind": "property", "displayName": "Api Key 
Header", "group": "security", "label": "security", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "defaultValue": 
"X-API-Key", "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Header name for API key 
authentication" },
-    "authenticationScheme": { "index": 49, "kind": "property", "displayName": 
"Authentication Scheme", "group": "security", "label": "security", "required": 
false, "type": "enum", "javaType": 
"org.apache.camel.component.docling.AuthenticationScheme", "enum": [ "NONE", 
"BEARER", "API_KEY" ], "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "defaultValue": "NONE", "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", "configuration [...]
-    "authenticationToken": { "index": 50, "kind": "property", "displayName": 
"Authentication Token", "group": "security", "label": "security", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": true, "security": 
"secret", "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Authentication token for 
docling-serve API [...]
-    "maxFileSize": { "index": 51, "kind": "property", "displayName": "Max File 
Size", "group": "security", "label": "security", "required": false, "type": 
"integer", "javaType": "long", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "defaultValue": 52428800, 
"configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Maximum file size in 
bytes for processing" },
-    "oauthProfile": { "index": 52, "kind": "property", "displayName": "Oauth 
Profile", "group": "security", "label": "security", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, 
"configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "OAuth profile name for 
obtaining an access token via the OAuth 2.0 Client Cre [...]
+    "allowFilePathSource": { "index": 48, "kind": "property", "displayName": 
"Allow File Path Source", "group": "security", "label": "security", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "security": 
"insecure:dev", "defaultValue": false, "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Whether a String m [...]
+    "allowUrlSource": { "index": 49, "kind": "property", "displayName": "Allow 
Url Source", "group": "security", "label": "security", "required": false, 
"type": "boolean", "javaType": "boolean", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "security": 
"insecure:dev", "defaultValue": false, "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Whether a String message 
body [...]
+    "apiKeyHeader": { "index": 50, "kind": "property", "displayName": "Api Key 
Header", "group": "security", "label": "security", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "defaultValue": 
"X-API-Key", "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Header name for API key 
authentication" },
+    "authenticationScheme": { "index": 51, "kind": "property", "displayName": 
"Authentication Scheme", "group": "security", "label": "security", "required": 
false, "type": "enum", "javaType": 
"org.apache.camel.component.docling.AuthenticationScheme", "enum": [ "NONE", 
"BEARER", "API_KEY" ], "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "defaultValue": "NONE", "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", "configuration [...]
+    "authenticationToken": { "index": 52, "kind": "property", "displayName": 
"Authentication Token", "group": "security", "label": "security", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": true, "security": 
"secret", "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Authentication token for 
docling-serve API [...]
+    "inputBaseDirectory": { "index": 53, "kind": "property", "displayName": 
"Input Base Directory", "group": "security", "label": "security", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, 
"configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "When set, every local 
input file path must resolve inside this d [...]
+    "maxFileSize": { "index": 54, "kind": "property", "displayName": "Max File 
Size", "group": "security", "label": "security", "required": false, "type": 
"integer", "javaType": "long", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "defaultValue": 52428800, 
"configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Maximum file size in 
bytes for processing" },
+    "oauthProfile": { "index": 55, "kind": "property", "displayName": "Oauth 
Profile", "group": "security", "label": "security", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, 
"configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "OAuth profile name for 
obtaining an access token via the OAuth 2.0 Client Cre [...]
   },
   "headers": {
     "CamelDoclingOperation": { "index": 0, "kind": "header", "displayName": 
"", "group": "producer", "label": "", "required": false, "javaType": 
"DoclingOperations", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The operation to perform", 
"constantName": "org.apache.camel.component.docling.DoclingHeaders#OPERATION" },
@@ -160,10 +163,13 @@
     "chunkingUseMarkdownTables": { "index": 44, "kind": "parameter", 
"displayName": "Chunking Use Markdown Tables", "group": "chunking", "label": 
"chunking", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "defaultValue": false, "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Use markdown format for 
[...]
     "includeMetadataInHeaders": { "index": 45, "kind": "parameter", 
"displayName": "Include Metadata In Headers", "group": "metadata", "label": 
"metadata", "required": false, "type": "boolean", "javaType": "boolean", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "defaultValue": true, "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Include metadata in 
message headers  [...]
     "includeRawMetadata": { "index": 46, "kind": "parameter", "displayName": 
"Include Raw Metadata", "group": "metadata", "label": "metadata", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "defaultValue": 
false, "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Include raw metadata as 
returned by the parser" },
-    "apiKeyHeader": { "index": 47, "kind": "parameter", "displayName": "Api 
Key Header", "group": "security", "label": "security", "required": false, 
"type": "string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "defaultValue": 
"X-API-Key", "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Header name for API key 
authentication" },
-    "authenticationScheme": { "index": 48, "kind": "parameter", "displayName": 
"Authentication Scheme", "group": "security", "label": "security", "required": 
false, "type": "enum", "javaType": 
"org.apache.camel.component.docling.AuthenticationScheme", "enum": [ "NONE", 
"BEARER", "API_KEY" ], "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "defaultValue": "NONE", "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", "configuratio [...]
-    "authenticationToken": { "index": 49, "kind": "parameter", "displayName": 
"Authentication Token", "group": "security", "label": "security", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": true, "security": 
"secret", "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Authentication token for 
docling-serve AP [...]
-    "maxFileSize": { "index": 50, "kind": "parameter", "displayName": "Max 
File Size", "group": "security", "label": "security", "required": false, 
"type": "integer", "javaType": "long", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "defaultValue": 52428800, 
"configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Maximum file size in 
bytes for processing" },
-    "oauthProfile": { "index": 51, "kind": "parameter", "displayName": "Oauth 
Profile", "group": "security", "label": "security", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, 
"configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "OAuth profile name for 
obtaining an access token via the OAuth 2.0 Client Cr [...]
+    "allowFilePathSource": { "index": 47, "kind": "parameter", "displayName": 
"Allow File Path Source", "group": "security", "label": "security", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "security": 
"insecure:dev", "defaultValue": false, "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Whether a String  [...]
+    "allowUrlSource": { "index": 48, "kind": "parameter", "displayName": 
"Allow Url Source", "group": "security", "label": "security", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "security": 
"insecure:dev", "defaultValue": false, "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Whether a String message 
bod [...]
+    "apiKeyHeader": { "index": 49, "kind": "parameter", "displayName": "Api 
Key Header", "group": "security", "label": "security", "required": false, 
"type": "string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "defaultValue": 
"X-API-Key", "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Header name for API key 
authentication" },
+    "authenticationScheme": { "index": 50, "kind": "parameter", "displayName": 
"Authentication Scheme", "group": "security", "label": "security", "required": 
false, "type": "enum", "javaType": 
"org.apache.camel.component.docling.AuthenticationScheme", "enum": [ "NONE", 
"BEARER", "API_KEY" ], "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "defaultValue": "NONE", "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", "configuratio [...]
+    "authenticationToken": { "index": 51, "kind": "parameter", "displayName": 
"Authentication Token", "group": "security", "label": "security", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": true, "security": 
"secret", "configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Authentication token for 
docling-serve AP [...]
+    "inputBaseDirectory": { "index": 52, "kind": "parameter", "displayName": 
"Input Base Directory", "group": "security", "label": "security", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, 
"configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "When set, every local 
input file path must resolve inside this  [...]
+    "maxFileSize": { "index": 53, "kind": "parameter", "displayName": "Max 
File Size", "group": "security", "label": "security", "required": false, 
"type": "integer", "javaType": "long", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "defaultValue": 52428800, 
"configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "Maximum file size in 
bytes for processing" },
+    "oauthProfile": { "index": 54, "kind": "parameter", "displayName": "Oauth 
Profile", "group": "security", "label": "security", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, 
"configurationClass": 
"org.apache.camel.component.docling.DoclingConfiguration", 
"configurationField": "configuration", "description": "OAuth profile name for 
obtaining an access token via the OAuth 2.0 Client Cr [...]
   }
 }
diff --git 
a/components/camel-ai/camel-docling/src/main/docs/docling-component.adoc 
b/components/camel-ai/camel-docling/src/main/docs/docling-component.adoc
index 5749758df6fb..0aef255d2be8 100644
--- a/components/camel-ai/camel-docling/src/main/docs/docling-component.adoc
+++ b/components/camel-ai/camel-docling/src/main/docs/docling-component.adoc
@@ -118,11 +118,58 @@ include::partial$component-endpoint-headers.adoc[]
 
 The component accepts the following input types in the message body:
 
-- `String` - File path or document content
+- `String` - Document content. It is only read as a location when the endpoint 
opts in - see <<_input_sources>> below
 - `byte[]` - Binary document content
 - `File` - File object
 - `InputStream` - Input stream containing document data
 
+For the batch operations the body may also be a `List<String>` or `String[]` 
of file paths, a `List<File>`
+or `File[]`, or a single directory path `String`.
+
+[#_input_sources]
+=== Input Sources
+
+A `String` body is ambiguous: it could be the document itself, a URL to fetch, 
or a path to read. By default
+the component treats it as the document, and the two location readings must be 
enabled explicitly:
+
+[cols="1,1,3", options="header"]
+|===
+| Option | Default | Effect when enabled
+
+| `allowUrlSource`
+| `false`
+| A body starting with `http://` or `https://` is handed to Docling as a 
remote URL to fetch.
+
+| `allowFilePathSource`
+| `false`
+| A body starting with `/`, or containing `\`, is read from the local 
filesystem. This also covers the single
+directory-or-file `String` body accepted by the batch operations.
+
+| `inputBaseDirectory`
+| _(none)_
+| When set, every local input path must resolve inside this directory once 
normalized. Applies to the
+`CamelDoclingInputFilePath` header, to file path bodies, and to the paths used 
by the batch operations.
+|===
+
+With both options left at their defaults, a body that is neither a URL nor a 
path is written to a temporary
+file and converted as document content, exactly as before.
+
+The `CamelDoclingInputFilePath` header is an explicit "the document lives 
here" signal from the route, so it
+keeps working without `allowFilePathSource`. It is still subject to 
`inputBaseDirectory` when one is set.
+Typed bodies - `File`, `byte[]`, `InputStream`, and the explicit path 
collections used by the batch
+operations - are unambiguous and are likewise unaffected.
+
+[source,java]
+----
+// the body is the document itself - no opt-in needed
+from("direct:content")
+    .to("docling:convert?operation=CONVERT_TO_MARKDOWN");
+
+// the body is a path, confined to /var/docs
+from("direct:paths")
+    
.to("docling:convert?operation=CONVERT_TO_MARKDOWN&allowFilePathSource=true&inputBaseDirectory=/var/docs");
+----
+
 === Output Behavior
 
 The component behavior depends on the `contentInBody` configuration option:
diff --git 
a/components/camel-ai/camel-docling/src/main/java/org/apache/camel/component/docling/DoclingConfiguration.java
 
b/components/camel-ai/camel-docling/src/main/java/org/apache/camel/component/docling/DoclingConfiguration.java
index 3a3f3cab6af8..ed381e76e51b 100644
--- 
a/components/camel-ai/camel-docling/src/main/java/org/apache/camel/component/docling/DoclingConfiguration.java
+++ 
b/components/camel-ai/camel-docling/src/main/java/org/apache/camel/component/docling/DoclingConfiguration.java
@@ -68,6 +68,29 @@ public class DoclingConfiguration implements Cloneable {
     @Metadata(description = "Maximum file size in bytes for processing", 
defaultValue = "52428800")
     private long maxFileSize = 50 * 1024 * 1024; // 50MB
 
+    @UriParam(label = "security", security = "insecure:dev")
+    @Metadata(description = "Whether a String message body that starts with 
http:// or https:// is interpreted as a"
+                            + " remote URL for Docling to fetch. When 
disabled, such a body is rejected instead of"
+                            + " being fetched. This does not affect the 
CamelDoclingInputFilePath header, nor bodies"
+                            + " of any other type.",
+              defaultValue = "false")
+    private boolean allowUrlSource;
+
+    @UriParam(label = "security", security = "insecure:dev")
+    @Metadata(description = "Whether a String message body that starts with / 
or contains \\ is interpreted as a"
+                            + " local filesystem path to read. When disabled, 
such a body is rejected instead of"
+                            + " being read. This does not affect the 
CamelDoclingInputFilePath header, nor File,"
+                            + " byte[] or explicit path collection bodies used 
by the batch operations.",
+              defaultValue = "false")
+    private boolean allowFilePathSource;
+
+    @UriParam(label = "security")
+    @Metadata(description = "When set, every local input file path must 
resolve inside this directory once"
+                            + " normalized. Applies to the 
CamelDoclingInputFilePath header, to file path message"
+                            + " bodies, and to the paths used by the batch 
operations. When empty, no directory"
+                            + " restriction is applied.")
+    private String inputBaseDirectory;
+
     @UriParam
     @Metadata(description = "Include the content of the output file in the 
exchange body and delete the output file",
               defaultValue = "false")
@@ -315,6 +338,30 @@ public class DoclingConfiguration implements Cloneable {
         this.maxFileSize = maxFileSize;
     }
 
+    public boolean isAllowUrlSource() {
+        return allowUrlSource;
+    }
+
+    public void setAllowUrlSource(boolean allowUrlSource) {
+        this.allowUrlSource = allowUrlSource;
+    }
+
+    public boolean isAllowFilePathSource() {
+        return allowFilePathSource;
+    }
+
+    public void setAllowFilePathSource(boolean allowFilePathSource) {
+        this.allowFilePathSource = allowFilePathSource;
+    }
+
+    public String getInputBaseDirectory() {
+        return inputBaseDirectory;
+    }
+
+    public void setInputBaseDirectory(String inputBaseDirectory) {
+        this.inputBaseDirectory = inputBaseDirectory;
+    }
+
     public boolean isContentInBody() {
         return contentInBody;
     }
diff --git 
a/components/camel-ai/camel-docling/src/main/java/org/apache/camel/component/docling/DoclingProducer.java
 
b/components/camel-ai/camel-docling/src/main/java/org/apache/camel/component/docling/DoclingProducer.java
index cd970853e290..6261d7665204 100644
--- 
a/components/camel-ai/camel-docling/src/main/java/org/apache/camel/component/docling/DoclingProducer.java
+++ 
b/components/camel-ai/camel-docling/src/main/java/org/apache/camel/component/docling/DoclingProducer.java
@@ -625,7 +625,7 @@ public class DoclingProducer extends DefaultProducer {
     private void addSourceToChunkRequest(
             ChunkDocumentRequest.Builder requestBuilder, String inputSource)
             throws IOException {
-        if (inputSource.startsWith("http://";) || 
inputSource.startsWith("https://";)) {
+        if (isRemoteSource(inputSource)) {
             requestBuilder.source(
                     HttpSource.builder()
                             .url(URI.create(inputSource))
@@ -667,7 +667,7 @@ public class DoclingProducer extends DefaultProducer {
 
         try {
             // Extract basic file information for file paths
-            if (!inputPath.startsWith("http://";) && 
!inputPath.startsWith("https://";)) {
+            if (!isRemoteSource(inputPath)) {
                 File file = new File(inputPath);
                 if (file.exists()) {
                     metadata.setFileName(file.getName());
@@ -1046,7 +1046,27 @@ public class DoclingProducer extends DefaultProducer {
     }
 
     @SuppressWarnings("unchecked")
-    private List<String> extractDocumentList(Exchange exchange) {
+    private List<String> extractDocumentList(Exchange exchange) throws 
IOException {
+        return containBatchPaths(extractDocumentPaths(exchange));
+    }
+
+    /**
+     * Applies the {@code inputBaseDirectory} restriction to every path of a 
batch. When no base directory is configured
+     * the paths are returned untouched.
+     */
+    private List<String> containBatchPaths(List<String> paths) throws 
IOException {
+        String base = configuration.getInputBaseDirectory();
+        if (base == null || base.isEmpty()) {
+            return paths;
+        }
+        List<String> contained = new ArrayList<>(paths.size());
+        for (String path : paths) {
+            contained.add(resolveWithinInputBaseDirectory(path).toString());
+        }
+        return contained;
+    }
+
+    private List<String> extractDocumentPaths(Exchange exchange) {
         Object body = exchange.getIn().getBody();
 
         // Handle List<String>
@@ -1105,6 +1125,15 @@ public class DoclingProducer extends DefaultProducer {
 
         // Handle single String (directory path to scan)
         if (body instanceof String path) {
+            // as in getInputPath, a bare String body is ambiguous - reading 
it as a location must be opted into.
+            // Typed bodies (List<String>, String[], List<File>, File[]) are 
explicit path collections and are
+            // handled above without a gate.
+            if (!configuration.isAllowFilePathSource()) {
+                throw new IllegalArgumentException(
+                        "Batch message body is a String path but 
allowFilePathSource is disabled."
+                                                   + " Set 
allowFilePathSource=true, or pass the documents as a List<String>,"
+                                                   + " String[], List<File> or 
File[] body.");
+            }
             File dir = new File(path);
             if (dir.isDirectory()) {
                 File[] files = dir.listFiles();
@@ -1522,7 +1551,7 @@ public class DoclingProducer extends DefaultProducer {
 
     private void addSourceToRequest(ConvertDocumentRequest.Builder 
requestBuilder, String inputSource) throws IOException {
         // Check if input is a URL or file path
-        if (inputSource.startsWith("http://";) || 
inputSource.startsWith("https://";)) {
+        if (isRemoteSource(inputSource)) {
             requestBuilder.source(
                     HttpSource.builder()
                             .url(URI.create(inputSource))
@@ -1712,7 +1741,11 @@ public class DoclingProducer extends DefaultProducer {
         String inputPath = 
exchange.getIn().getHeader(DoclingHeaders.INPUT_FILE_PATH, String.class);
 
         if (inputPath != null) {
-            validateFileSize(inputPath);
+            // the header is an explicit "the document lives here" signal from 
the route, so it keeps its
+            // meaning - but a local path is still bound by inputBaseDirectory 
when one is configured
+            if (!isRemoteSource(inputPath)) {
+                return validateLocalInputPath(inputPath);
+            }
             return inputPath;
         }
 
@@ -1722,21 +1755,29 @@ public class DoclingProducer extends DefaultProducer {
             body = wf.getBody();
         }
         if (body instanceof String content) {
-            // Check if it's a URL (http:// or https://) or a file path
-            if (content.startsWith("http://";) || 
content.startsWith("https://";)) {
-                // Return URL as-is, no validation needed
-                return content;
-            } else if (content.startsWith("/") || content.contains("\\")) {
-                // It's a file path
-                validateFileSize(content);
+            // A String body is ambiguous: it may be the document itself, a 
location to fetch, or a path to
+            // read. Only the content reading is unconditional; the two 
location readings must be opted into.
+            if (isRemoteSource(content)) {
+                if (!configuration.isAllowUrlSource()) {
+                    throw new IllegalArgumentException(
+                            "Message body starts with http:// or https:// but 
allowUrlSource is disabled."
+                                                       + " Set 
allowUrlSource=true to have Docling fetch it, or pass the document itself as 
the body.");
+                }
                 return content;
+            } else if (isLocalPathSource(content)) {
+                if (!configuration.isAllowFilePathSource()) {
+                    throw new IllegalArgumentException(
+                            "Message body looks like a file path but 
allowFilePathSource is disabled."
+                                                       + " Set 
allowFilePathSource=true to have Docling read it, or pass the document itself 
as the body.");
+                }
+                return validateLocalInputPath(content);
             } else {
                 // Treat as content to be written to a temp file
                 Path secureTempDir = createSecureTempDir();
                 Path tempFile = createSecureTempFile(secureTempDir);
                 Files.write(tempFile, content.getBytes());
                 registerTempDirCleanup(exchange, secureTempDir);
-                validateFileSize(tempFile.toString());
+                validateFileSizeIfPresent(tempFile.toString());
                 return tempFile.toString();
             }
         } else if (body instanceof byte[] content) {
@@ -1749,8 +1790,7 @@ public class DoclingProducer extends DefaultProducer {
             registerTempDirCleanup(exchange, secureTempDir);
             return tempFile.toString();
         } else if (body instanceof File file) {
-            validateFileSize(file.getAbsolutePath());
-            return file.getAbsolutePath();
+            return validateLocalInputPath(file.getAbsolutePath());
         }
 
         throw new InvalidPayloadException(exchange, String.class);
@@ -1813,7 +1853,64 @@ public class DoclingProducer extends DefaultProducer {
         }
     }
 
-    private void validateFileSize(String filePath) throws IOException {
+    /**
+     * Returns whether the given input source is a remote location that 
Docling should fetch itself, rather than
+     * something to be read from the local filesystem.
+     */
+    private static boolean isRemoteSource(String inputSource) {
+        return inputSource.startsWith("http://";) || 
inputSource.startsWith("https://";);
+    }
+
+    /**
+     * Returns whether the given String body looks like a local filesystem 
path rather than document content.
+     */
+    private static boolean isLocalPathSource(String content) {
+        return content.startsWith("/") || content.contains("\\");
+    }
+
+    /**
+     * Validates a local filesystem path used as Docling input: it must stay 
inside {@code inputBaseDirectory} when one
+     * is configured, it must exist, and it must not exceed {@code 
maxFileSize}.
+     *
+     * @return the normalized path, as a string
+     */
+    private String validateLocalInputPath(String filePath) throws IOException {
+        Path path = resolveWithinInputBaseDirectory(filePath);
+        if (!Files.exists(path)) {
+            throw new IOException("File not found: " + filePath);
+        }
+        validateFileSizeIfPresent(path.toString());
+        return path.toString();
+    }
+
+    /**
+     * Normalizes the given path and, when {@code inputBaseDirectory} is 
configured, verifies that it stays inside that
+     * directory. Normalization is lexical and the comparison is made on 
path-segment boundaries, so a sibling directory
+     * sharing a name prefix with the base directory is not accepted.
+     */
+    private Path resolveWithinInputBaseDirectory(String filePath) throws 
IOException {
+        String base = configuration.getInputBaseDirectory();
+        if (base == null || base.isEmpty()) {
+            // no directory restriction: normalize lexically only, and leave 
relative paths relative so that
+            // they keep resolving the way they did before - against the CLI 
working directory, when one is set
+            return Paths.get(filePath).normalize();
+        }
+        Path baseDir = Paths.get(base).toAbsolutePath().normalize();
+        // resolve relative paths against the base directory itself, so that 
the path checked here is exactly
+        // the path used downstream regardless of the process working directory
+        Path path = baseDir.resolve(Paths.get(filePath)).normalize();
+        if (!path.startsWith(baseDir)) {
+            throw new IOException("Input path resolves outside of 
inputBaseDirectory (" + baseDir + "): " + filePath);
+        }
+        return path;
+    }
+
+    /**
+     * Enforces {@code maxFileSize} on the given path <em>if the path 
currently resolves to something on disk</em>. A
+     * path that does not exist is not an error here - callers that require 
the input to exist must use
+     * {@link #validateLocalInputPath(String)} instead.
+     */
+    private void validateFileSizeIfPresent(String filePath) throws IOException 
{
         Path path = Paths.get(filePath);
         if (Files.exists(path)) {
             long fileSize = Files.size(path);
diff --git 
a/components/camel-ai/camel-docling/src/test/java/org/apache/camel/component/docling/DoclingCustomArgsValidationTest.java
 
b/components/camel-ai/camel-docling/src/test/java/org/apache/camel/component/docling/DoclingCustomArgsValidationTest.java
index 6855582acb74..adc83beb812e 100644
--- 
a/components/camel-ai/camel-docling/src/test/java/org/apache/camel/component/docling/DoclingCustomArgsValidationTest.java
+++ 
b/components/camel-ai/camel-docling/src/test/java/org/apache/camel/component/docling/DoclingCustomArgsValidationTest.java
@@ -278,9 +278,10 @@ class DoclingCustomArgsValidationTest extends 
CamelTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() {
-                // CLI mode (useDoclingServe=false is the default)
+                // CLI mode (useDoclingServe=false is the default). These 
tests hand the input file path in
+                // the message body, which has to be opted into via 
allowFilePathSource.
                 from("direct:cli-convert")
-                        .to("docling:convert?operation=CONVERT_TO_MARKDOWN");
+                        
.to("docling:convert?operation=CONVERT_TO_MARKDOWN&allowFilePathSource=true");
             }
         };
     }
diff --git 
a/components/camel-ai/camel-docling/src/test/java/org/apache/camel/component/docling/DoclingInputSourceValidationTest.java
 
b/components/camel-ai/camel-docling/src/test/java/org/apache/camel/component/docling/DoclingInputSourceValidationTest.java
new file mode 100644
index 000000000000..35ad910dbd8d
--- /dev/null
+++ 
b/components/camel-ai/camel-docling/src/test/java/org/apache/camel/component/docling/DoclingInputSourceValidationTest.java
@@ -0,0 +1,263 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.docling;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.List;
+
+import org.apache.camel.CamelExecutionException;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.test.junit6.CamelTestSupport;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+/**
+ * Tests that a String message body is only interpreted as a remote URL or as 
a local filesystem path when the route has
+ * explicitly opted in, and that local input paths honour {@code 
inputBaseDirectory} when one is configured.
+ */
+class DoclingInputSourceValidationTest extends CamelTestSupport {
+
+    @TempDir
+    Path tempDir;
+
+    // ------------------------------------------------------------------ URL 
bodies
+
+    @Test
+    void urlBodyIsRejectedByDefault() {
+        assertThatThrownBy(() -> template.requestBody("direct:default", 
"http://example.org/doc.pdf";))
+                .isInstanceOf(CamelExecutionException.class)
+                .cause()
+                .isInstanceOf(IllegalArgumentException.class)
+                .hasMessageContaining("allowUrlSource");
+    }
+
+    @Test
+    void httpsUrlBodyIsRejectedByDefault() {
+        assertThatThrownBy(() -> template.requestBody("direct:default", 
"https://example.org/doc.pdf";))
+                .isInstanceOf(CamelExecutionException.class)
+                .cause()
+                .isInstanceOf(IllegalArgumentException.class)
+                .hasMessageContaining("allowUrlSource");
+    }
+
+    @Test
+    void urlBodyPassesValidationWhenAllowed() {
+        // validation lets it through; the failure that follows comes from 
executing the (absent) docling binary,
+        // which is what proves the input-source check was not the thing that 
rejected it
+        assertThatThrownBy(() -> template.requestBody("direct:allow-url", 
"http://example.org/doc.pdf";))
+                .isInstanceOf(CamelExecutionException.class)
+                .cause()
+                .isNotInstanceOf(IllegalArgumentException.class);
+    }
+
+    // ------------------------------------------------------------ file path 
bodies
+
+    @Test
+    void filePathBodyIsRejectedByDefault() throws Exception {
+        Path input = Files.writeString(tempDir.resolve("input.txt"), "hello");
+
+        assertThatThrownBy(() -> template.requestBody("direct:default", 
input.toString()))
+                .isInstanceOf(CamelExecutionException.class)
+                .cause()
+                .isInstanceOf(IllegalArgumentException.class)
+                .hasMessageContaining("allowFilePathSource");
+    }
+
+    @Test
+    void windowsStyleFilePathBodyIsRejectedByDefault() {
+        assertThatThrownBy(() -> template.requestBody("direct:default", 
"C:\\docs\\input.pdf"))
+                .isInstanceOf(CamelExecutionException.class)
+                .cause()
+                .isInstanceOf(IllegalArgumentException.class)
+                .hasMessageContaining("allowFilePathSource");
+    }
+
+    @Test
+    void filePathBodyPassesValidationWhenAllowed() throws Exception {
+        Path input = Files.writeString(tempDir.resolve("input.txt"), "hello");
+
+        assertThatThrownBy(() -> template.requestBody("direct:allow-path", 
input.toString()))
+                .isInstanceOf(CamelExecutionException.class)
+                .cause()
+                .isNotInstanceOf(IllegalArgumentException.class);
+    }
+
+    @Test
+    void missingFilePathBodyIsRejectedEvenWhenAllowed() {
+        // a path that does not resolve to anything on disk used to pass the 
size check silently
+        assertThatThrownBy(() -> template.requestBody("direct:allow-path", 
tempDir.resolve("absent.txt").toString()))
+                .isInstanceOf(CamelExecutionException.class)
+                .cause()
+                .isInstanceOf(IOException.class)
+                .hasMessageContaining("File not found");
+    }
+
+    @Test
+    void plainContentBodyIsNotAffected() {
+        // neither a URL nor a path: still treated as the document itself, 
with no opt-in required
+        assertThatThrownBy(() -> template.requestBody("direct:default", "just 
some document text"))
+                .isInstanceOf(CamelExecutionException.class)
+                .cause()
+                .isNotInstanceOf(IllegalArgumentException.class);
+    }
+
+    // ------------------------------------------------------- 
inputBaseDirectory jail
+
+    @Test
+    void filePathInsideInputBaseDirectoryIsAccepted() throws Exception {
+        Path input = Files.writeString(baseDir().resolve("inside.txt"), 
"hello");
+
+        // the docling binary is absent so execution still fails, but it must 
not fail on the jail check
+        assertThatThrownBy(() -> template.requestBody("direct:jailed", 
input.toString()))
+                .isInstanceOf(CamelExecutionException.class)
+                .cause()
+                .hasMessageNotContaining("inputBaseDirectory");
+    }
+
+    @Test
+    void filePathOutsideInputBaseDirectoryIsRejected() throws Exception {
+        Path outside = Files.writeString(tempDir.resolve("outside.txt"), 
"hello");
+
+        assertThatThrownBy(() -> template.requestBody("direct:jailed", 
outside.toString()))
+                .isInstanceOf(CamelExecutionException.class)
+                .cause()
+                .isInstanceOf(IOException.class)
+                .hasMessageContaining("inputBaseDirectory");
+    }
+
+    @Test
+    void traversalOutOfInputBaseDirectoryIsRejected() throws Exception {
+        Files.writeString(tempDir.resolve("outside.txt"), "hello");
+        String traversal = 
baseDir().resolve("..").resolve("outside.txt").toString();
+
+        assertThatThrownBy(() -> template.requestBody("direct:jailed", 
traversal))
+                .isInstanceOf(CamelExecutionException.class)
+                .cause()
+                .isInstanceOf(IOException.class)
+                .hasMessageContaining("inputBaseDirectory");
+    }
+
+    @Test
+    void siblingDirectorySharingANamePrefixIsRejected() throws Exception {
+        // "<base>-evil" shares a string prefix with "<base>" but is not 
inside it; a plain String.startsWith
+        // comparison would wrongly accept this
+        Path sibling = Files.createDirectories(tempDir.resolve("base-evil"));
+        Path input = Files.writeString(sibling.resolve("input.txt"), "hello");
+
+        assertThatThrownBy(() -> template.requestBody("direct:jailed", 
input.toString()))
+                .isInstanceOf(CamelExecutionException.class)
+                .cause()
+                .isInstanceOf(IOException.class)
+                .hasMessageContaining("inputBaseDirectory");
+    }
+
+    // ------------------------------------------------------------------- 
header path
+
+    @Test
+    void headerPathIsNotGatedByAllowFilePathSource() throws Exception {
+        Path input = Files.writeString(tempDir.resolve("header-input.txt"), 
"hello");
+
+        // the header is an explicit "the document lives here" signal, so it 
keeps working without opting in
+        assertThatThrownBy(() -> 
template.requestBodyAndHeader("direct:default", null,
+                DoclingHeaders.INPUT_FILE_PATH, input.toString()))
+                .isInstanceOf(CamelExecutionException.class)
+                .cause()
+                .isNotInstanceOf(IllegalArgumentException.class);
+    }
+
+    @Test
+    void headerPathOutsideInputBaseDirectoryIsRejected() throws Exception {
+        Path outside = 
Files.writeString(tempDir.resolve("header-outside.txt"), "hello");
+
+        assertThatThrownBy(() -> 
template.requestBodyAndHeader("direct:jailed", null,
+                DoclingHeaders.INPUT_FILE_PATH, outside.toString()))
+                .isInstanceOf(CamelExecutionException.class)
+                .cause()
+                .isInstanceOf(IOException.class)
+                .hasMessageContaining("inputBaseDirectory");
+    }
+
+    // ------------------------------------------------------------ batch 
operations
+
+    @Test
+    void batchStringBodyIsRejectedByDefault() {
+        assertThatThrownBy(() -> template.requestBody("direct:batch", 
tempDir.toString()))
+                .isInstanceOf(CamelExecutionException.class)
+                .cause()
+                .isInstanceOf(IllegalArgumentException.class)
+                .hasMessageContaining("allowFilePathSource");
+    }
+
+    @Test
+    void batchTypedPathListIsNotGated() throws Exception {
+        Path input = Files.writeString(tempDir.resolve("batch-input.txt"), 
"hello");
+
+        // an explicit List<String> of paths cannot be mistaken for document 
content, so it needs no opt-in
+        assertThatThrownBy(() -> template.requestBody("direct:batch", 
List.of(input.toString())))
+                .isInstanceOf(CamelExecutionException.class)
+                .cause()
+                .isNotInstanceOf(IllegalArgumentException.class);
+    }
+
+    @Test
+    void configurationDefaultsAreClosed() {
+        DoclingConfiguration configuration = new DoclingConfiguration();
+
+        assertThat(configuration.isAllowUrlSource()).isFalse();
+        assertThat(configuration.isAllowFilePathSource()).isFalse();
+        assertThat(configuration.getInputBaseDirectory()).isNull();
+    }
+
+    private Path baseDir() throws IOException {
+        return Files.createDirectories(tempDir.resolve("base"));
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                String missingBinary = 
tempDir.resolve("no-such-docling").toString();
+
+                from("direct:default")
+                        
.to("docling:convert?operation=CONVERT_TO_MARKDOWN&doclingCommand=" + 
missingBinary);
+
+                from("direct:allow-url")
+                        
.to("docling:convert?operation=CONVERT_TO_MARKDOWN&allowUrlSource=true&doclingCommand="
+                            + missingBinary);
+
+                from("direct:allow-path")
+                        
.to("docling:convert?operation=CONVERT_TO_MARKDOWN&allowFilePathSource=true&doclingCommand="
+                            + missingBinary);
+
+                from("direct:jailed")
+                        
.to("docling:convert?operation=CONVERT_TO_MARKDOWN&allowFilePathSource=true"
+                            + "&inputBaseDirectory=" + baseDir() + 
"&doclingCommand=" + missingBinary);
+
+                // batch operations are docling-serve only; the serve call 
fails against the unused default
+                // endpoint, which is enough to show the input-source check 
let the body through
+                from("direct:batch")
+                        
.to("docling:convert?operation=BATCH_CONVERT_TO_MARKDOWN&useDoclingServe=true");
+            }
+        };
+    }
+}
diff --git 
a/components/camel-ai/camel-docling/src/test/java/org/apache/camel/component/docling/integration/DoclingServeProducerIT.java
 
b/components/camel-ai/camel-docling/src/test/java/org/apache/camel/component/docling/integration/DoclingServeProducerIT.java
index 26b5881befd1..196d8efe7e7c 100644
--- 
a/components/camel-ai/camel-docling/src/test/java/org/apache/camel/component/docling/integration/DoclingServeProducerIT.java
+++ 
b/components/camel-ai/camel-docling/src/test/java/org/apache/camel/component/docling/integration/DoclingServeProducerIT.java
@@ -345,16 +345,16 @@ class DoclingServeProducerIT extends DoclingITestSupport {
             public void configure() throws Exception {
                 // Synchronous conversion routes
                 from("direct:convert-markdown-serve")
-                        
.to("docling:convert?operation=CONVERT_TO_MARKDOWN&contentInBody=true");
+                        
.to("docling:convert?allowFilePathSource=true&operation=CONVERT_TO_MARKDOWN&contentInBody=true");
 
                 from("direct:convert-html-serve")
-                        
.to("docling:convert?operation=CONVERT_TO_HTML&contentInBody=true");
+                        
.to("docling:convert?allowFilePathSource=true&operation=CONVERT_TO_HTML&contentInBody=true");
 
                 from("direct:convert-json-serve")
-                        
.to("docling:convert?operation=CONVERT_TO_JSON&contentInBody=true");
+                        
.to("docling:convert?allowFilePathSource=true&operation=CONVERT_TO_JSON&contentInBody=true");
 
                 from("direct:convert-url-serve")
-                        
.to("docling:convert?operation=CONVERT_TO_MARKDOWN&contentInBody=true");
+                        
.to("docling:convert?allowUrlSource=true&operation=CONVERT_TO_MARKDOWN&contentInBody=true");
 
                 from("direct:convert-and-write")
                         
.to("docling:convert?operation=CONVERT_TO_MARKDOWN&contentInBody=true")
@@ -362,23 +362,23 @@ class DoclingServeProducerIT extends DoclingITestSupport {
 
                 // Asynchronous conversion routes
                 from("direct:convert-async-markdown")
-                        
.to("docling:convert?operation=CONVERT_TO_MARKDOWN&contentInBody=true&useAsyncMode=true&asyncPollInterval=1000&asyncTimeout=120000");
+                        
.to("docling:convert?allowFilePathSource=true&operation=CONVERT_TO_MARKDOWN&contentInBody=true&useAsyncMode=true&asyncPollInterval=1000&asyncTimeout=120000");
 
                 from("direct:convert-async-html")
-                        
.to("docling:convert?operation=CONVERT_TO_HTML&contentInBody=true&useAsyncMode=true&asyncPollInterval=1000&asyncTimeout=120000");
+                        
.to("docling:convert?allowFilePathSource=true&operation=CONVERT_TO_HTML&contentInBody=true&useAsyncMode=true&asyncPollInterval=1000&asyncTimeout=120000");
 
                 from("direct:convert-async-json")
-                        
.to("docling:convert?operation=CONVERT_TO_JSON&contentInBody=true&useAsyncMode=true&asyncPollInterval=1000&asyncTimeout=120000");
+                        
.to("docling:convert?allowFilePathSource=true&operation=CONVERT_TO_JSON&contentInBody=true&useAsyncMode=true&asyncPollInterval=1000&asyncTimeout=120000");
 
                 from("direct:convert-async-url")
-                        
.to("docling:convert?operation=CONVERT_TO_MARKDOWN&contentInBody=true&useAsyncMode=true&asyncPollInterval=1000&asyncTimeout=120000");
+                        
.to("docling:convert?allowUrlSource=true&operation=CONVERT_TO_MARKDOWN&contentInBody=true&useAsyncMode=true&asyncPollInterval=1000&asyncTimeout=120000");
 
                 from("direct:convert-async-custom-timeout")
-                        
.to("docling:convert?operation=CONVERT_TO_MARKDOWN&contentInBody=true&useAsyncMode=true&asyncPollInterval=500&asyncTimeout=300000");
+                        
.to("docling:convert?allowFilePathSource=true&operation=CONVERT_TO_MARKDOWN&contentInBody=true&useAsyncMode=true&asyncPollInterval=500&asyncTimeout=300000");
 
                 // Custom async workflow routes
                 from("direct:submit-async")
-                        
.to("docling:convert?operation=SUBMIT_ASYNC_CONVERSION");
+                        
.to("docling:convert?allowFilePathSource=true&operation=SUBMIT_ASYNC_CONVERSION");
 
                 from("direct:check-status")
                         
.to("docling:convert?operation=CHECK_CONVERSION_STATUS");
@@ -387,7 +387,7 @@ class DoclingServeProducerIT extends DoclingITestSupport {
                 // This uses built-in async mode instead of manual polling to 
avoid complexity
                 from("direct:custom-polling-workflow")
                         .log("Starting custom polling workflow for file: 
${header.CamelDoclingInputFilePath}")
-                        
.to("docling:convert?operation=CONVERT_TO_MARKDOWN&contentInBody=true&" +
+                        
.to("docling:convert?allowFilePathSource=true&operation=CONVERT_TO_MARKDOWN&contentInBody=true&"
 +
                             
"useAsyncMode=true&asyncPollInterval=1000&asyncTimeout=120000");
 
             }
diff --git 
a/components/camel-ai/camel-docling/src/test/java/org/apache/camel/component/docling/integration/ExtractStructuredDataIT.java
 
b/components/camel-ai/camel-docling/src/test/java/org/apache/camel/component/docling/integration/ExtractStructuredDataIT.java
index 68268dd4b334..a5c8843bda88 100644
--- 
a/components/camel-ai/camel-docling/src/test/java/org/apache/camel/component/docling/integration/ExtractStructuredDataIT.java
+++ 
b/components/camel-ai/camel-docling/src/test/java/org/apache/camel/component/docling/integration/ExtractStructuredDataIT.java
@@ -130,7 +130,7 @@ class ExtractStructuredDataIT extends DoclingITestSupport {
             @Override
             public void configure() throws Exception {
                 from("direct:extract-structured-data")
-                        
.to("docling:convert?operation=EXTRACT_STRUCTURED_DATA&contentInBody=true");
+                        
.to("docling:convert?allowFilePathSource=true&operation=EXTRACT_STRUCTURED_DATA&contentInBody=true");
             }
         };
     }
diff --git 
a/components/camel-ai/camel-docling/src/test/java/org/apache/camel/component/docling/integration/MetadataExtractionIT.java
 
b/components/camel-ai/camel-docling/src/test/java/org/apache/camel/component/docling/integration/MetadataExtractionIT.java
index 45303a0368c7..f7150eb705ac 100644
--- 
a/components/camel-ai/camel-docling/src/test/java/org/apache/camel/component/docling/integration/MetadataExtractionIT.java
+++ 
b/components/camel-ai/camel-docling/src/test/java/org/apache/camel/component/docling/integration/MetadataExtractionIT.java
@@ -252,29 +252,29 @@ class MetadataExtractionIT extends DoclingITestSupport {
             public void configure() throws Exception {
                 // Basic metadata extraction
                 from("direct:extract-metadata")
-                        .to("docling:extract?operation=EXTRACT_METADATA");
+                        
.to("docling:extract?allowFilePathSource=true&operation=EXTRACT_METADATA");
 
                 // Metadata extraction with headers enabled (default)
                 from("direct:extract-metadata-with-headers")
-                        .to("docling:extract?operation=EXTRACT_METADATA")
+                        
.to("docling:extract?allowFilePathSource=true&operation=EXTRACT_METADATA")
                         .to("mock:afterMetadataExtraction");
 
                 // Metadata extraction without headers
                 from("direct:extract-metadata-no-headers")
-                        
.to("docling:extract?operation=EXTRACT_METADATA&includeMetadataInHeaders=false")
+                        
.to("docling:extract?allowFilePathSource=true&operation=EXTRACT_METADATA&includeMetadataInHeaders=false")
                         .to("mock:afterMetadataExtraction");
 
                 // Metadata extraction with raw metadata
                 from("direct:extract-metadata-with-raw")
-                        
.to("docling:extract?operation=EXTRACT_METADATA&includeRawMetadata=true");
+                        
.to("docling:extract?allowFilePathSource=true&operation=EXTRACT_METADATA&includeRawMetadata=true");
 
                 // Metadata extraction from URL
                 from("direct:extract-metadata-url")
-                        .to("docling:extract?operation=EXTRACT_METADATA");
+                        
.to("docling:extract?allowUrlSource=true&operation=EXTRACT_METADATA");
 
                 // Metadata extraction to verify headers are populated
                 from("direct:extract-metadata-verify-headers")
-                        
.to("docling:extract?operation=EXTRACT_METADATA&includeMetadataInHeaders=true")
+                        
.to("docling:extract?allowFilePathSource=true&operation=EXTRACT_METADATA&includeMetadataInHeaders=true")
                         .log("Headers should contain metadata fields")
                         .to("mock:afterMetadataExtraction");
             }
diff --git 
a/components/camel-ai/camel-docling/src/test/java/org/apache/camel/component/docling/integration/OcrExtractionIT.java
 
b/components/camel-ai/camel-docling/src/test/java/org/apache/camel/component/docling/integration/OcrExtractionIT.java
index ff2435fe4593..c3f40981129a 100644
--- 
a/components/camel-ai/camel-docling/src/test/java/org/apache/camel/component/docling/integration/OcrExtractionIT.java
+++ 
b/components/camel-ai/camel-docling/src/test/java/org/apache/camel/component/docling/integration/OcrExtractionIT.java
@@ -304,19 +304,19 @@ class OcrExtractionIT extends CamelTestSupport {
             public void configure() throws Exception {
                 // OCR text extraction route
                 from("direct:ocr-extract-text")
-                        
.to("docling:ocr?operation=EXTRACT_TEXT&enableOCR=true&ocrLanguage=en");
+                        
.to("docling:ocr?allowFilePathSource=true&operation=EXTRACT_TEXT&enableOCR=true&ocrLanguage=en");
 
                 // OCR to Markdown conversion
                 from("direct:ocr-convert-markdown")
-                        
.to("docling:ocr?operation=CONVERT_TO_MARKDOWN&enableOCR=true&ocrLanguage=en");
+                        
.to("docling:ocr?allowFilePathSource=true&operation=CONVERT_TO_MARKDOWN&enableOCR=true&ocrLanguage=en");
 
                 // OCR to JSON conversion
                 from("direct:ocr-convert-json")
-                        
.to("docling:ocr?operation=CONVERT_TO_JSON&enableOCR=true&ocrLanguage=en");
+                        
.to("docling:ocr?allowFilePathSource=true&operation=CONVERT_TO_JSON&enableOCR=true&ocrLanguage=en");
 
                 // OCR with async mode
                 from("direct:ocr-async-extract")
-                        
.to("docling:ocr?operation=EXTRACT_TEXT&enableOCR=true&ocrLanguage=en&useAsyncMode=true&asyncPollInterval=1000&asyncTimeout=180000");
+                        
.to("docling:ocr?allowFilePathSource=true&operation=EXTRACT_TEXT&enableOCR=true&ocrLanguage=en&useAsyncMode=true&asyncPollInterval=1000&asyncTimeout=180000");
             }
         };
     }
diff --git 
a/core/camel-util/src/main/java/org/apache/camel/util/SecurityUtils.java 
b/core/camel-util/src/main/java/org/apache/camel/util/SecurityUtils.java
index 1be9151d837a..f9a474d827fc 100644
--- a/core/camel-util/src/main/java/org/apache/camel/util/SecurityUtils.java
+++ b/core/camel-util/src/main/java/org/apache/camel/util/SecurityUtils.java
@@ -57,10 +57,12 @@ public final class SecurityUtils {
         Map<String, SecurityOption> map = new HashMap<>();
         // Generated by camel build tools - do NOT edit this map!
         // SECURITY-OPTIONS: START
+        map.put("allowfilepathsource", new SecurityOption(INSECURE_DEV, 
"true"));
         map.put("allowjavaserializedobject", new 
SecurityOption(INSECURE_SERIALIZATION, "true"));
         map.put("allowlocalwebhookurls", new SecurityOption(INSECURE_DEV, 
"true"));
         map.put("allowserializedheaders", new 
SecurityOption(INSECURE_SERIALIZATION, "true"));
         map.put("allowurlbody", new SecurityOption(INSECURE_DEV, "true"));
+        map.put("allowurlsource", new SecurityOption(INSECURE_DEV, "true"));
         map.put("devconsoleenabled", new SecurityOption(INSECURE_DEV, "true"));
         map.put("downloadenabled", new SecurityOption(INSECURE_DEV, "true"));
         map.put("failonunknownhost", new SecurityOption(INSECURE_SSL, 
VALUE_FALSE));
diff --git 
a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_23.adoc 
b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_23.adoc
index 2b3784b34c90..5261714fc837 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_23.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_23.adoc
@@ -65,6 +65,35 @@ an `AGENTS.md` file with guidance for AI coding assistants, 
pointing at the Apac
 The `camel-archetype-api-component` archetype also generates its readme again: 
the file was declared
 in the wrong file set and was therefore silently skipped.
 
+=== camel-docling
+
+A `String` message body is no longer interpreted as a location by default. 
Previously the producer
+inspected the body and, when it started with `http://` or `https://`, handed 
it to Docling as a remote
+URL to fetch; when it started with `/` or contained `\`, it read it from the 
local filesystem; otherwise
+it converted it as document content.
+
+The two location readings must now be enabled explicitly:
+
+* `allowUrlSource` (default `false`) - interpret a body starting with 
`http://` or `https://` as a URL.
+* `allowFilePathSource` (default `false`) - interpret a body starting with 
`/`, or containing `\`, as a
+  local file path. This also covers the single directory-or-file `String` body 
accepted by the batch
+  operations.
+
+A route that passes the document itself in the body is unaffected. A route 
that passes a URL or a path in
+the body must set the matching option, otherwise the exchange fails with an 
`IllegalArgumentException`
+naming the option to enable.
+
+The `CamelDoclingInputFilePath` header is unchanged and still accepts a path 
without any opt-in, as are
+`File`, `byte[]` and `InputStream` bodies and the explicit path collections 
(`List<String>`, `String[]`,
+`List<File>`, `File[]`) used by the batch operations.
+
+A new `inputBaseDirectory` option is also available. When set, every local 
input path - from the header,
+from a file path body, and from the batch operations - must resolve inside 
that directory once normalized.
+It is unset by default, which keeps the previous behaviour of accepting any 
path.
+
+Additionally, a local input path that does not exist is now reported as a 
`File not found` `IOException`
+before Docling is invoked. Previously the size check silently skipped a path 
that resolved to nothing and
+the failure surfaced later, from the Docling process or API call.
 === camel-azure-eventgrid
 
 The `CamelAzureEventGridDataVersion` header 
(`EventGridConstants.DATA_VERSION`) has been removed. The
diff --git 
a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/DoclingComponentBuilderFactory.java
 
b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/DoclingComponentBuilderFactory.java
index 1f259ec46727..a389a92afdc5 100644
--- 
a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/DoclingComponentBuilderFactory.java
+++ 
b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/DoclingComponentBuilderFactory.java
@@ -867,6 +867,47 @@ public interface DoclingComponentBuilderFactory {
         }
     
         
+        /**
+         * Whether a String message body that starts with / or contains \ is
+         * interpreted as a local filesystem path to read. When disabled, such 
a
+         * body is rejected instead of being read. This does not affect the
+         * CamelDoclingInputFilePath header, nor File, byte or explicit path
+         * collection bodies used by the batch operations.
+         * 
+         * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
+         * 
+         * Default: false
+         * Group: security
+         * 
+         * @param allowFilePathSource the value to set
+         * @return the dsl builder
+         */
+        default DoclingComponentBuilder allowFilePathSource(boolean 
allowFilePathSource) {
+            doSetProperty("allowFilePathSource", allowFilePathSource);
+            return this;
+        }
+    
+        
+        /**
+         * Whether a String message body that starts with http:// or https:// 
is
+         * interpreted as a remote URL for Docling to fetch. When disabled, 
such
+         * a body is rejected instead of being fetched. This does not affect 
the
+         * CamelDoclingInputFilePath header, nor bodies of any other type.
+         * 
+         * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
+         * 
+         * Default: false
+         * Group: security
+         * 
+         * @param allowUrlSource the value to set
+         * @return the dsl builder
+         */
+        default DoclingComponentBuilder allowUrlSource(boolean allowUrlSource) 
{
+            doSetProperty("allowUrlSource", allowUrlSource);
+            return this;
+        }
+    
+        
         /**
          * Header name for API key authentication.
          * 
@@ -916,6 +957,24 @@ public interface DoclingComponentBuilderFactory {
             return this;
         }
     
+        /**
+         * When set, every local input file path must resolve inside this
+         * directory once normalized. Applies to the CamelDoclingInputFilePath
+         * header, to file path message bodies, and to the paths used by the
+         * batch operations. When empty, no directory restriction is applied.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: security
+         * 
+         * @param inputBaseDirectory the value to set
+         * @return the dsl builder
+         */
+        default DoclingComponentBuilder inputBaseDirectory(java.lang.String 
inputBaseDirectory) {
+            doSetProperty("inputBaseDirectory", inputBaseDirectory);
+            return this;
+        }
+    
         
         /**
          * Maximum file size in bytes for processing.
@@ -1019,9 +1078,12 @@ public interface DoclingComponentBuilderFactory {
             case "chunkingUseMarkdownTables": 
getOrCreateConfiguration((DoclingComponent) 
component).setChunkingUseMarkdownTables((java.lang.Boolean) value); return true;
             case "includeMetadataInHeaders": 
getOrCreateConfiguration((DoclingComponent) 
component).setIncludeMetadataInHeaders((boolean) value); return true;
             case "includeRawMetadata": 
getOrCreateConfiguration((DoclingComponent) 
component).setIncludeRawMetadata((boolean) value); return true;
+            case "allowFilePathSource": 
getOrCreateConfiguration((DoclingComponent) 
component).setAllowFilePathSource((boolean) value); return true;
+            case "allowUrlSource": getOrCreateConfiguration((DoclingComponent) 
component).setAllowUrlSource((boolean) value); return true;
             case "apiKeyHeader": getOrCreateConfiguration((DoclingComponent) 
component).setApiKeyHeader((java.lang.String) value); return true;
             case "authenticationScheme": 
getOrCreateConfiguration((DoclingComponent) 
component).setAuthenticationScheme((org.apache.camel.component.docling.AuthenticationScheme)
 value); return true;
             case "authenticationToken": 
getOrCreateConfiguration((DoclingComponent) 
component).setAuthenticationToken((java.lang.String) value); return true;
+            case "inputBaseDirectory": 
getOrCreateConfiguration((DoclingComponent) 
component).setInputBaseDirectory((java.lang.String) value); return true;
             case "maxFileSize": getOrCreateConfiguration((DoclingComponent) 
component).setMaxFileSize((long) value); return true;
             case "oauthProfile": getOrCreateConfiguration((DoclingComponent) 
component).setOauthProfile((java.lang.String) value); return true;
             default: return false;
diff --git 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/DoclingEndpointBuilderFactory.java
 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/DoclingEndpointBuilderFactory.java
index dcb0f400e56f..0d73a7a8156b 100644
--- 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/DoclingEndpointBuilderFactory.java
+++ 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/DoclingEndpointBuilderFactory.java
@@ -606,6 +606,80 @@ public interface DoclingEndpointBuilderFactory {
             doSetProperty("includeRawMetadata", includeRawMetadata);
             return this;
         }
+        /**
+         * Whether a String message body that starts with / or contains \ is
+         * interpreted as a local filesystem path to read. When disabled, such 
a
+         * body is rejected instead of being read. This does not affect the
+         * CamelDoclingInputFilePath header, nor File, byte or explicit path
+         * collection bodies used by the batch operations.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: security
+         * 
+         * @param allowFilePathSource the value to set
+         * @return the dsl builder
+         */
+        default DoclingEndpointBuilder allowFilePathSource(boolean 
allowFilePathSource) {
+            doSetProperty("allowFilePathSource", allowFilePathSource);
+            return this;
+        }
+        /**
+         * Whether a String message body that starts with / or contains \ is
+         * interpreted as a local filesystem path to read. When disabled, such 
a
+         * body is rejected instead of being read. This does not affect the
+         * CamelDoclingInputFilePath header, nor File, byte or explicit path
+         * collection bodies used by the batch operations.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: security
+         * 
+         * @param allowFilePathSource the value to set
+         * @return the dsl builder
+         */
+        default DoclingEndpointBuilder allowFilePathSource(String 
allowFilePathSource) {
+            doSetProperty("allowFilePathSource", allowFilePathSource);
+            return this;
+        }
+        /**
+         * Whether a String message body that starts with http:// or https:// 
is
+         * interpreted as a remote URL for Docling to fetch. When disabled, 
such
+         * a body is rejected instead of being fetched. This does not affect 
the
+         * CamelDoclingInputFilePath header, nor bodies of any other type.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: security
+         * 
+         * @param allowUrlSource the value to set
+         * @return the dsl builder
+         */
+        default DoclingEndpointBuilder allowUrlSource(boolean allowUrlSource) {
+            doSetProperty("allowUrlSource", allowUrlSource);
+            return this;
+        }
+        /**
+         * Whether a String message body that starts with http:// or https:// 
is
+         * interpreted as a remote URL for Docling to fetch. When disabled, 
such
+         * a body is rejected instead of being fetched. This does not affect 
the
+         * CamelDoclingInputFilePath header, nor bodies of any other type.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: security
+         * 
+         * @param allowUrlSource the value to set
+         * @return the dsl builder
+         */
+        default DoclingEndpointBuilder allowUrlSource(String allowUrlSource) {
+            doSetProperty("allowUrlSource", allowUrlSource);
+            return this;
+        }
         /**
          * Header name for API key authentication.
          * 
@@ -669,6 +743,23 @@ public interface DoclingEndpointBuilderFactory {
             doSetProperty("authenticationToken", authenticationToken);
             return this;
         }
+        /**
+         * When set, every local input file path must resolve inside this
+         * directory once normalized. Applies to the CamelDoclingInputFilePath
+         * header, to file path message bodies, and to the paths used by the
+         * batch operations. When empty, no directory restriction is applied.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         * 
+         * @param inputBaseDirectory the value to set
+         * @return the dsl builder
+         */
+        default DoclingEndpointBuilder inputBaseDirectory(String 
inputBaseDirectory) {
+            doSetProperty("inputBaseDirectory", inputBaseDirectory);
+            return this;
+        }
         /**
          * Maximum file size in bytes for processing.
          * 

Reply via email to