Skip to content

Commit b723055

Browse files
authored
Add maxPages option to PDFParserConfig to limit page processing (#2803)
Signed-off-by: Julien Nioche <julien@digitalpebble.com>
1 parent 381184f commit b723055

4 files changed

Lines changed: 59 additions & 0 deletions

File tree

tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/resources/config-examples/pdf-parser-full.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
"imageStrategy": "NONE",
2626
"maxIncrementalUpdates": 10,
2727
"maxMainMemoryBytes": 536870912,
28+
"maxPages": -1,
2829
"ocr": {
2930
"dpi": 300,
3031
// Options: PNG, TIFF, JPEG

tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/parser/pdf/AbstractPDF2XHTML.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1486,9 +1486,15 @@ public int getCurrentPageNo() {
14861486
*/
14871487
@Override
14881488
protected void processPages(PDPageTree pages) throws IOException {
1489+
int maxPages = config.getMaxPages();
1490+
int pagesProcessed = 0;
14891491
for (PDPage page : pages) {
1492+
if (maxPages > 0 && pagesProcessed >= maxPages) {
1493+
break;
1494+
}
14901495
if (getCurrentPageNo() >= getStartPage() && getCurrentPageNo() <= getEndPage()) {
14911496
processPage(page);
1497+
pagesProcessed++;
14921498
}
14931499
pageIndex++;
14941500
}

tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/parser/pdf/PDFParserConfig.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,8 @@ public enum AccessCheckMode {
147147

148148
int maxIncrementalUpdates = 10;
149149

150+
private int maxPages = -1;
151+
150152
private boolean throwOnEncryptedPayload = false;
151153

152154
/**
@@ -770,6 +772,28 @@ public void setMaxIncrementalUpdates(int maxIncrementalUpdates) {
770772
this.maxIncrementalUpdates = maxIncrementalUpdates;
771773
}
772774

775+
/**
776+
* @return maximum number of pages to process, or -1 for no limit
777+
*/
778+
public int getMaxPages() {
779+
return maxPages;
780+
}
781+
782+
/**
783+
* Set the maximum number of pages to process per document.
784+
* Use -1 (the default) for no limit.
785+
*
786+
* @param maxPages must be -1 or &gt;= 1
787+
* @throws IllegalArgumentException if the value is 0 or less than -1
788+
*/
789+
public void setMaxPages(int maxPages) {
790+
if (maxPages != -1 && maxPages < 1) {
791+
throw new IllegalArgumentException(
792+
"maxPages must be -1 (no limit) or >= 1, got: " + maxPages);
793+
}
794+
this.maxPages = maxPages;
795+
}
796+
773797
public void setThrowOnEncryptedPayload(boolean throwOnEncryptedPayload) {
774798
this.throwOnEncryptedPayload = throwOnEncryptedPayload;
775799
}

tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/test/java/org/apache/tika/parser/pdf/PDFParserTest.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1509,6 +1509,34 @@ public void testMetadataKeyPrecision() throws Exception {
15091509
assertArrayEquals(expectedSubjectVals, m.getValues(TikaCoreProperties.SUBJECT));
15101510
}
15111511

1512+
@Test
1513+
public void testMaxPages() throws Exception {
1514+
PDFParser parser = new PDFParser();
1515+
PDFParserConfig config = new PDFParserConfig();
1516+
config.setMaxPages(3);
1517+
ParseContext context = new ParseContext();
1518+
context.set(PDFParserConfig.class, config);
1519+
1520+
// testJournalParser.pdf has 10 pages; limiting to 3 must process only the first 3 pages
1521+
String truncated = getText("testJournalParser.pdf", parser, new Metadata(), context);
1522+
String full = getText("testJournalParser.pdf", parser);
1523+
assertTrue(full.length() > truncated.length(),
1524+
"Full parse should yield more content than a 3-page-limited parse");
1525+
assertTrue(truncated.contains("Scalability of Controlling"),
1526+
"Content from page 1 should be present in truncated output");
1527+
assertFalse(truncated.contains("CONCLUSION"),
1528+
"Content from page 10 should not be present in truncated output");
1529+
}
1530+
1531+
@Test
1532+
public void testMaxPagesInvalidValue() {
1533+
PDFParserConfig config = new PDFParserConfig();
1534+
assertThrows(IllegalArgumentException.class, () -> config.setMaxPages(0));
1535+
assertThrows(IllegalArgumentException.class, () -> config.setMaxPages(-2));
1536+
config.setMaxPages(-1);
1537+
config.setMaxPages(1);
1538+
}
1539+
15121540
/**
15131541
@Test
15141542
public void testWriteLimit() throws Exception {

0 commit comments

Comments
 (0)