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 c2c4364dbd TIKA-5013: record skipped:max-pages in tk:ocr-warnings when
pages.ocr.maxPages caps OCR (#3457)
c2c4364dbd is described below
commit c2c4364dbd332ac63b651288a724a380d0051fa2
Author: Tim Allison <[email protected]>
AuthorDate: Fri Oct 30 12:11:28 2026 -0400
TIKA-5013: record skipped:max-pages in tk:ocr-warnings when
pages.ocr.maxPages caps OCR (#3457)
---
CHANGES.txt | 4 +++
docs/modules/ROOT/pages/configuration/pages.adoc | 5 +++-
.../pages/configuration/parsers/pdf-parser.adoc | 1 +
.../apache/tika/parser/pdf/AbstractPDF2XHTML.java | 4 +++
.../org/apache/tika/parser/pdf/PDFParserTest.java | 35 ++++++++++++++++++++++
5 files changed, 48 insertions(+), 1 deletion(-)
diff --git a/CHANGES.txt b/CHANGES.txt
index d010544521..2c9db51240 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -63,6 +63,10 @@ Release 4.3.0 - ???
DER: Pkcs7Parser and the opt-in pkcs-7-detector report the smime-type and
extract
signed content; -----BEGIN CMS----- is now detected (TIKA-5002).
+ * A PDF with pages that pages.ocr.maxPages kept from the OCR engine records
+ skipped:max-pages in tk:ocr-warnings; before, the cap left no trace and
+ pdf:ocr-page-count still counted those pages (TIKA-5013).
+
Release 4.2.0 - 10/25/2026
BREAKING CHANGES AND DEPRECATIONS
diff --git a/docs/modules/ROOT/pages/configuration/pages.adoc
b/docs/modules/ROOT/pages/configuration/pages.adoc
index d1b6c05c4e..0480955f3b 100644
--- a/docs/modules/ROOT/pages/configuration/pages.adoc
+++ b/docs/modules/ROOT/pages/configuration/pages.adoc
@@ -142,7 +142,10 @@ thumbnail presets set `imageType: RGB` and a box for that
reason.
== `ocr`: the recognizer's budget and verdict
`maxPages`::
-Pages of one document that may be OCR'd, counted from the first; `-1` for no
limit.
+Pages of one document that may be OCR'd, counted from the first; `-1` for no
limit. A document
+with a page the limit kept from an engine gets `skipped:max-pages` in
`tk:ocr-warnings`, so it can
+be found and re-run with a higher limit. `pdf:ocr-page-count` still counts
every page that wanted
+OCR, including those.
`auto`::
When `AUTO` sends a page to OCR: `totalCharsPerPage`, below which a page is
OCR'd, and
`unmappedUnicodeCharsPerPage`, glyphs without a Unicode mapping (a count when
1 or more, a fraction
diff --git a/docs/modules/ROOT/pages/configuration/parsers/pdf-parser.adoc
b/docs/modules/ROOT/pages/configuration/parsers/pdf-parser.adoc
index 620eba6bdd..5dd502b578 100644
--- a/docs/modules/ROOT/pages/configuration/parsers/pdf-parser.adoc
+++ b/docs/modules/ROOT/pages/configuration/parsers/pdf-parser.adoc
@@ -85,6 +85,7 @@ every page, with its results such as `tk:chunks` landing on
the PDF. The embedde
render is parsed for its metadata but not enriched again.
`pdf:ocr-page-count` records how many pages tripped the verdict, whether or
not an engine ran.
+A page that `pages.ocr.maxPages` kept from an engine adds `skipped:max-pages`
to `tk:ocr-warnings`.
== Tagged PDFs (`markedContent`)
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/parser/pdf/AbstractPDF2XHTML.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/parser/pdf/AbstractPDF2XHTML.java
index b4d031dae1..0113c3965a 100644
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/parser/pdf/AbstractPDF2XHTML.java
+++
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/parser/pdf/AbstractPDF2XHTML.java
@@ -119,6 +119,7 @@ import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.Parser;
import org.apache.tika.parser.enricher.CompositeContentEnricher;
import org.apache.tika.parser.enricher.ContentEnrichers;
+import org.apache.tika.parser.enricher.OcrWarnings;
import org.apache.tika.parser.hook.ParseHooks;
import org.apache.tika.parser.inference.InputKind;
import org.apache.tika.parser.pages.PagesConfig;
@@ -725,6 +726,9 @@ class AbstractPDF2XHTML extends PDFTextStripper {
// Enforce maxPagesToOcr limit
int maxPagesToOcr = pages.getOcr().getMaxPages();
if (maxPagesToOcr > 0 && c != null && c.getCount() > maxPagesToOcr) {
+ if (ocrEngine != null) {
+ OcrWarnings.add(metadata, "skipped:max-pages");
+ }
return PageOcr.SKIPPED;
}
if (ocrEngine == null) {
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/test/java/org/apache/tika/parser/pdf/PDFParserTest.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/test/java/org/apache/tika/parser/pdf/PDFParserTest.java
index 760ad48d70..b4a8766d10 100644
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/test/java/org/apache/tika/parser/pdf/PDFParserTest.java
+++
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/test/java/org/apache/tika/parser/pdf/PDFParserTest.java
@@ -1817,6 +1817,41 @@ public class PDFParserTest extends TikaTest {
assertContainsCount("This is a page about", xml, 1);
assertContains("Denmark", xml);
assertEquals(2, metadata.getInt(PDF.OCR_PAGE_COUNT));
+ assertEquals(List.of("skipped:max-pages"),
+ List.of(metadata.getValues(TikaCoreProperties.OCR_WARNINGS)));
+ }
+
+ /** The max-pages warning marks only a document the cap actually cut
short. */
+ @Test
+ public void testAutoOcrMaxPagesUnderCapNoWarning() throws Exception {
+ PDFParserConfig config = new PDFParserConfig();
+ auto(config, 0.02f, 1_000_000);
+ config.pages().ocr().setMaxPages(2);
+ ParseContext context = new ParseContext();
+ context.set(PDFParserConfig.class, config);
+ context.set(Parser.class, mockOcrParser(config, "MOCK_OCR_CONTENT"));
+ Metadata metadata = new Metadata();
+
+ String xml = parsePdfToXml("testPDF_bookmarks.pdf", metadata, context);
+
+ assertContainsCount("MOCK_OCR_CONTENT", xml, 2);
+ assertEquals(0,
metadata.getValues(TikaCoreProperties.OCR_WARNINGS).length);
+ }
+
+ /** With no engine nothing would have been OCR'd, so the cap cut nothing
short. */
+ @Test
+ public void testAutoOcrMaxPagesNoEngineNoWarning() throws Exception {
+ PDFParserConfig config = new PDFParserConfig();
+ auto(config, 0.02f, 1_000_000);
+ config.pages().ocr().setMaxPages(1);
+ ParseContext context = new ParseContext();
+ context.set(PDFParserConfig.class, config);
+ Metadata metadata = new Metadata();
+
+ parsePdfToXml("testPDF_bookmarks.pdf", metadata, context);
+
+ assertEquals(2, metadata.getInt(PDF.OCR_PAGE_COUNT));
+ assertEquals(0,
metadata.getValues(TikaCoreProperties.OCR_WARNINGS).length);
}
/** TIKA-4883: inline-image markers are written after the recorded text
and survive OCR. */