processFonts method

void processFonts(
  1. List<FontDetails> fontDetails,
  2. ArchiveFile fontTableFile,
  3. ArchiveFile fontTableRelsFile
)

Function for processing custom fonts

Implementation

void processFonts(List<FontDetails> fontDetails, ArchiveFile fontTableFile, ArchiveFile fontTableRelsFile) {
  final fileContent = utf8.decode(fontTableFile.content);
  final fontTableDoc = xml.XmlDocument.parse(fileContent);
  final fonts = fontTableDoc.findAllElements("w:font");
  if (fonts.isNotEmpty) {
    Map<String, Map<String, String>> tempFontMap = {};
    for (var font in fonts) {
      Map<String, String> tempFontDetails = {};
      var fontName = font.getAttribute("w:name");
      if (fontName != null) {
        var embedReg = font.findAllElements("w:embedRegular");
        if (embedReg.isNotEmpty) {
          var embedRegRid = embedReg.first.getAttribute("r:id");
          if (embedRegRid != null) {
            tempFontDetails["embedReg"] = embedRegRid;
          }
          var fontKey = embedReg.first.getAttribute("w:fontKey");
          if (fontKey != null) {
            tempFontDetails["fontKey"] = fontKey;
          }
        }

        if (tempFontDetails.isNotEmpty) {
          tempFontMap[fontName] = tempFontDetails;
        }
      }
    }

    final relFileContent = utf8.decode(fontTableRelsFile.content);
    final fontTableRelDoc = xml.XmlDocument.parse(relFileContent);
    final relationsships = fontTableRelDoc.findAllElements("Relationship");
    if (relationsships.isNotEmpty) {
      Map<String, String> relDetails = {};
      for (var rel in relationsships) {
        var relId = rel.getAttribute("Id");
        if (relId != null) {
          var target = rel.getAttribute("Target");
          if (target != null) {
            relDetails[relId] = target;
          }
        }
      }
      tempFontMap.forEach((key, value) {
        String fileName = "";
        String fontKey = "";
        value.forEach((key2, value2) {
          if (key2 == "embedReg") {
            var tempFileName = relDetails[value2];
            if (tempFileName != null) {
              fileName = tempFileName;
            }
          } else {
            fontKey = value2;
          }
        });
        fontDetails.add(FontDetails(key, fileName, fontKey));
      });
    }
  }
}