예제 #1
0
        public void RemoveCoverTest()
        {
            var epub1 = EpubReader.Read(Cwd.Combine(@"Samples/epub-assorted/Inversions - Iain M. Banks.epub"));

            var writer = new EpubWriter(EpubWriter.MakeCopy(epub1));

            writer.RemoveCover();

            var epub2 = WriteAndRead(writer);

            Assert.NotNull(epub1.CoverImage);
            Assert.Null(epub2.CoverImage);
            Assert.Equal(epub1.Resources.Images.Count - 1, epub2.Resources.Images.Count);
        }
예제 #2
0
        public void RemoveCoverTest()
        {
            var epub1 = EpubReader.Read(@"Samples/epub-assorted/afrique_du_sud_2016_carnet_petit_fute.epub", null);

            var writer = new EpubWriter(EpubWriter.MakeCopy(epub1));

            writer.RemoveCover();

            var epub2 = WriteAndRead(writer);

            Assert.IsNotNull(epub1.CoverImage);
            Assert.IsNull(epub2.CoverImage);
            Assert.AreEqual(epub1.Resources.Images.Count - 1, epub2.Resources.Images.Count);
        }
예제 #3
0
        private void ReadWriteTest(List <string> archives)
        {
            foreach (var archive in archives)
            {
                var originalEpub = EpubReader.Read(archive);

                var stream = new MemoryStream();
                EpubWriter.Write(originalEpub, stream);
                stream.Seek(0, SeekOrigin.Begin);
                var savedEpub = EpubReader.Read(stream, false);

                AssertEpub(originalEpub, savedEpub);
            }
        }
예제 #4
0
        public void ClearChaptersTest()
        {
            var writer = new EpubWriter();

            writer.AddChapter("Chapter 1", "bla bla bla");
            writer.AddChapter("Chapter 2", "foo bar");
            writer.AddChapter("Chapter 3", "fooz barz");

            var epub = WriteAndRead(writer);

            Assert.AreEqual(3, epub.TableOfContents.Count);

            writer = new EpubWriter(epub);
            writer.ClearChapters();

            epub = WriteAndRead(writer);
            Assert.AreEqual(0, epub.TableOfContents.Count);
        }
예제 #5
0
        public void AddRemoveTitleTest()
        {
            var writer = new EpubWriter();

            writer.SetTitle("Title1");
            var epub = WriteAndRead(writer);

            Assert.AreEqual("Title1", epub.Title);

            writer.SetTitle("Title2");
            epub = WriteAndRead(writer);
            Assert.AreEqual("Title2", epub.Title);

            writer.RemoveTitle();
            epub = WriteAndRead(writer);
            Assert.IsNull(epub.Title);

            writer.RemoveTitle();
        }
예제 #6
0
        public void CanAddChapterTest()
        {
            var writer   = new EpubWriter();
            var chapters = new[]
            {
                writer.AddChapter("Chapter 1", "bla bla bla"),
                writer.AddChapter("Chapter 2", "foo bar")
            };
            var epub = WriteAndRead(writer);

            Assert.AreEqual("Chapter 1", chapters[0].Title);
            Assert.AreEqual("Chapter 2", chapters[1].Title);

            Assert.AreEqual(2, epub.TableOfContents.Count);
            for (var i = 0; i < chapters.Length; ++i)
            {
                Assert.AreEqual(chapters[i].Title, epub.TableOfContents[i].Title);
                Assert.AreEqual(chapters[i].FileName, epub.TableOfContents[i].FileName);
                Assert.AreEqual(chapters[i].Anchor, epub.TableOfContents[i].Anchor);
                Assert.AreEqual(0, chapters[i].SubChapters.Count);
                Assert.AreEqual(0, epub.TableOfContents[i].SubChapters.Count);
            }
        }
예제 #7
0
        public void CanAddChapterTest()
        {
            var writer   = new EpubWriter();
            var chapters = new[]
            {
                writer.AddChapter("Chapter 1", "bla bla bla"),
                writer.AddChapter("Chapter 2", "foo bar")
            };
            var epub = WriteAndRead(writer);

            Assert.Equal("Chapter 1", chapters[0].Title);
            Assert.Equal("Chapter 2", chapters[1].Title);

            Assert.Equal(2, epub.TableOfContents.Count);
            for (var i = 0; i < chapters.Length; ++i)
            {
                Assert.Equal(chapters[i].Title, epub.TableOfContents[i].Title);
                Assert.Equal(chapters[i].RelativePath, epub.TableOfContents[i].RelativePath);
                Assert.Equal(chapters[i].HashLocation, epub.TableOfContents[i].HashLocation);
                Assert.Equal(0, chapters[i].SubChapters.Count);
                Assert.Equal(0, epub.TableOfContents[i].SubChapters.Count);
            }
        }
