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();