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); }
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); } }
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); } } }