예제 #8
0
        public void AddFileTest()
        {
            var writer = new EpubWriter();

            writer.AddFile("style.css", "body {}", EpubContentType.Css);
            writer.AddFile("img.jpeg", new byte[] { 0x42 }, EpubContentType.ImageJpeg);
            writer.AddFile("font.ttf", new byte[] { 0x24 }, EpubContentType.FontTruetype);

            var epub = WriteAndRead(writer);

            Assert.AreEqual(1, epub.Resources.Css.Count);
            Assert.AreEqual("style.css", epub.Resources.Css.First().FileName);
            Assert.AreEqual("body {}", epub.Resources.Css.First().TextContent);

            Assert.AreEqual(1, epub.Resources.Images.Count);
            Assert.AreEqual("img.jpeg", epub.Resources.Images.First().FileName);
            Assert.AreEqual(1, epub.Resources.Images.First().Content.Length);
            Assert.AreEqual(0x42, epub.Resources.Images.First().Content.First());

            Assert.AreEqual(1, epub.Resources.Fonts.Count);
            Assert.AreEqual("font.ttf", epub.Resources.Fonts.First().FileName);
            Assert.AreEqual(1, epub.Resources.Fonts.First().Content.Length);
            Assert.AreEqual(0x24, epub.Resources.Fonts.First().Content.First());
        }
예제 #9
0
 public abstract string ConvertToHtml(FileInfo file, EpubWriter writer);
예제 #10
0
        public void GenerateEpub(Settings options, string[] files)
        {
            EpubWriter writer = new EpubWriter();

            writer.AddAuthor(options.Author);

            if (!string.IsNullOrWhiteSpace(options.Cover))
            {
                using (var ms = new MemoryStream())
                {
                    try
                    {
                        var img = Image.FromFile(options.GetPathStr(options.Cover), true);
                        img.Save(ms, img.RawFormat);
                        writer.SetCover(ms.ToArray(), ImageFormat.Png);
                        writer.AddChapter("Cover", GeneratePageTemplate("<img src='cover.png' />"));
                    }
                    catch (FileNotFoundException e)
                    {
                        LastStatus = $"Failed to find Cover Image at {options.GetPathStr(options.Cover)}. Defaulting to blank cover image. If you have a proper cover, please provide a relative path to it in the settings json file";
                        var img = new Bitmap(1, 1);
                        img.SetPixel(0, 0, Color.White);
                        img.Save(ms, SysImg.ImageFormat.Png);
                        writer.SetCover(ms.ToArray(), ImageFormat.Png);
                    }
                }
            }
            writer.SetTitle(options.Title);

            int maxLength = files.Length * 2 + 1;

            for (int i = 0; i < files.Length; i++)
            {
                string   file = files[i];
                FileInfo info = new FileInfo(file);
                string   text = string.Empty;
                try
                {
                    OnProgress(i * 2, maxLength);
                    text = ConvertToHtml(info, writer);
                }
                catch (Exception ex)
                {
                    throw new Exception($"Unable to convert file: {file}", ex);
                }
                writer.AddChapter(info.Name.Replace($".{FileType}", ""), text);
                OnProgress(i * 2 + 1, maxLength);
            }

            if (files.Length == 0)
            {
                string path = Path.GetDirectoryName(options.Path);
                if (path == ".")
                {
                    path = Environment.CurrentDirectory;
                }
                LastStatus = $"No {FileType} files found in {path}";
            }

            writer.Write(options.GetTitlePath());
            OnProgress(maxLength, maxLength);
        }
 private EpubBuilder()
 {
     _writer = new EpubWriter();
 }
