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

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


The following commit(s) were added to refs/heads/main by this push:
     new cbd93cd8e4 TIKA-4903: accept tesseract script models by their bare 
name (#3194)
cbd93cd8e4 is described below

commit cbd93cd8e4eb87abd5ae1734af8b7b40772106ff
Author: Tim Allison <[email protected]>
AuthorDate: Fri Sep 18 13:07:38 2026 -0400

    TIKA-4903: accept tesseract script models by their bare name (#3194)
---
 CHANGES.txt                                                |  7 ++++---
 .../pages/configuration/parsers/tesseract-ocr-parser.adoc  |  8 ++++++++
 .../org/apache/tika/parser/ocr/TesseractOCRConfig.java     | 14 +++++++++-----
 .../org/apache/tika/parser/ocr/TesseractOCRConfigTest.java |  6 ++++--
 4 files changed, 25 insertions(+), 10 deletions(-)

diff --git a/CHANGES.txt b/CHANGES.txt
index dd69d9883c..651fc6c68f 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,9 +1,10 @@
 Release 4.1.0 - unreleased
 
+   * Tesseract script models are accepted by their bare name ("language":
+     "Latin", "eng+Japanese_vert") (TIKA-4903).
+     
    * Per-request tesseract-ocr-parser config no longer accepts
-     otherTesseractConfig; tesseract variables such as debug_file name
-     files the binary opens, so the -c pass-through is server-side
-     configuration only (TIKA-4904).
+     otherTesseractConfig (TIKA-4904).
 
    * ICC tone-curve and lookup-table tags (rTRC and friends) are no longer
      written to icc:* by default; "jpeg-parser": {"includeIccCurvesAndLuts":
diff --git 
a/docs/modules/ROOT/pages/configuration/parsers/tesseract-ocr-parser.adoc 
b/docs/modules/ROOT/pages/configuration/parsers/tesseract-ocr-parser.adoc
index 7900f419e3..e1eb49aaab 100644
--- a/docs/modules/ROOT/pages/configuration/parsers/tesseract-ocr-parser.adoc
+++ b/docs/modules/ROOT/pages/configuration/parsers/tesseract-ocr-parser.adoc
@@ -33,6 +33,14 @@ Name the engine in the top-level `text-recognizers` list; 
every default parser s
 }
 ----
 
+`language` takes tesseract's own names, joined with `+`: three-letter codes 
such as `eng` or
+`chi_tra_vert`, and script models such as `Latin` or `Japanese_vert`. A script 
model is written
+`script/Latin` when it lives in tessdata's `script/` subdirectory and `Latin` 
when it sits at
+the tessdata top level, which is where the Debian and Ubuntu 
`tesseract-ocr-script-*` packages
+put it; `tesseract --list-langs` prints the spelling that resolves. A script 
model reads every
+language of that script without a per-document choice, at roughly 1.6x the 
time of `eng` per
+page.
+
 With no `text-recognizers` at all, Tesseract is still the OCR engine whenever 
the `tesseract`
 binary is found: the loader finds it among the loaded parsers because it 
implements
 `TextRecognizer` and advertises the image types it reads, and logs the choice 
at startup. When
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-ocr-module/src/main/java/org/apache/tika/parser/ocr/TesseractOCRConfig.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-ocr-module/src/main/java/org/apache/tika/parser/ocr/TesseractOCRConfig.java
index fc99f51ca9..ca5cb4d6ea 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-ocr-module/src/main/java/org/apache/tika/parser/ocr/TesseractOCRConfig.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-ocr-module/src/main/java/org/apache/tika/parser/ocr/TesseractOCRConfig.java
@@ -115,9 +115,10 @@ public class TesseractOCRConfig implements Serializable {
         // Split on the + sign
         final String[] langs = language.split("\\+");
         for (String lang : langs) {
-            // First, make sure it conforms to the correct syntax
+            // Script models are capitalized and ship as either script/Latin 
or a top-level
+            // Latin.traineddata (Debian's tesseract-ocr-script-* packages); 
accept both.
             if (!lang.matches(
-                    
"([a-zA-Z]{3}(_[a-zA-Z]{3,4}){0,2})|script(/|\\\\)[A-Z][a-zA-Z_]+")) {
+                    
"([a-zA-Z]{3}(_[a-zA-Z]{3,4}){0,2})|(script(/|\\\\))?[A-Z][a-zA-Z_]+")) {
                 invalidLangs.add(lang + " (invalid syntax)");
             } else {
                 validLangs.add(lang);
@@ -138,9 +139,12 @@ public class TesseractOCRConfig implements Serializable {
      * <ol>
      *   <li>Nominally an ISO-639-2 code but compound codes are allowed 
separated by underscore:
      *   e.g., chi_tra_vert, aze_cyrl</li>
-     *   <li>A file path in the script directory.  The name starts with 
upper-case letter.
-     *       Some of them have underscores and other upper-case letters: e.g., 
script/Arabic,
-     *       script/HanS_vert, script/Japanese_vert, 
script/Canadian_Aboriginal</li>
+     *   <li>A script model. The name starts with an upper-case letter and may 
contain
+     *       underscores and other upper-case letters: e.g., Arabic, 
HanS_vert, Japanese_vert,
+     *       Canadian_Aboriginal. Prefix with script/ when the model lives in 
tessdata's
+     *       script subdirectory (script/Arabic); use the bare name when it 
sits at the
+     *       tessdata top level, as the Debian/Ubuntu tesseract-ocr-script-* 
packages install
+     *       it.</li>
      * </ol>
      * Multiple languages may be specified, separated by plus characters.
      * e.g. "chi_tra+chi_sim+script/Arabic"
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-ocr-module/src/test/java/org/apache/tika/parser/ocr/TesseractOCRConfigTest.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-ocr-module/src/test/java/org/apache/tika/parser/ocr/TesseractOCRConfigTest.java
index 1f75741893..fbabb4b552 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-ocr-module/src/test/java/org/apache/tika/parser/ocr/TesseractOCRConfigTest.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-ocr-module/src/test/java/org/apache/tika/parser/ocr/TesseractOCRConfigTest.java
@@ -95,7 +95,8 @@ public class TesseractOCRConfigTest extends TikaTest {
         List<String> validLanguages =
                 Arrays.asList("eng", "slk_frak", "chi_tra", "eng+fra", 
"tgk+chi_tra+slk_frak",
                         "chi_tra_vert", "tgk+chi_tra_vert+slk_frak", 
"eng+script/Arabic",
-                        "script/HanT_vert");
+                        "script/HanT_vert", "Latin", "eng+Latin", 
"Japanese_vert",
+                        "Canadian_Aboriginal");
 
         TesseractOCRConfig config = new TesseractOCRConfig();
 
@@ -109,7 +110,8 @@ public class TesseractOCRConfigTest extends TikaTest {
     public void testValidateInvalidLanguage() {
         List<String> invalidLanguages = Arrays.asList(
                 //"", allow empty string
-                "+", "en", "en+", "eng+fra+", "Arabic", "/script/Arabic", "rm 
-rf *");
+                "+", "en", "en+", "eng+fra+", "/script/Arabic", "latin1", 
"+eng",
+                "script/", "rm -rf *");
 
         TesseractOCRConfig config = new TesseractOCRConfig();
 

Reply via email to