diff options
3 files changed, 36 insertions, 1 deletions
diff --git a/src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java b/src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java index 333780a..e911a63 100644 --- a/src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java +++ b/src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java @@ -1,5 +1,6 @@ package org.zwobble.mammoth.docx; +import com.google.common.collect.ImmutableSet; import org.zwobble.mammoth.documents.*; import org.zwobble.mammoth.results.Result; import org.zwobble.mammoth.results.Warning; @@ -11,6 +12,7 @@ import org.zwobble.mammoth.xml.XmlElementList; import org.zwobble.mammoth.xml.XmlNode; import java.util.Optional; +import java.util.Set; import java.util.function.Function; import static com.google.common.collect.Iterables.filter; @@ -22,6 +24,10 @@ import static org.zwobble.mammoth.util.MammothLists.list; import static org.zwobble.mammoth.util.MammothStrings.trimLeft; public class BodyXmlReader { + private static final Set<String> IMAGE_TYPES_SUPPORTED_BY_BROWSERS = ImmutableSet.of( + "image/png", "image/gif", "image/jpeg", "image/svg+xml", "image/tiff"); + + private final Styles styles; private final Numbering numbering; private final Relationships relationships; @@ -278,7 +284,13 @@ public class BodyXmlReader { private ReadResult readImage(String imagePath, Optional<String> altText, InputStreamSupplier open) { Optional<String> contentType = contentTypes.findContentType(imagePath); Image image = new Image(altText, contentType, open); - return success(image); + + String contentTypeString = contentType.orElse("(unknown)"); + if (IMAGE_TYPES_SUPPORTED_BY_BROWSERS.contains(contentTypeString)) { + return success(image); + } else { + return ReadResult.withWarning(image, warning("Image of type " + contentTypeString + " is unlikely to display in web browsers")); + } } private String relationshipIdToDocxPath(String relationshipId) { diff --git a/src/main/java/org/zwobble/mammoth/docx/ReadResult.java b/src/main/java/org/zwobble/mammoth/docx/ReadResult.java index 31bbf2a..69c4d1b 100644 --- a/src/main/java/org/zwobble/mammoth/docx/ReadResult.java +++ b/src/main/java/org/zwobble/mammoth/docx/ReadResult.java @@ -49,6 +49,10 @@ public class ReadResult { return new ReadResult(list(), list(), list(warning)); } + public static ReadResult withWarning(DocumentElement element, Warning warning) { + return new ReadResult(list(element), list(), list(warning)); + } + private final List<DocumentElement> elements; private final List<DocumentElement> extra; private final List<Warning> warnings; diff --git a/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java b/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java index 62fced9..49542ec 100644 --- a/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java @@ -432,6 +432,25 @@ public class BodyXmlTests { } } + @Test + public void warningIfImageTypeIsUnsupportedByWebBrowsers() { + XmlElement element = inlineImageXml(embeddedBlipXml("rId5"), ""); + Relationships relationships = new Relationships(map( + "rId5", new Relationship("media/hat.emf"))); + DocxFile file = new InMemoryDocxFile(map("word/media/hat.emf", "Not an image at all!")); + ContentTypes contentTypes = new ContentTypes(map("emf", "image/x-emf"), map()); + + Result<?> result = read( + a(bodyReader, + with(RELATIONSHIPS, relationships), + with(DOCX_FILE, file), + with(CONTENT_TYPES, contentTypes)), + element); + assertThat( + result, + hasProperty("warnings", deepEquals(list(warning("Image of type image/x-emf is unlikely to display in web browsers"))))); + } + private XmlElement inlineImageXml(XmlElement blip, String description) { return element("w:drawing", list( element("wp:inline", imageXml(blip, description)))); |
