private Lvl getLevel(Numbering.AbstractNum theList, int level) { if (level > 8) level = 8; for (Lvl lvl : theList.getLvl()) { if (lvl.getIlvl().intValue() == level) return lvl; } return null; }
/** * Traverse the document, looking for fonts which have been applied, either directly, or via a * style. * * @return */ public Set<String> fontsInUse() { log.info("fontsInUse.."); getPropertyResolver(); // this inits our virtual DocDefaults style // Setup Set<String> fontsDiscovered = new java.util.HashSet<String>(); // // Keep track of styles we encounter, so we can // // inspect these for fonts // Set<String> stylesInUse = new java.util.HashSet<String>(); // // org.docx4j.wml.Styles styles = null; // if (this.getStyleDefinitionsPart()!=null) { // styles = (org.docx4j.wml.Styles)this.getStyleDefinitionsPart().getJaxbElement(); // } // // It is convenient to have a HashMap of styles // Map<String, Style> stylesDefined = new java.util.HashMap<String, Style>(); // if (styles!=null) { // for (Iterator<Style> iter = styles.getStyle().iterator(); iter.hasNext();) { // Style s = iter.next(); // stylesDefined.put(s.getStyleId(), s); // } // } // // We need to know what fonts and styles are used in the document org.docx4j.wml.Document wmlDocumentEl = (org.docx4j.wml.Document) this.getJaxbElement(); Body body = wmlDocumentEl.getBody(); List<Object> bodyChildren = body.getContent(); FontDiscoveryCharacterVisitor visitor = new FontDiscoveryCharacterVisitor(fontsDiscovered); RunFontSelector runFontSelector = new RunFontSelector( (WordprocessingMLPackage) this.pack, visitor, RunFontActionType.DISCOVERY); FontAndStyleFinder finder = new FontAndStyleFinder(runFontSelector, fontsDiscovered, null); finder.defaultCharacterStyle = this.getStyleDefinitionsPart().getDefaultCharacterStyle(); finder.defaultParagraphStyle = this.getStyleDefinitionsPart().getDefaultParagraphStyle(); new TraversalUtil(bodyChildren, finder); // finder.finish(); fontsDiscovered.add(runFontSelector.getDefaultFont()); // fonts in headers, footers? RelationshipsPart rp = this.getRelationshipsPart(); if (rp != null) { for (Relationship r : rp.getRelationships().getRelationship()) { Part part = rp.getPart(r); if (part instanceof FooterPart) { Ftr ftr = ((FooterPart) part).getJaxbElement(); finder.walkJAXBElements(ftr); } else if (part instanceof HeaderPart) { Hdr hdr = ((HeaderPart) part).getJaxbElement(); finder.walkJAXBElements(hdr); } } } // Styles in endnotes, footnotes? if (this.getEndNotesPart() != null) { log.debug("Looking at endnotes"); CTEndnotes endnotes = this.getEndNotesPart().getJaxbElement(); finder.walkJAXBElements(endnotes); } if (this.getFootnotesPart() != null) { log.debug("Looking at footnotes"); CTFootnotes footnotes = this.getFootnotesPart().getJaxbElement(); finder.walkJAXBElements(footnotes); } // Comments if (this.getCommentsPart() != null) { log.debug("Looking at comments"); Comments comments = this.getCommentsPart().getJaxbElement(); finder.walkJAXBElements(comments); } // Add fonts used in the styles we discovered // .. 2013 03 10: no longer necessary // Fonts can also be used in the numbering part // For now, treat any font mentioned in that part as in use. // Ideally, we'd only register fonts used in numbering levels // that were actually used in the document if (getNumberingDefinitionsPart() != null) { Numbering numbering = getNumberingDefinitionsPart().getJaxbElement(); for (Numbering.AbstractNum abstractNumNode : numbering.getAbstractNum()) { for (Lvl lvl : abstractNumNode.getLvl()) { if (lvl.getRPr() != null && lvl.getRPr().getRFonts() != null) { String fontName = lvl.getRPr().getRFonts().getAscii(); if (fontName != null) { fontsDiscovered.add(fontName); log.debug( "Registered " + fontName + " for abstract list " + abstractNumNode.getAbstractNumId() + " lvl " + lvl.getIlvl()); } } } } } return fontsDiscovered; }