Skip to content
Commits on Source (8)
Release 1.21 - 05/14/2019
* Add optional AUTO mode to OCR'ing of PDFs. If tesseract is installed
and on the path, and this option is selected programmatically
or via TikaConfig(), the PDFParser will use heuristics to decide
whether or not to run OCR per page on PDFs. (TIKA-2749)
* The ZipContainerDetector's default behavior was changed to run
streaming detection up to its markLimit. Users can get the
legacy behavior (spool-to-file/rely-on-underlying-file-in-TikaInputStream)
by setting markLimit=-1. The POIFSContainerDetector requires an underlying file;
it will try to spool the file to disk; if the file's length is > markLimit,
it will not attempt detection; set markLimit to -1 for legacy behavior (TIKA-2849).
* Upgrade PDFBox to 2.0.14 (TIKA-2834).
* Add CSV detection and replace TXTParser with TextAndCSVParser;
users can turn off CSV detection by excluding the TextAndCSVParser
and adding back the TXTParser via tika-config (TIKA-2833).
* Add a CSVParser. CSV detection is currently based solely on filename
and/or information conveyed via Metadata (TIKA-2826).
* General upgrades: asm, bouncycastle, commons-codec, commons-lang3, cxf,
guava, h2, httpcomponents, jackcess, junrar, Lucene, mime4j, opennlp, parso,
sqlite-jdbc (provided), zstd-jni (provided) (TIKA-2824)
* Bundle xerces2 with tika-parsers (TIKA-2802).
* Upgrade jaxb to 2.3.2 (TIKA-2819).
* Upgrade jackson to 2.9.8 (TIKA-2717).
* Update tika-eval's common tokens lists (TIKA-2822).
* Handle bad tags in tika-eval more robustly (TIKA-2810).
* Add reports for tags in tika-eval (TIKA-2809).
* Extract text from SDT element within textboxes in .docx files (TIKA-2807).
* Try to handle truncated OOXML files more robustly (TIKA-2765).
Release 1.20 - 12/17/2018
* Upgrade to POI 4.0.1 (TIKA-2751).
......
tika (1.21-1) unstable; urgency=medium
* New upstream release
- Refreshed the patches
- New dependency on libprotobuf-java
- Ignore the build dependency on ossindex-maven-plugin
- Ignore the new dependency on jakarta.activation (not used)
* Standards-Version updated to 4.4.0
-- Emmanuel Bourg <ebourg@apache.org> Thu, 11 Jul 2019 22:48:11 +0200
tika (1.20-1) unstable; urgency=medium
* New upstream release
......
......@@ -34,6 +34,7 @@ Build-Depends:
libmaven-shade-plugin-java,
libmetadata-extractor-java (>= 2.8~),
libpdfbox2-java (>= 2.0.13-2~),
libprotobuf-java,
librome-java (>= 1.6),
libslf4j-java,
libtagsoup-java,
......@@ -41,7 +42,7 @@ Build-Depends:
libvorbis-java (>= 0.8-3~),
libxmpcore-java,
maven-debian-helper (>= 2.0)
Standards-Version: 4.3.0
Standards-Version: 4.4.0
Vcs-Git: https://salsa.debian.org/java-team/tika.git
Vcs-Browser: https://salsa.debian.org/java-team/tika
Homepage: http://tika.apache.org
......
......@@ -16,6 +16,7 @@ com.healthmarketscience.jackcess jackcess-encrypt * * * *
com.levigo.jbig2 levigo-jbig2-imageio * * * *
com.epam parso * * * *
com.pff java-libpst * * * *
com.sun.activation jakarta.activation * * * *
de.thetaphi forbiddenapis * * * *
edu.ucar cdm * * * *
edu.ucar grib * * * *
......@@ -47,5 +48,6 @@ org.codehaus.gmaven groovy-maven-plugin * * * *
org.codehaus.mojo clirr-maven-plugin * * * *
org.codehaus.mojo versions-maven-plugin * * * *
org.opengis geoapi * * * *
org.sonatype.ossindex.maven ossindex-maven-plugin * * * *
org.xerial sqlite-jdbc * * * *
org.mockito * * * * *
......@@ -3,7 +3,7 @@ Author: Emmanuel Bourg <ebourg@apache.org>
Forwarded: no
--- a/tika-parsers/pom.xml
+++ b/tika-parsers/pom.xml
@@ -115,6 +115,7 @@
@@ -119,6 +119,7 @@
<groupId>org.gagravarr</groupId>
<artifactId>vorbis-java-tika</artifactId>
<version>${vorbis.version}</version>
......@@ -11,7 +11,7 @@ Forwarded: no
<exclusions>
<exclusion>
<groupId>org.apache.tika</groupId>
@@ -135,26 +136,31 @@
@@ -139,26 +140,31 @@
<groupId>org.tallison</groupId>
<artifactId>jmatio</artifactId>
<version>1.5</version>
......@@ -43,7 +43,7 @@ Forwarded: no
</dependency>
<dependency>
<groupId>com.epam</groupId>
@@ -177,11 +183,13 @@
@@ -181,11 +187,13 @@
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>${codec.version}</version>
......@@ -57,7 +57,7 @@ Forwarded: no
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
@@ -193,6 +201,7 @@
@@ -197,6 +205,7 @@
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox-tools</artifactId>
<version>${pdfbox.version}</version>
......@@ -65,7 +65,7 @@ Forwarded: no
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
@@ -208,6 +217,7 @@
@@ -212,6 +221,7 @@
<groupId>org.apache.pdfbox</groupId>
<artifactId>jempbox</artifactId>
<version>${jempbox.version}</version>
......@@ -73,7 +73,7 @@ Forwarded: no
</dependency>
<!-- TIKA-370: PDFBox declares the Bouncy Castle dependencies
as optional, but we prefer to have them always to avoid
@@ -216,16 +226,19 @@
@@ -220,16 +230,19 @@
<groupId>org.bouncycastle</groupId>
<artifactId>bcmail-jdk15on</artifactId>
<version>${bouncycastle.version}</version>
......@@ -93,7 +93,7 @@ Forwarded: no
<exclusions>
<exclusion>
<groupId>commons-codec</groupId>
@@ -237,11 +250,13 @@
@@ -241,11 +254,13 @@
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>${poi.version}</version>
......@@ -107,23 +107,23 @@ Forwarded: no
<exclusions>
<exclusion>
<groupId>stax</groupId>
@@ -257,6 +272,7 @@
@@ -261,6 +276,7 @@
<groupId>com.healthmarketscience.jackcess</groupId>
<artifactId>jackcess</artifactId>
<version>2.1.12</version>
<version>3.0.1</version>
+ <optional>true</optional>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
@@ -268,6 +284,7 @@
<groupId>org.apache.commons</groupId>
@@ -276,6 +292,7 @@
<groupId>com.healthmarketscience.jackcess</groupId>
<artifactId>jackcess-encrypt</artifactId>
<version>2.1.4</version>
<version>3.0.0</version>
+ <optional>true</optional>
<exclusions>
<exclusion>
<groupId>org.bouncycastle</groupId>
@@ -285,31 +302,37 @@
@@ -293,31 +310,37 @@
<groupId>org.ccil.cowan.tagsoup</groupId>
<artifactId>tagsoup</artifactId>
<version>1.2.1</version>
......@@ -132,7 +132,7 @@ Forwarded: no
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
<version>7.0</version>
<version>7.1</version>
+ <optional>true</optional>
</dependency>
<dependency>
......@@ -161,7 +161,7 @@ Forwarded: no
<exclusions>
<exclusion>
<groupId>org.jdom</groupId>
@@ -321,16 +344,19 @@
@@ -329,16 +352,19 @@
<groupId>org.gagravarr</groupId>
<artifactId>vorbis-java-core</artifactId>
<version>${vorbis.version}</version>
......@@ -181,7 +181,7 @@ Forwarded: no
<exclusions>
<exclusion>
<groupId>commons-io</groupId>
@@ -344,11 +370,13 @@
@@ -352,11 +378,13 @@
<groupId>com.pff</groupId>
<artifactId>java-libpst</artifactId>
<version>0.8.1</version>
......@@ -190,12 +190,12 @@ Forwarded: no
<dependency>
<groupId>com.github.junrar</groupId>
<artifactId>junrar</artifactId>
<version>2.0.0</version>
<version>4.0.0</version>
+ <optional>true</optional>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
@@ -383,6 +411,7 @@
@@ -391,6 +419,7 @@
<artifactId>commons-exec</artifactId>
<version>${commonsexec.version}</version>
<scope>compile</scope>
......@@ -203,15 +203,15 @@ Forwarded: no
</dependency>
<!-- Provided dependencies -->
@@ -397,6 +426,7 @@
@@ -405,6 +434,7 @@
<groupId>org.apache.opennlp</groupId>
<artifactId>opennlp-tools</artifactId>
<version>1.9.0</version>
<version>1.9.1</version>
+ <optional>true</optional>
</dependency>
<dependency>
@@ -409,6 +439,7 @@
@@ -417,6 +447,7 @@
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
......@@ -219,7 +219,7 @@ Forwarded: no
<exclusions>
<exclusion>
<groupId>junit</groupId>
@@ -426,11 +457,13 @@
@@ -434,11 +465,13 @@
<groupId>com.github.openjson</groupId>
<artifactId>openjson</artifactId>
<version>1.0.10</version>
......@@ -233,7 +233,15 @@ Forwarded: no
</dependency>
<!-- logging dependencies -->
@@ -594,6 +627,7 @@
@@ -551,6 +584,7 @@
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.7.1</version>
+ <optional>true</optional>
</dependency>
<dependency>
<groupId>edu.ucar</groupId>
@@ -633,6 +667,7 @@
<groupId>org.apache.commons</groupId>
<artifactId>commons-csv</artifactId>
<version>1.6</version>
......
......@@ -3,7 +3,7 @@ Author: Emmanuel Bourg <ebourg@apache.org>
Forwarded: not-needed
--- a/tika-parsers/pom.xml
+++ b/tika-parsers/pom.xml
@@ -918,6 +918,40 @@
@@ -962,6 +962,40 @@
</execution>
</executions>
</plugin>
......
......@@ -25,7 +25,7 @@
<parent>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parent</artifactId>
<version>1.20</version>
<version>1.21</version>
<relativePath>tika-parent/pom.xml</relativePath>
</parent>
......
......@@ -25,7 +25,7 @@
<parent>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parent</artifactId>
<version>1.20</version>
<version>1.21</version>
<relativePath>../tika-parent/pom.xml</relativePath>
</parent>
......
......@@ -38,9 +38,9 @@ public class TestEmbeddedDocumentUtil {
Parser p = new AutoDetectParser();
ParseContext parseContext = new ParseContext();
parseContext.set(Parser.class, p);
Parser txtParser = EmbeddedDocumentUtil.tryToFindExistingLeafParser(org.apache.tika.parser.txt.TXTParser.class, parseContext);
Parser txtParser = EmbeddedDocumentUtil.tryToFindExistingLeafParser(org.apache.tika.parser.csv.TextAndCSVParser.class, parseContext);
assertNotNull(txtParser);
assertEquals(org.apache.tika.parser.txt.TXTParser.class, txtParser.getClass());
assertEquals(org.apache.tika.parser.csv.TextAndCSVParser.class, txtParser.getClass());
}
......@@ -51,8 +51,8 @@ public class TestEmbeddedDocumentUtil {
new BasicContentHandlerFactory(BasicContentHandlerFactory.HANDLER_TYPE.TEXT, -1));
ParseContext parseContext = new ParseContext();
parseContext.set(Parser.class, wrapper);
Parser txtParser = EmbeddedDocumentUtil.tryToFindExistingLeafParser(org.apache.tika.parser.txt.TXTParser.class, parseContext);
Parser txtParser = EmbeddedDocumentUtil.tryToFindExistingLeafParser(org.apache.tika.parser.csv.TextAndCSVParser.class, parseContext);
assertNotNull(txtParser);
assertEquals(org.apache.tika.parser.txt.TXTParser.class, txtParser.getClass());
assertEquals(org.apache.tika.parser.csv.TextAndCSVParser.class, txtParser.getClass());
}
}
......@@ -25,7 +25,7 @@
<parent>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parent</artifactId>
<version>1.20</version>
<version>1.21</version>
<relativePath>../tika-parent/pom.xml</relativePath>
</parent>
......@@ -104,23 +104,6 @@
<build>
<plugins>
<plugin>
<artifactId>maven-remote-resources-plugin</artifactId>
<version>1.5</version>
<executions>
<execution>
<goals>
<goal>bundle</goal>
</goals>
</execution>
</executions>
<configuration>
<includes>
<include>**/*.xml</include>
</includes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
......
......@@ -139,7 +139,13 @@ public class BatchProcess implements Callable<ParallelFileProcessingResult> {
try {
int numConsumers = consumersManager.getConsumers().size();
// fileResourceCrawler, statusReporter, the Interrupter, timeoutChecker
int numNonConsumers = 4;
int numNonConsumers = 2;
if (interrupter != null) {
numNonConsumers++;
}
if (reporter != null) {
numNonConsumers++;
}
ExecutorService ex = Executors.newFixedThreadPool(numConsumers
+ numNonConsumers);
......@@ -174,9 +180,13 @@ public class BatchProcess implements Callable<ParallelFileProcessingResult> {
LOG.info("BatchProcess starting up");
state.start = System.currentTimeMillis();
if (interrupter != null) {
completionService.submit(interrupter);
completionService.submit(fileResourceCrawler);
}
if (reporter != null) {
completionService.submit(reporter);
}
completionService.submit(fileResourceCrawler);
completionService.submit(timeoutChecker);
for (FileResourceConsumer consumer : consumersManager.getConsumers()) {
......@@ -237,7 +247,9 @@ public class BatchProcess implements Callable<ParallelFileProcessingResult> {
CompletionService<IFileProcessorFutureResult> completionService,
TimeoutChecker timeoutChecker, State state) {
if (reporter != null) {
reporter.setIsShuttingDown(true);
}
int added = fileResourceCrawler.getAdded();
int considered = fileResourceCrawler.getConsidered();
......
......@@ -131,10 +131,13 @@ public class BatchProcessBuilder {
//build crawler
crawler = buildCrawler(queue, keyNodes.get("crawler"), runtimeAttributes);
if (keyNodes.containsKey(reporter)) {
reporter = buildReporter(crawler, consumersManager, keyNodes.get("reporter"), runtimeAttributes);
}
if (keyNodes.containsKey("interrupter")) {
interrupter = buildInterrupter(keyNodes.get("interrupter"), pauseOnEarlyTerminationMillis, runtimeAttributes);
}
BatchProcess proc = new BatchProcess(
crawler, consumersManager, reporter, interrupter);
......
......@@ -25,7 +25,7 @@
<parent>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parent</artifactId>
<version>1.20</version>
<version>1.21</version>
<relativePath>../tika-parent/pom.xml</relativePath>
</parent>
......@@ -238,6 +238,9 @@
com.adobe.xmp.properties;resolution:=optional,
com.github.luben.zstd;resolution:=optional,
com.github.openjson;resolution:=optional,
com.google.common.util.concurrent.internal;resolution:=optional,
com.google.errorprone.annotations;resolution:=optional,
com.google.errorprone.annotations.concurrent;resolution:=optional,
com.google.protobuf;resolution:=optional,
com.ibm.icu.text;resolution:=optional,
com.parso;resolution:=optional,
......@@ -327,6 +330,7 @@
org.bouncycastle.operator.bc;resolution:=optional,
org.bouncycastle.tsp;resolution:=optional,
org.brotli.dec;resolution:=optional,
org.checkerframework.checker.nullness.qual;resolution:=optional,
org.cyberneko.html.xercesbridge;resolution:=optional,
org.etsi.uri.x01903.v14;resolution:=optional,
org.ibex.nestedvm;resolution:=optional,
......
......@@ -25,7 +25,7 @@
<parent>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parent</artifactId>
<version>1.20</version>
<version>1.21</version>
<relativePath>../tika-parent/pom.xml</relativePath>
</parent>
......
......@@ -269,9 +269,7 @@ public class EmbeddedDocumentUtil implements Serializable {
}
private static Parser findInComposite(CompositeParser p, Class clazz, ParseContext context) {
Map<MediaType, Parser> map = p.getParsers(context);
for (Map.Entry<MediaType, Parser> e : map.entrySet()) {
Parser candidate = e.getValue();
for (Parser candidate : p.getAllComponentParsers()) {
if (equals(candidate, clazz)) {
return candidate;
}
......
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.tika.io;
import java.io.IOException;
import java.io.InputStream;
/**
* Very slight modification of Commons' BoundedInputStream
* so that we can figure out if this hit the bound or not.
*/
public class BoundedInputStream extends InputStream {
private final static int EOF = -1;
private final long max;
private final InputStream in;
private long pos;
public BoundedInputStream(long max, InputStream in) {
this.max = max;
this.in = in;
}
@Override
public int read() throws IOException {
if (max >= 0 && pos >= max) {
return EOF;
}
final int result = in.read();
pos++;
return result;
}
/**
* Invokes the delegate's <code>read(byte[])</code> method.
*
* @param b the buffer to read the bytes into
* @return the number of bytes read or -1 if the end of stream or
* the limit has been reached.
* @throws IOException if an I/O error occurs
*/
@Override
public int read(final byte[] b) throws IOException {
return this.read(b, 0, b.length);
}
/**
* Invokes the delegate's <code>read(byte[], int, int)</code> method.
*
* @param b the buffer to read the bytes into
* @param off The start offset
* @param len The number of bytes to read
* @return the number of bytes read or -1 if the end of stream or
* the limit has been reached.
* @throws IOException if an I/O error occurs
*/
@Override
public int read(final byte[] b, final int off, final int len) throws IOException {
if (max >= 0 && pos >= max) {
return EOF;
}
final long maxRead = max >= 0 ? Math.min(len, max - pos) : len;
final int bytesRead = in.read(b, off, (int) maxRead);
if (bytesRead == EOF) {
return EOF;
}
pos += bytesRead;
return bytesRead;
}
/**
* Invokes the delegate's <code>skip(long)</code> method.
*
* @param n the number of bytes to skip
* @return the actual number of bytes skipped
* @throws IOException if an I/O error occurs
*/
@Override
public long skip(final long n) throws IOException {
final long toSkip = max >= 0 ? Math.min(n, max - pos) : n;
final long skippedBytes = in.skip(toSkip);
pos += skippedBytes;
return skippedBytes;
}
@Override
public void reset() throws IOException {
in.reset();
pos = 0;
}
@Override
public void mark(int readLimit) {
in.mark(readLimit);
}
public boolean hasHitBound() {
return pos >= max;
}
}
......@@ -1183,4 +1183,35 @@ public class IOUtils {
return (ch2 == -1);
}
/**
* Reads bytes from an input stream.
* This implementation guarantees that it will read as many bytes
* as possible before giving up; this may not always be the case for
* subclasses of {@link InputStream}.
*
* @param input where to read input from
* @param buffer destination
* @param offset initial offset into buffer
* @param length length to read, must be &gt;= 0
* @return actual length read; may be less than requested if EOF was reached
* @throws IOException if a read error occurs
* @since 2.2
*/
public static int read(final InputStream input, final byte[] buffer, final int offset, final int length)
throws IOException {
if (length < 0) {
throw new IllegalArgumentException("Length must not be negative: " + length);
}
int remaining = length;
while (remaining > 0) {
final int location = length - remaining;
final int count = input.read(buffer, offset + location, remaining);
if (count == -1) { // EOF
break;
}
remaining -= count;
}
return length - remaining;
}
}
......@@ -578,14 +578,45 @@ public class TikaInputStream extends TaggedInputStream {
return path != null;
}
/**
* If the user created this TikaInputStream with a file,
* the original file will be returned. If not, the entire stream
* will be spooled to a temporary file which will be deleted
* upon the close of this TikaInputStream
* @return
* @throws IOException
*/
public Path getPath() throws IOException {
return getPath(-1);
}
/**
*
* @param maxBytes if this is less than 0 and if an underlying file doesn't already exist,
* the full file will be spooled to disk
* @return the original path used in the initialization of this TikaInputStream,
* a temporary file if the stream was shorter than <code>maxBytes</code>, or <code>null</code>
* if the underlying stream was longer than maxBytes.
* @throws IOException
*/
public Path getPath(int maxBytes) throws IOException {
if (path == null) {
if (position > 0) {
throw new IOException("Stream is already being read");
} else {
// Spool the entire stream into a temporary file
path = tmp.createTempFile();
if (maxBytes > -1) {
try (InputStream lookAhead = new LookaheadInputStream(in, maxBytes)) {
Files.copy(lookAhead, path, REPLACE_EXISTING);
if (Files.size(path) >= maxBytes) {
return null;
}
}
} else {
// Spool the entire stream into a temporary file
Files.copy(in, path, REPLACE_EXISTING);
}
// Create a new input stream and make sure it'll get closed
InputStream newStream = Files.newInputStream(path);
......
......@@ -407,6 +407,45 @@ public class Metadata implements CreativeCommons, Geographic, HttpHeaders,
set(property, Integer.toString(value));
}
/**
* Adds the integer value of the identified metadata property.
*
* @since Apache Tika 1.21
* @param property seq integer property definition
* @param value property value
*/
public void add(Property property, int value) {
if(property.getPrimaryProperty().getPropertyType() != PropertyType.SEQ) {
throw new PropertyTypeException(PropertyType.SEQ, property.getPrimaryProperty().getPropertyType());
}
if(property.getPrimaryProperty().getValueType() != Property.ValueType.INTEGER) {
throw new PropertyTypeException(Property.ValueType.INTEGER, property.getPrimaryProperty().getValueType());
}
add(property, Integer.toString(value));
}
/**
* Gets the array of ints of the identified "seq" integer metadata property.
*
* @since Apache Tika 1.21
* @param property seq integer property definition
* @return array of ints
*/
public int[] getIntValues(Property property) {
if(property.getPrimaryProperty().getPropertyType() != PropertyType.SEQ) {
throw new PropertyTypeException(PropertyType.SEQ, property.getPrimaryProperty().getPropertyType());
}
if(property.getPrimaryProperty().getValueType() != Property.ValueType.INTEGER) {
throw new PropertyTypeException(Property.ValueType.INTEGER, property.getPrimaryProperty().getValueType());
}
String[] vals = getValues(property);
int[] ret = new int[vals.length];
for (int i = 0; i < vals.length; i++) {
ret[i] = Integer.parseInt(vals[i]);
}
return ret;
}
/**
* Sets the real or rational value of the identified metadata property.
*
......
......@@ -70,4 +70,9 @@ public interface PDF {
* in the document: on document open, before close, etc.
*/
Property ACTION_TRIGGER = Property.internalText(PDF_PREFIX+"actionTrigger");
Property CHARACTERS_PER_PAGE = Property.internalIntegerSequence(PDF_PREFIX+"charsPerPage");
Property UNMAPPED_UNICODE_CHARS_PER_PAGE =
Property.internalIntegerSequence(PDF_PREFIX+"unmappedUnicodeCharsPerPage");
}