예제 #12
0
        public override string ConvertToHtml(FileInfo file, EpubWriter writer)
        {
            this.LastStatus = $"Processing File: {file.Name}";
            byte[] byteArray = File.ReadAllBytes(file.FullName);
            using (MemoryStream memoryStream = new MemoryStream())
            {
                memoryStream.Write(byteArray, 0, byteArray.Length);
                using (WordprocessingDocument wDoc = WordprocessingDocument.Open(memoryStream, true))
                {
                    var pageTitle = file.FullName;
                    var part      = wDoc.CoreFilePropertiesPart;
                    if (part != null)
                    {
                        pageTitle = (string)part.GetXDocument().Descendants(DC.title).FirstOrDefault() ?? file.FullName;
                    }

                    HtmlConverterSettings settings = new HtmlConverterSettings()
                    {
                        AdditionalCss                       = "body { margin: 1cm auto; max-width: 20cm; padding: 0; }",
                        PageTitle                           = pageTitle,
                        FabricateCssClasses                 = true,
                        CssClassPrefix                      = "pt-",
                        RestrictToSupportedLanguages        = false,
                        RestrictToSupportedNumberingFormats = false,
                        ImageHandler                        = imageInfo =>
                        {
                            string             extension   = imageInfo.ContentType.Split('/')[1].ToLower();
                            SysImg.ImageFormat imageFormat = null;
                            if (extension == "png")
                            {
                                imageFormat = SysImg.ImageFormat.Png;
                            }
                            else if (extension == "gif")
                            {
                                imageFormat = SysImg.ImageFormat.Gif;
                            }
                            else if (extension == "bmp")
                            {
                                imageFormat = SysImg.ImageFormat.Bmp;
                            }
                            else if (extension == "jpeg")
                            {
                                imageFormat = SysImg.ImageFormat.Jpeg;
                            }
                            else if (extension == "tiff")
                            {
                                // Convert tiff to gif.
                                extension   = "gif";
                                imageFormat = SysImg.ImageFormat.Gif;
                            }
                            else if (extension == "x-wmf")
                            {
                                extension   = "wmf";
                                imageFormat = SysImg.ImageFormat.Wmf;
                            }

                            // If the image format isn't one that we expect, ignore it,
                            // and don't return markup for the link.
                            if (imageFormat == null)
                            {
                                return(null);
                            }

                            string fileName = $"{Guid.NewGuid()}.{extension}";
                            string filePath = $"images/{fileName}";

                            using (var ms = new MemoryStream())
                            {
                                imageInfo.Bitmap.Save(ms, SysImg.ImageFormat.Png);
                                writer.AddFile(filePath, ms.ToArray(), EpubSharp.Format.EpubContentType.ImagePng);
                            }

                            XElement ximg = new XElement(Xhtml.img,
                                                         new XAttribute(NoNamespace.src, filePath),
                                                         imageInfo.ImgStyleAttribute,
                                                         imageInfo.AltText != null ?
                                                         new XAttribute(NoNamespace.alt, imageInfo.AltText) : null);
                            return(ximg);
                        }
                    };
                    XElement htmlElement = HtmlConverter.ConvertToHtml(wDoc, settings);

                    var html = new XDocument(
                        new XDocumentType("html", null, null, null),
                        htmlElement);


                    var htmlString = html.ToString(SaveOptions.DisableFormatting);
                    return(htmlString);
                }
            }
        }
예제 #13
0
        public static void Main()
        {
            var writer = new EpubWriter();

            writer.AddAuthor("Furesoft");
            var uris = new[] {
                "https://rss.golem.de/rss.php?tp=dev&feed=RSS2.0",
                "https://www.heise.de/rss/heiseplus-atom.xml",
                "https://www.spiegel.de/schlagzeilen/tops/index.rss",
                "https://www.spiegel.de/schlagzeilen/index.rss",
                "https://www.welt.de/feeds/topnews.rss",
            };

            var feedinfo = new List <object>();
            var ids      = new Dictionary <string, string>();

            foreach (var uri in uris)
            {
                var feed = FeedReader.ReadAsync(uri).Result;
                var id   = Guid.NewGuid().ToString();

                feedinfo.Add(new { title = feed.Title, id });
                ids.Add(feed.Title, id);
            }

            var noc = Template.Parse(Resources.TOC).Render(new { info = feedinfo });

            writer.AddFile("toc.ncx", noc, EpubSharp.Format.EpubContentType.Xml);

            foreach (var uri in uris)
            {
                var feed = FeedReader.ReadAsync(uri).Result;

                if (feed.ImageUrl != null)
                {
                    var webClient = new WebClient();
                    var logo      = webClient.DownloadData(feed.ImageUrl);
                    writer.AddFile(Path.GetFileName(feed.ImageUrl), logo, EpubSharp.Format.EpubContentType.ImageJpeg);
                }

                foreach (var item in feed.Items)
                {
                    if (item.Content != null)
                    {
                        var d = new HtmlDocument();
                        d.LoadHtml(item.Content);

                        var nodes = d.DocumentNode.SelectNodes("img");
                        if (nodes != null)
                        {
                            foreach (var n in nodes)
                            {
                                var url = n.Attributes["src"].Value;

                                //download image
                                var webClient = new WebClient();
                                var logo      = webClient.DownloadData(url);
                                writer.AddFile(Path.GetFileName(url), logo, EpubSharp.Format.EpubContentType.ImageJpeg);
                                //set new uri
                                n.Attributes["src"].Value = Path.GetFileName(url);
                            }

                            var ms = new MemoryStream();
                            d.Save(ms);

                            item.Content = Encoding.UTF8.GetString(ms.ToArray());
                        }
                    }
                }

                var template      = Template.Parse(Resources.Template);
                var scriptObject1 = new ScriptObject
                {
                    { "logo", Path.GetFileName(feed.ImageUrl) },
                    { "feed", feed }
                };

                var context = new TemplateContext();
                context.PushGlobal(scriptObject1);

                var result = template.Render(context);

                writer.AddChapter(feed.Title, result, ids[feed.Title]);
            }

            writer.SetCover(Resources.cover, ImageFormat.Jpeg);

            writer.SetTitle($"epaper_{DateTime.Now.Date}");
            writer.Write($"epaper_{DateTime.Now.Date.ToShortDateString()}.epub");
        }