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. */

Reply via email to