diff --git a/server/pom.xml b/server/pom.xml
index 0baafae8..b1679048 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -91,17 +91,33 @@
poi
org.apache.poi
+
+ org.apache.poi
+ ooxml-schemas
+
fr.opensagres.xdocreport
org.apache.poi.xwpf.converter.xhtml
${xdocreport.version}
+
+
+ org.apache.poi
+ ooxml-schemas
+
+
fr.opensagres.xdocreport
fr.opensagres.xdocreport.document
${xdocreport.version}
+
+
+ org.apache.poi
+ ooxml-schemas
+
+
com.aspose
diff --git a/server/src/test/java/cn/keking/utils/OfficeSchemaCompatibilityTests.java b/server/src/test/java/cn/keking/utils/OfficeSchemaCompatibilityTests.java
new file mode 100644
index 00000000..ed48a9df
--- /dev/null
+++ b/server/src/test/java/cn/keking/utils/OfficeSchemaCompatibilityTests.java
@@ -0,0 +1,64 @@
+package cn.keking.utils;
+
+import org.apache.poi.extractor.ExtractorFactory;
+import org.apache.poi.extractor.POITextExtractor;
+import org.apache.poi.xslf.usermodel.XMLSlideShow;
+import org.apache.poi.xwpf.usermodel.XWPFDocument;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Collections;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+class OfficeSchemaCompatibilityTests {
+
+ @TempDir
+ Path directory;
+
+ @Test
+ void shouldLoadOneSchemaDefinitionForEachOfficeFormat() throws Exception {
+ for (String schema : new String[]{
+ "org/openxmlformats/schemas/wordprocessingml/x2006/main/DocumentDocument.class",
+ "org/openxmlformats/schemas/presentationml/x2006/main/SldMasterDocument.class"}) {
+ List definitions = Collections.list(getClass().getClassLoader().getResources(schema));
+ assertEquals(1, definitions.size(), () -> "Conflicting Office schema definitions: " + definitions);
+ }
+ }
+
+ @Test
+ void shouldReadDocxWithCurrentPoiSchemas() throws Exception {
+ Path file = directory.resolve("sample.docx");
+ try (XWPFDocument document = new XWPFDocument(); OutputStream output = Files.newOutputStream(file)) {
+ document.createParagraph().createRun().setText("Schema compatibility");
+ document.write(output);
+ }
+ assertReadable(file);
+ }
+
+ @Test
+ void shouldReadPptxWithCurrentPoiSchemas() throws Exception {
+ Path file = directory.resolve("sample.pptx");
+ try (XMLSlideShow document = new XMLSlideShow(); OutputStream output = Files.newOutputStream(file)) {
+ document.createSlide().createTextBox().setText("Schema compatibility");
+ document.write(output);
+ }
+ assertReadable(file);
+ }
+
+ private void assertReadable(Path file) throws Exception {
+ try (InputStream input = Files.newInputStream(file);
+ POITextExtractor extractor = ExtractorFactory.createExtractor(input)) {
+ assertTrue(extractor.getText().contains("Schema compatibility"));
+ }
+ assertFalse(OfficeUtils.isPwdProtected(file.toString()));
+ }
+}