diff options
| author | Michael Williamson <mike@zwobble.org> | 2018-01-23 21:26:38 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2018-01-23 21:26:38 +0000 |
| commit | d9a34a0836a7e41a975017fb021f5af90d954ae5 (patch) | |
| tree | 0d479e2fc7d5023d9a1279406654acd5da7fed6c /src/main/java/org/zwobble/mammoth/internal/docx/DocumentReader.java | |
| parent | d54918c26a0e6eae954eaa2052c7e8ec546c3409 (diff) | |
Find main document part using _rels/.rels
Diffstat (limited to 'src/main/java/org/zwobble/mammoth/internal/docx/DocumentReader.java')
| -rw-r--r-- | src/main/java/org/zwobble/mammoth/internal/docx/DocumentReader.java | 36 |
1 files changed, 32 insertions, 4 deletions
diff --git a/src/main/java/org/zwobble/mammoth/internal/docx/DocumentReader.java b/src/main/java/org/zwobble/mammoth/internal/docx/DocumentReader.java index 4ef9c37..9d1b270 100644 --- a/src/main/java/org/zwobble/mammoth/internal/docx/DocumentReader.java +++ b/src/main/java/org/zwobble/mammoth/internal/docx/DocumentReader.java @@ -14,7 +14,8 @@ import java.nio.file.Path; import java.util.List; import java.util.Optional; -import static org.zwobble.mammoth.internal.util.Lists.list; +import static org.zwobble.mammoth.internal.util.Lists.*; +import static org.zwobble.mammoth.internal.util.Strings.trimLeft; public class DocumentReader { @FunctionalInterface @@ -23,12 +24,15 @@ public class DocumentReader { } public static InternalResult<Document> readDocument(Optional<Path> path, Archive zipFile) { + Relationships packageRelationships = readPackageRelationships(zipFile); + String documentFilename = findDocumentFilename(zipFile, packageRelationships); + Styles styles = readStyles(zipFile); Numbering numbering = readNumbering(zipFile); ContentTypes contentTypes = readContentTypes(zipFile); FileReader fileReader = new PathRelativeFileReader(path); BodyReaders bodyReaders = name -> { - Relationships relationships = readRelationships(zipFile, name); + Relationships relationships = readRelationshipsFor(zipFile, name); return new BodyXmlReader(styles, numbering, relationships, contentTypes, zipFile, fileReader); }; return InternalResult.flatMap( @@ -36,10 +40,30 @@ public class DocumentReader { readComments(zipFile, bodyReaders), (notes, comments) -> { DocumentXmlReader reader = new DocumentXmlReader(bodyReaders.forName("document"), notes, comments); - return reader.readElement(parseOfficeXml(zipFile, "word/document.xml")); + return reader.readElement(parseOfficeXml(zipFile, documentFilename)); }); } + private static Relationships readPackageRelationships(Archive archive) { + return readRelationships(archive, "_rels/.rels"); + } + + private static String findDocumentFilename(Archive archive, Relationships packageRelationships) { + String officeDocumentType = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"; + List<String> targets = eagerConcat( + eagerMap( + packageRelationships.findTargetsByType(officeDocumentType), + target -> trimLeft(target, '/') + ), + list("word/document.xml") + ); + List<String> validTargets = eagerFilter(targets, archive::exists); + return tryGetFirst(validTargets) + .orElseThrow(() -> new PassThroughException( + new IOException("Could not find word/document.xml in ZIP file. Are you sure this is a valid .docx file?") + )); + } + private static InternalResult<List<Comment>> readComments(Archive file, BodyReaders bodyReaders) { return tryParseOfficeXml(file, "word/comments.xml") .map(new CommentXmlReader(bodyReaders.forName("comments"))::readElement) @@ -75,8 +99,12 @@ public class DocumentReader { .orElse(ContentTypes.DEFAULT); } + private static Relationships readRelationshipsFor(Archive zipFile, String name) { + return readRelationships(zipFile, "word/_rels/" + name + ".xml.rels"); + } + private static Relationships readRelationships(Archive zipFile, String name) { - return tryParseOfficeXml(zipFile, "word/_rels/" + name + ".xml.rels") + return tryParseOfficeXml(zipFile, name) .map(RelationshipsXml::readRelationshipsXmlElement) .orElse(Relationships.EMPTY); } |
