Пример #1
0
        private static MemoryStream GetChapterStream(UnicodePDB uPdb, Int32 index, Boolean cleanMode)
        {
            var textAry = Encoding.Convert(Encoding.Unicode, Encoding.UTF8, uPdb.GetChapter(index));
            var mem     = MSManager.GetStream();

            mem.Write(AryHtmlA, 0, AryHtmlA.Length);
            mem.Write(uPdb.Catalogue[index].UTF8Name, 0, uPdb.Catalogue[index].UTF8Name.Length);
            if (cleanMode)
            {
                mem.Write(AryHtmlB1, 0, AryHtmlB1.Length);
                mem.Write(textAry, 0, textAry.Length);
                mem.Write(AryHtmlB2, 0, AryHtmlB2.Length);
            }
            else
            {
                mem.Write(AryHtmlC1, 0, AryHtmlC1.Length);
                //用div和br填充。
                for (int i = 0; i < textAry.Length; i++)
                {
                    if (textAry[i] == 0x0D && textAry[i + 1] == 0x0A)
                    {
                        ++i;
                        mem.Write(AryHtmlC3, 0, AryHtmlC3.Length);
                    }
                    else
                    {
                        mem.WriteByte(textAry[i]);
                    }
                }

                mem.Write(AryHtmlC2, 0, AryHtmlC2.Length);
            }
            mem.Seek(0, SeekOrigin.Begin);
            return(mem);
        }
Пример #2
0
 private void AddFile(FileInfo fi)
 {
     if (fi.Extension.Equals(".updb", StringComparison.OrdinalIgnoreCase))
     {
         var book = new UnicodePDB(fi.FullName);
         if (book.MD5 == null)
         {
             book = null;
             return;
         }
         foreach (var item in Books)
         {
             if (item.MD5.SequenceEqual(book.MD5))
             {
                 return;
             }
         }
         Books.Add(book);
         var li = new ListViewItem(book.Title);
         li.SubItems.Add(book.Author);
         li.SubItems.Add(String.Empty);
         li.ToolTipText = fi.FullName;
         ListViewUPdb.Items.Add(li);
     }
 }
Пример #3
0
        public static void CreatEPub(UnicodePDB uPdb, String fileName, Boolean cleanMode)
        {
            using (var zip = ZipStorer.Create(fileName, String.Empty))
            {
                zip.EncodeUTF8 = true;

                using (MemoryStream StmMinetype = MSManager.GetStream(), StmContainer = MSManager.GetStream(), StmCSS = MSManager.GetStream())
                {
                    StmMinetype.Write(AryMinetype, 0, AryMinetype.Length);
                    StmContainer.Write(AryContainer, 0, AryContainer.Length);
                    StmCSS.Write(AryCSS, 0, AryCSS.Length);
                    StmMinetype.Seek(0, SeekOrigin.Begin);
                    StmContainer.Seek(0, SeekOrigin.Begin);
                    StmCSS.Seek(0, SeekOrigin.Begin);
                    zip.AddStream(ZipStorer.Compression.Store, PathMimetype, StmMinetype, DateTime.Now, String.Empty);     //minetype 文件
                    zip.AddStream(ZipStorer.Compression.Deflate, PathContainer, StmContainer, DateTime.Now, string.Empty); //META-INF\container.xml文件
                    zip.AddStream(ZipStorer.Compression.Deflate, PathStyleSheet, StmCSS, DateTime.Now, string.Empty);      //样式表文件。
                }
                using (MemoryStream opf = MSManager.GetStream(), ncx = MSManager.GetStream())                              //opf信息和ncx信息文件。
                {
                    var title = Encoding.Convert(Encoding.Unicode, Encoding.UTF8, uPdb.InnerTitle);
                    opf.Write(AryOPFA, 0, AryOPFA.Length);
                    opf.Write(title, 0, title.Length);
                    opf.Write(AryOPFB, 0, AryOPFB.Length);
                    ncx.Write(AryNCXA, 0, AryNCXA.Length);
                    ncx.Write(title, 0, title.Length);
                    ncx.Write(AryNCXB, 0, AryNCXB.Length);
                    if (uPdb.Author != null)
                    {
                        var author = Encoding.Convert(Encoding.Unicode, Encoding.UTF8, uPdb.InnerAuthor);
                        opf.Write(AryOPFC, 0, AryOPFC.Length);
                        opf.Write(author, 0, author.Length);
                        opf.Write(AryOPFD, 0, AryOPFD.Length);
                        ncx.Write(AryNCXC, 0, AryNCXC.Length);
                        ncx.Write(author, 0, author.Length);
                        ncx.Write(AryNCXD, 0, AryNCXD.Length);
                    }
                    opf.Write(AryOPFE, 0, AryOPFE.Length);
                    for (int i = 0; i < uPdb.Catalogue.Count; i++)
                    {
                        var iStr   = Encoding.UTF8.GetBytes(i.ToString());
                        var iPPStr = Encoding.UTF8.GetBytes((i + 1).ToString());

                        opf.Write(AryOPFZ1, 0, AryOPFZ1.Length);
                        opf.Write(iStr, 0, iStr.Length);
                        opf.Write(AryOPFZ2, 0, AryOPFZ2.Length);
                        opf.Write(iStr, 0, iStr.Length);
                        opf.Write(AryOPFZ3, 0, AryOPFZ3.Length);

                        ncx.Write(AryNCXZ1, 0, AryNCXZ1.Length);
                        ncx.Write(iStr, 0, iStr.Length);
                        ncx.Write(AryNCXZ2, 0, AryNCXZ2.Length);
                        ncx.Write(iPPStr, 0, iPPStr.Length);
                        ncx.Write(AryNCXZ3, 0, AryNCXZ3.Length);
                        ncx.Write(uPdb.Catalogue[i].UTF8Name, 0, uPdb.Catalogue[i].UTF8Name.Length);
                        ncx.Write(AryNCXZ4, 0, AryNCXZ4.Length);
                        ncx.Write(iStr, 0, iStr.Length);
                        ncx.Write(AryNCXZ5, 0, AryNCXZ5.Length);
                    }
                    opf.Write(AryOPFF, 0, AryOPFF.Length);;
                    ncx.Write(AryNCXE, 0, AryNCXE.Length);
                    for (int i = 0; i < uPdb.Catalogue.Count; i++)
                    {
                        var iStr = Encoding.UTF8.GetBytes(i.ToString());
                        opf.Write(AryOPFZ4, 0, AryOPFZ4.Length);
                        opf.Write(iStr, 0, iStr.Length);
                        opf.Write(AryOPFZ5, 0, AryOPFZ5.Length);

                        //下面写入每章的信息
                        using (var chapter = GetChapterStream(uPdb, i, cleanMode))
                        {
                            zip.AddStream(ZipStorer.Compression.Deflate, $@"OEBPS\Text\Section{i}.xhtml", chapter, DateTime.Now, string.Empty);
                        }
                    }
                    opf.Write(AryOPFG, 0, AryOPFG.Length);
                    opf.Seek(0, SeekOrigin.Begin);
                    ncx.Seek(0, SeekOrigin.Begin);
                    zip.AddStream(ZipStorer.Compression.Deflate, PathContent, opf, DateTime.Now, string.Empty);
                    zip.AddStream(ZipStorer.Compression.Deflate, PathToc, ncx, DateTime.Now, string.Empty);
                }
            }
        }