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 0060a0e864 TIKA-4998 (#3432)
0060a0e864 is described below
commit 0060a0e86432d2bab9657305e79a192f1d54c1de
Author: Tim Allison <[email protected]>
AuthorDate: Tue Oct 27 12:06:36 2026 -0400
TIKA-4998 (#3432)
* [TIKA-4993] Upgrade poi.version from 5.5.1 to 6.0.0
* Refactor cell method to use Comment interface
Refactor cell method to use POI's Comment interface and deprecate the old
method.
* Fix method signature formatting in XSSFExcelExtractorDecorator
Co-authored-by: Copilot Autofix powered by AI
<[email protected]>
* Refactor comment handling in XSSFExcelExtractorDecorator
* TIKA-4998: bump emf limit
---------
Co-authored-by: Tilman Hausherr <[email protected]>
Co-authored-by: Copilot Autofix powered by AI
<[email protected]>
---
.../apache/tika/parser/microsoft/EMFParser.java | 17 ++++++++++++
.../renderer/microsoft/POIMetafileRenderer.java | 5 ++++
.../tika/parser/microsoft/EMFParserTest.java | 30 ++++++++++++++++++++++
3 files changed, 52 insertions(+)
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/EMFParser.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/EMFParser.java
index 89ece5004b..09d3bec35e 100644
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/EMFParser.java
+++
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/EMFParser.java
@@ -82,6 +82,23 @@ public class EMFParser extends AbstractMetafileParser {
public static Property EMF_ICON_ONLY =
Property.internalBoolean("emf:icon-only");
public static Property EMF_ICON_STRING =
Property.internalText("emf:icon-string");
+ /**
+ * POI 6 caps EMF comment records (e.g. an embedded WMF) at 1 MB; POI 5
allowed
+ * 100 MB, and real files carry comments up to ~30 MB.
+ */
+ public static final int MAX_COMMENT_RECORD_LENGTH = 100_000_000;
+
+ static {
+ raiseCommentRecordLength();
+ }
+
+ /** Sets POI's static EMF comment cap; never lowers one the caller already
raised. */
+ public static void raiseCommentRecordLength() {
+ if (HemfComment.getMaxRecordLength() < MAX_COMMENT_RECORD_LENGTH) {
+ HemfComment.setMaxRecordLength(MAX_COMMENT_RECORD_LENGTH);
+ }
+ }
+
public EMFParser() {
this(new MetafileParserConfig());
}
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/renderer/microsoft/POIMetafileRenderer.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/renderer/microsoft/POIMetafileRenderer.java
index 5281e7b07a..8036830f92 100644
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/renderer/microsoft/POIMetafileRenderer.java
+++
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/renderer/microsoft/POIMetafileRenderer.java
@@ -50,6 +50,7 @@ import org.apache.tika.metadata.Rendering;
import org.apache.tika.metadata.TikaCoreProperties;
import org.apache.tika.mime.MediaType;
import org.apache.tika.parser.ParseContext;
+import org.apache.tika.parser.microsoft.EMFParser;
import org.apache.tika.renderer.ImageFormat;
import org.apache.tika.renderer.ImageType;
import org.apache.tika.renderer.RenderRequest;
@@ -83,6 +84,10 @@ public class POIMetafileRenderer implements Renderer {
private static final Set<MediaType> SUPPORTED_TYPES =
Collections.unmodifiableSet(new HashSet<>(Arrays.asList(EMF,
WMF)));
+ static {
+ EMFParser.raiseCommentRecordLength();
+ }
+
/** What this renderer draws when the parse scopes no settings: 800 px
wide, RGB PNG. */
private final RenderSettings defaults = RenderSettings.defaults();
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/EMFParserTest.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/EMFParserTest.java
index e50588678f..84088e774f 100644
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/EMFParserTest.java
+++
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/EMFParserTest.java
@@ -23,6 +23,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.List;
@@ -246,5 +247,34 @@ public class EMFParserTest extends TikaTest {
assertContains("next-generation", txt);//this is stored in three
records -- test that no spaces are interpolated
}
+ /** POI 6 caps EMF comment records at 1 MB by default; 5.x allowed 100 MB.
*/
+ @Test
+ public void testLargeWmfComment() throws Exception {
+ byte[] emf;
+ try (InputStream is =
getResourceAsStream("/test-documents/testEMF.emf")) {
+ emf = is.readAllBytes();
+ }
+ int headerSize = ByteBuffer.wrap(emf, 4,
4).order(ByteOrder.LITTLE_ENDIAN).getInt();
+ int wmfSize = 2_000_000;
+ int dataSize = 24 + wmfSize;
+ ByteBuffer comment = ByteBuffer.allocate(12 +
dataSize).order(ByteOrder.LITTLE_ENDIAN);
+ comment.putInt(0x46).putInt(12 + dataSize).putInt(dataSize);
+ //"GDIC", EMR_COMMENT_WINDOWS_METAFILE, version, reserved, checksum,
flags, size
+ comment.putInt(0x43494447).putInt(0x80000001).putShort((short)
1).putShort((short) 0)
+ .putInt(0).putInt(0).putInt(wmfSize);
+ byte[] injected = new byte[emf.length + comment.capacity()];
+ System.arraycopy(emf, 0, injected, 0, headerSize);
+ System.arraycopy(comment.array(), 0, injected, headerSize,
comment.capacity());
+ System.arraycopy(emf, headerSize, injected, headerSize +
comment.capacity(),
+ emf.length - headerSize);
+ List<Metadata> metadataList;
+ try (TikaInputStream tis = TikaInputStream.get(injected)) {
+ metadataList = getRecursiveMetadata(tis, true);
+ }
+ Metadata container = metadataList.get(0);
+ assertNull(container.get(TikaCoreProperties.CONTAINER_EXCEPTION),
+ container.get(TikaCoreProperties.CONTAINER_EXCEPTION));
+ assertEquals("image/wmf",
metadataList.get(1).get(HttpHeaders.CONTENT_TYPE));
+ }
}