public Aspose.Words.Document GetDocument(string fileName, bool loadLicenseKey = true)
        {
            if (loadLicenseKey)
            {
                new Aspose.Words.License().SetLicense(GetLicenseKeyFilePath());
            }
            Aspose.Words.Document document = null;
            var dir = Path.Combine(Path.GetTempPath(), Path.GetFileNameWithoutExtension(fileName));

            if (!Directory.Exists(dir))
            {
                Directory.CreateDirectory(dir);
            }
            using (var zip = new ZipFile(fileName)) {
                zip.ExtractAll(dir, ExtractExistingFileAction.OverwriteSilently);
            }
            var info    = new DirectoryInfo(dir);
            var ncxInfo = info.GetFiles("*.ncx", SearchOption.AllDirectories).FirstOrDefault();

            if (ncxInfo != null && ncxInfo.Exists)
            {
                var ncx = GetNcx(ncxInfo);
                if (ncx != null && ncx.Map != null && ncx.Map.Points != null && ncx.Map.Points.Count > 0)
                {
                    var html  = @"<?xml version=""1.0"" encoding=""utf-8""?><html xmlns=""http://www.w3.org/1999/xhtml""><head><title>Tekst</title><style></style></head><body></body></html>";
                    var xhtml = XElement.Parse(html);

                    var baseDirectory = "";
                    var first         = true;
                    foreach (var point in ncx.Map.Points.OrderBy(x => x.Order))
                    {
                        PopulatePoints(ncxInfo, xhtml, ref baseDirectory, ref first, point);
                    }

                    xhtml = RenumerateFootnotes(xhtml);
                    xhtml = RepairLinks(xhtml);
                    xhtml = RepairImages(xhtml);
                    xhtml = RepairChapters(xhtml);
                    xhtml = RepairChapters(xhtml, "numerrozdz", "nanieparzytsa");
                    xhtml = RepairChapters(xhtml, "numerrozdz1", "nanieparzytsa");

                    var xhtmlPath = Path.Combine(ncxInfo.DirectoryName, "TempFile.html");
                    xhtml.Save(xhtmlPath);

                    var options = new Aspose.Words.Loading.LoadOptions {
                        LoadFormat = Aspose.Words.LoadFormat.Html,
                        BaseUri    = baseDirectory
                    };
                    document = new Aspose.Words.Document(xhtmlPath, options);
                    document.Styles.DefaultFont.LocaleId   = (int)Aspose.Words.Loading.EditingLanguage.Polish;
                    document.Styles.DefaultFont.LocaleIdBi = (int)Aspose.Words.Loading.EditingLanguage.Polish;

                    // footnotes
                    var builder = new Aspose.Words.DocumentBuilder(document);
                    var list    = new List <Aspose.Words.Fields.Field>();
                    var list2   = new List <Aspose.Words.Node>();
                    foreach (var field in document.Range.Fields)
                    {
                        if (field.Type == Aspose.Words.Fields.FieldType.FieldHyperlink)
                        {
                            var link = field as Aspose.Words.Fields.FieldHyperlink;
                            if (Regex.IsMatch(link.Result, @"^\[[0-9]+\]"))
                            {
                                var footnotePar = FindParagraph(document, link.Result);
                                if (footnotePar != null)
                                {
                                    list2.Add(footnotePar);
                                    var footnoteText = footnotePar.ToString(Aspose.Words.SaveFormat.Text).Replace(link.Result, "");
                                    builder.MoveToField(field, true);
                                    var f = builder.InsertFootnote(Aspose.Words.Notes.FootnoteType.Footnote, footnoteText.Trim());
                                    f.Font.Size      = 12;
                                    f.Font.Color     = System.Drawing.Color.Black;
                                    f.Font.Bold      = true;
                                    f.Font.Underline = Aspose.Words.Underline.None;
                                    list.Add(field);
                                }
                            }
                        }
                    }

                    if (list.Count > 0)
                    {
                        var _list  = list.ToArray();
                        var length = _list.Length;
                        for (int i = 0; i < length; i++)
                        {
                            _list[i].Remove();
                        }
                    }
                    if (list2.Count > 0)
                    {
                        var _list  = list2.ToArray();
                        var length = _list.Length;
                        for (int i = 0; i < length; i++)
                        {
                            try {
                                (_list[i] as Aspose.Words.Paragraph).Remove();
                            }
                            catch { }
                        }
                    }

                    // headings
                    var chapterTitleStyle = document.Styles.Where(x => x.Name == "chapter_title").FirstOrDefault();
                    if (chapterTitleStyle != null)
                    {
                        chapterTitleStyle.BaseStyleName = document.Styles[Aspose.Words.StyleIdentifier.Heading1].Name;
                    }
                    var subTitleStyle = document.Styles.Where(x => x.Name == "subtitle1" || x.Name == "subtitle").FirstOrDefault();
                    if (subTitleStyle != null)
                    {
                        subTitleStyle.BaseStyleName = document.Styles[Aspose.Words.StyleIdentifier.Heading2].Name;
                    }
                    var subTitle2Style = document.Styles.Where(x => x.Name == "subtitle2").FirstOrDefault();
                    if (subTitle2Style != null)
                    {
                        subTitle2Style.BaseStyleName = document.Styles[Aspose.Words.StyleIdentifier.Heading3].Name;
                    }
                }
            }

            Directory.Delete(dir, true);

            return(document);
        }