2016-05-26 15:43:00 m372897500 阅读数 5152

demo功能:读取epub电子书的阅读器demo,可以更改字体大小,查询,按电子书章节索引。

demo说明:按照epub结构读取内容并显示。主要使用webview显示内容,章节内用js制作的翻页效果(效果不是很好,有点闪烁)。主要代码在:EPubViewController.m中。

demo截屏:



demo的主要代码:翻页控制部分

  1. - (void) chapterDidFinishLoad:(Chapter *)chapter{  
  2.     totalPagesCount+=chapter.pageCount;  
  3.   
  4.     if(chapter.chapterIndex + 1 < [loadedEpub.spineArray count]){  
  5.         [[loadedEpub.spineArray objectAtIndex:chapter.chapterIndex+1] setDelegate:self];  
  6.         [[loadedEpub.spineArray objectAtIndex:chapter.chapterIndex+1] loadChapterWithWindowSize:webView.bounds fontPercentSize:currentTextSize];  
  7.         [currentPageLabel setText:[NSString stringWithFormat:@"?/%d", totalPagesCount]];  
  8.     } else {  
  9.         [currentPageLabel setText:[NSString stringWithFormat:@"%d/%d",[self getGlobalPageCount], totalPagesCount]];  
  10.         [pageSlider setValue:(float)100*(float)[self getGlobalPageCount]/(float)totalPagesCount animated:YES];  
  11.         paginating = NO;  
  12.         NSLog(@"Pagination Ended!");  
  13.     }  
  14. }  
  15.   
  16. - (int) getGlobalPageCount{  
  17.     int pageCount = 0;  
  18.     for(int i=0; i<currentSpineIndex; i++){  
  19.         pageCount+= [[loadedEpub.spineArray objectAtIndex:i] pageCount];   
  20.     }  
  21.     pageCount+=currentPageInSpineIndex+1;  
  22.     return pageCount;  
  23. }  
  24.   
  25. - (void) loadSpine:(int)spineIndex atPageIndex:(int)pageIndex {  
  26.     [self loadSpine:spineIndex atPageIndex:pageIndex highlightSearchResult:nil];  
  27. }  
  28.   
  29. - (void) loadSpine:(int)spineIndex atPageIndex:(int)pageIndex highlightSearchResult:(SearchResult*)theResult{  
  30.       
  31.     webView.hidden = YES;  
  32.       
  33.     self.currentSearchResult = theResult;  
  34.   
  35.     [chaptersPopover dismissPopoverAnimated:YES];  
  36.     [searchResultsPopover dismissPopoverAnimated:YES];  
  37.       
  38.     NSURL* url = [NSURL fileURLWithPath:[[loadedEpub.spineArray objectAtIndex:spineIndex] spinePath]];  
  39.     [webView loadRequest:[NSURLRequest requestWithURL:url]];  
  40.     currentPageInSpineIndex = pageIndex;  
  41.     currentSpineIndex = spineIndex;  
  42.     if(!paginating){  
  43.         [currentPageLabel setText:[NSString stringWithFormat:@"%d/%d",[self getGlobalPageCount], totalPagesCount]];  
  44.         [pageSlider setValue:(float)100*(float)[self getGlobalPageCount]/(float)totalPagesCount animated:YES];    
  45.     }  
  46. }  
  47.   
  48. - (void) gotoPageInCurrentSpine:(int)pageIndex{  
  49.     if(pageIndex>=pagesInCurrentSpineCount){  
  50.         pageIndex = pagesInCurrentSpineCount - 1;  
  51.         currentPageInSpineIndex = pagesInCurrentSpineCount - 1;   
  52.     }  
  53.       
  54.     float pageOffset = pageIndex*webView.bounds.size.width;  
  55.   
  56. //注入js 滚动到指定的坐标--js翻页效果  
  57.     NSString* goToOffsetFunc = [NSString stringWithFormat:@" function pageScroll(xOffset){ window.scroll(xOffset,0); } "];  
  58.     NSString* goTo =[NSString stringWithFormat:@"pageScroll(%f)", pageOffset];  
  59.       
  60.     [webView stringByEvaluatingJavaScriptFromString:goToOffsetFunc];  
  61.     [webView stringByEvaluatingJavaScriptFromString:goTo];  
  62.       
  63.     if(!paginating){  
  64.         [currentPageLabel setText:[NSString stringWithFormat:@"%d/%d",[self getGlobalPageCount], totalPagesCount]];  
  65.         [pageSlider setValue:(float)100*(float)[self getGlobalPageCount]/(float)totalPagesCount animated:YES];    
  66.     }  
  67.       
  68.     webView.hidden = NO;  
  69.       
  70. }  
  71.   
  72. - (void) gotoNextSpine {  
  73.     if(!paginating){  
  74.         if(currentSpineIndex+1<[loadedEpub.spineArray count]){  
  75.             [self loadSpine:++currentSpineIndex atPageIndex:0];  
  76.         }     
  77.     }  
  78. }  
  79.   
  80. - (void) gotoPrevSpine {  
  81.     if(!paginating){  
  82.         if(currentSpineIndex-1>=0){  
  83.             [self loadSpine:--currentSpineIndex atPageIndex:0];  
  84.         }     
  85.     }  
  86. }  
  87.   
  88. - (void) gotoNextPage {  
  89.     if(!paginating){  
  90.         if(currentPageInSpineIndex+1<pagesInCurrentSpineCount){  
  91.             [self gotoPageInCurrentSpine:++currentPageInSpineIndex];  
  92.         } else {  
  93.             [self gotoNextSpine];  
  94.         }         
  95.     }  
  96. }  
  97.   
  98. - (void) gotoPrevPage {  
  99.     if (!paginating) {  
  100.         if(currentPageInSpineIndex-1>=0){  
  101.             [self gotoPageInCurrentSpine:--currentPageInSpineIndex];  
  102.         } else {  
  103.             if(currentSpineIndex!=0){  
  104.                 int targetPage = [[loadedEpub.spineArray objectAtIndex:(currentSpineIndex-1)] pageCount];  
  105.                 [self loadSpine:--currentSpineIndex atPageIndex:targetPage-1];  
  106.             }  
  107.         }  
  108.     }  
  109. }  
  110.   
  111.   
  112. - (IBAction) increaseTextSizeClicked:(id)sender{  
  113.     if(!paginating){  
  114.         if(currentTextSize+25<=200){  
  115.             currentTextSize+=25;  
  116.             [self updatePagination];  
  117.             if(currentTextSize == 200){  
  118.                 [incTextSizeButton setEnabled:NO];  
  119.             }  
  120.             [decTextSizeButton setEnabled:YES];  
  121.         }  
  122.     }  
  123. }  
  124. - (IBAction) decreaseTextSizeClicked:(id)sender{  
  125.     if(!paginating){  
  126.         if(currentTextSize-25>=50){  
  127.             currentTextSize-=25;  
  128.             [self updatePagination];  
  129.             if(currentTextSize==50){  
  130.                 [decTextSizeButton setEnabled:NO];  
  131.             }  
  132.             [incTextSizeButton setEnabled:YES];  
  133.         }  
  134.     }  
  135. }  
  136.   
  137. - (IBAction) doneClicked:(id)sender{  
  138.     [self dismissModalViewControllerAnimated:YES];  
  139. }  
  140.   
  141.   
  142. - (IBAction) slidingStarted:(id)sender{  
  143.     int targetPage = ((pageSlider.value/(float)100)*(float)totalPagesCount);  
  144.     if (targetPage==0) {  
  145.         targetPage++;  
  146.     }  
  147.     [currentPageLabel setText:[NSString stringWithFormat:@"%d/%d", targetPage, totalPagesCount]];  
  148. }  
  149.   
  150. - (IBAction) slidingEnded:(id)sender{  
  151.     int targetPage = (int)((pageSlider.value/(float)100)*(float)totalPagesCount);  
  152.     if (targetPage==0) {  
  153.         targetPage++;  
  154.     }  
  155.     int pageSum = 0;  
  156.     int chapterIndex = 0;  
  157.     int pageIndex = 0;  
  158.     for(chapterIndex=0; chapterIndex<[loadedEpub.spineArray count]; chapterIndex++){  
  159.         pageSum+=[[loadedEpub.spineArray objectAtIndex:chapterIndex] pageCount];  
  160. //      NSLog(@"Chapter %d, targetPage: %d, pageSum: %d, pageIndex: %d", chapterIndex, targetPage, pageSum, (pageSum-targetPage));  
  161.         if(pageSum>=targetPage){  
  162.             pageIndex = [[loadedEpub.spineArray objectAtIndex:chapterIndex] pageCount] - 1 - pageSum + targetPage;  
  163.             break;  
  164.         }  
  165.     }  
  166.     [self loadSpine:chapterIndex atPageIndex:pageIndex];  
  167. }  
  168.   
  169. - (IBAction) showChapterIndex:(id)sender{  
  170.     if(chaptersPopover==nil){  
  171.         ChapterListViewController* chapterListView = [[ChapterListViewController alloc] initWithNibName:@"ChapterListViewController" bundle:[NSBundle mainBundle]];  
  172.         [chapterListView setEpubViewController:self];  
  173.         chaptersPopover = [[UIPopoverController alloc] initWithContentViewController:chapterListView];  
  174.         [chaptersPopover setPopoverContentSize:CGSizeMake(400, 600)];  
  175.         [chapterListView release];  
  176.     }  
  177.     if ([chaptersPopover isPopoverVisible]) {  
  178.         [chaptersPopover dismissPopoverAnimated:YES];  
  179.     }else{  
  180.         [chaptersPopover presentPopoverFromBarButtonItem:chapterListButton permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];         
  181.     }  
  182. }  
  183.   
  184.   
  185. //webview 完成加载,将css注入。webview加载一次是一个epub里的xhtml内容,可能是一页,也可能是多页。  
  186. //可以看看demo中的.epub文件。将.epub改成zip 解压就可以看到epub的内容  
  187. - (void)webViewDidFinishLoad:(UIWebView *)theWebView{  
  188.       
  189.     NSString *varMySheet = @"var mySheet = document.styleSheets[0];";  
  190.       
  191.     NSString *addCSSRule =  @"function addCSSRule(selector, newRule) {"  
  192.     "if (mySheet.addRule) {"  
  193.     "mySheet.addRule(selector, newRule);"                               // For Internet Explorer  
  194.     "} else {"  
  195.     "ruleIndex = mySheet.cssRules.length;"  
  196.     "mySheet.insertRule(selector + '{' + newRule + ';}', ruleIndex);"   // For Firefox, Chrome, etc.  
  197.     "}"  
  198.     "}";  
  199.       
  200.     NSString *insertRule1 = [NSString stringWithFormat:@"addCSSRule('html', 'padding: 0px; height: %fpx; -webkit-column-gap: 0px; -webkit-column-width: %fpx;')", webView.frame.size.height, webView.frame.size.width];  
  201.     NSString *insertRule2 = [NSString stringWithFormat:@"addCSSRule('p', 'text-align: justify;')"];  
  202.     NSString *setTextSizeRule = [NSString stringWithFormat:@"addCSSRule('body', '-webkit-text-size-adjust: %d%%;')", currentTextSize];  
  203.     NSString *setHighlightColorRule = [NSString stringWithFormat:@"addCSSRule('highlight', 'background-color: yellow;')"];  
  204.   
  205.       
  206.     [webView stringByEvaluatingJavaScriptFromString:varMySheet];  
  207.       
  208.     [webView stringByEvaluatingJavaScriptFromString:addCSSRule];  
  209.           
  210.     [webView stringByEvaluatingJavaScriptFromString:insertRule1];  
  211.       
  212.     [webView stringByEvaluatingJavaScriptFromString:insertRule2];  
  213.       
  214.     [webView stringByEvaluatingJavaScriptFromString:setTextSizeRule];  
  215.       
  216.     [webView stringByEvaluatingJavaScriptFromString:setHighlightColorRule];  
  217.       
  218.     if(currentSearchResult!=nil){  
  219.     //  NSLog(@"Highlighting %@", currentSearchResult.originatingQuery);  
  220.         [webView highlightAllOccurencesOfString:currentSearchResult.originatingQuery];  
  221.     }  
  222.       
  223.       
  224.     int totalWidth = [[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.scrollWidth"] intValue];  
  225.     pagesInCurrentSpineCount = (int)((float)totalWidth/webView.bounds.size.width);  
  226.       
  227.     [self gotoPageInCurrentSpine:currentPageInSpineIndex];  
  228. }  
  229.   
  230. - (void) updatePagination{  
  231.     if(epubLoaded){  
  232.         if(!paginating){  
  233.             NSLog(@"Pagination Started!");  
  234.             paginating = YES;  
  235.             totalPagesCount=0;  
  236.             [self loadSpine:currentSpineIndex atPageIndex:currentPageInSpineIndex];  
  237.             [[loadedEpub.spineArray objectAtIndex:0] setDelegate:self];  
  238.             [[loadedEpub.spineArray objectAtIndex:0] loadChapterWithWindowSize:webView.bounds fontPercentSize:currentTextSize];  
  239.             [currentPageLabel setText:@"?/?"];  
  240.         }  
  241.     }  
  242. }  

demo下载地址:http://download.csdn.net/download/donny_zhang/5647857


2017-08-11 16:09:07 qq_27873515 阅读数 8759

这些天做项目,阅读器类的,看书解析epub文件
符合基本的功能实现,翻页目录、搜索、书签、亮度、字体之类的。
项目比较大,我把demo传到git上了,下载同时,顺手给个star
然后根据自己的项目去改好了,自己撸一遍源码,别上来就问一些幼稚问题,我都累了,和你需求不一样,自己改一下,有源码,有源码,有源码,我再说一遍,有源码!!!
Epub阅读器demo链接
https://github.com/KingOfZhang/Epub
欢迎大家指正,不懂的可以加我QQ895492466,一起交流探讨
附上效果图
这里写图片描述

这里写图片描述

这里写图片描述

2019-03-01 23:22:04 survivorsfyh 阅读数 1432

因项目需求接触的 EPub 阅读器,前前后后尝试了很多库,最后找到了个相对兼容不错的展开了调试;
其中对解压缩和数据加载方面进行了改造优化,使其更加的完美;

其大概原理是首先将 epub 文件解压后得到其资源文件包,其中会包含相应的文件夹,通过 OEBPS 文件夹中的资源文件提取所需的数据并进行拼装后渲染;
其中包含了文件的解压缩和通过 touchXML 对 xml 数据的解析和写入;
对 xml 解析获取到节点内容并保存,遍历数据数组找到其中所需的节点,将其遍历节点得到所需属性的 name 和 value 作为字典对象填充至模型.

/**
 解析 OPF 文件,从 ncx 读取书籍目录

 @param opfRelativePath 文件相对路径
 @param bookInfoModel 数据填充模型
 @return 结果集
 */
+ (NSArray *)parseOPF:(NSString *)opfRelativePath bookInfoModel:(LPPBookInfoModel *)bookInfoModel {...}

具体内容还是直接通过 Demo 中的 code 表述更加直观,Demo 中也包含了一些注释看着相对较为轻松;

 

效果样式图

                                          

                                                                   

 

关于 SDK 集成


1)首先,引入'SSZipArchive',通过该解压进行对 EPub 文件的解压,获取其文件资源;
2)其次,引入'MWPhotoBrowser'库,此处需要注意因'MWPhotoBrowser'库已经将'SDWebImage'和'MBProgressHUD'两个库包含其中.若项目中已经引入上面两个库可以直接通过'MWPhotoBrowser'来代替,避免导致文件冲突的异常;
3)最后,引入'DTCoreText',将 html 字符串转化为富文本使用的工具,保证原生实现的同时起到灵活修改样式的功能,且在性能方面相比 WebView 加载方式更具优势.

platform :ios, '8.0'
target "TestEpub" do

pod 'SSZipArchive'
pod 'DTCoreText'
pod 'MWPhotoBrowser', '~> 2.1.2'

end

 

关于项目集成后配置


1)将头文件引入至 pch 文件中

#import "XDSReaderHeader.h"

pch 文件创建请见此篇文章

2)编译会抛出 arc 的文件异常,勿慌,此异常由于类文件包中的文件所引起

按照下图所示步骤,在所对应的类中添加"-fno-objc-arc"即可搞定

3)arc 异常处理完毕后再次编译程序会再次提示文件缺失的异常信息

 

工程文件层级目录中对文件进行检索"mdjyml"后将其文件删除,再次编译工程即可搞定

 

关于方法调用


配置好文件路径后调用如下方法即可

    // 张学良传     TestEpub
    NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"张学良传"withExtension:@"epub"];
    
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        XDSBookModel *bookModel = [XDSBookModel getLocalModelWithURL:fileURL];
        dispatch_async(dispatch_get_main_queue(), ^{
            XDSReadPageViewController *pageView = [[XDSReadPageViewController alloc] init];
            [[XDSReadManager sharedManager] setResourceURL:fileURL];//文件位置
            [[XDSReadManager sharedManager] setBookModel:bookModel];
            [[XDSReadManager sharedManager] setRmDelegate:pageView];
            [self presentViewController:pageView animated:YES completion:nil];
        });
    });

文件夹方式读取加载方式

    /** 配置文件路径*/
    NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@", @"xx文件名称xx"]];

    // 文件检索
    NSFileManager *fileManager = [NSFileManager defaultManager];
    if (![fileManager fileExistsAtPath:filePath]) {
        [MBProgressHUD showError:@"暂无此书" toView:controller.view];
        return;
    }

    NSURL *fileURL = [NSURL fileURLWithPath:filePath];
    // Reading book
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        XDSBookModel *bookModel = [XDSBookModel getLocalModelWithURL:fileURL];
        dispatch_async(dispatch_get_main_queue(), ^{
            XDSReadPageViewController *pageView = [[XDSReadPageViewController alloc] init];
            [[XDSReadManager sharedManager] setResourceURL:fileURL];
            [[XDSReadManager sharedManager] setBookModel:bookModel];
            [[XDSReadManager sharedManager] setRmDelegate:pageView];
            [controller presentViewController:pageView animated:YES completion:nil];
        });
    });

 

Demo 已上传至 GitHub,直接引入所需的 epub 文件(Demo 中含示例文件)后编译即可查阅效果;

https://github.com/survivorsfyh/YHEpubDemo

 

_______

以上便是此次 Epub 阅读器的小结,首次搞还望多多指教.

2019-10-27 20:08:29 scream1999 阅读数 4992

iOS上最好用的3款epub阅读器

在网络发展迅猛的当下,你是喜欢用手机看电子书还是喜欢捧一本纸质书呢?或是用专门的电子书阅读器阅读呢?

论方便来说我还是更偏向于用手机看电子书,毕竟现在大家都是出门必带手机嘛。经常接触电子书的小伙伴一定熟悉TXT 、PDF和EPUB等格式了,相对比来说在电子设备上看书epub格式还是更胜一筹。

那么我就给大家介绍3个支持苹果手机IOS系统的超好用的epub阅读器吧。

1 neat reader

这一款阅读器打开界面就会让人爱上,主页面是简约的风格,功能按钮的布局也很舒适。

它可以支持本地传书,WiFi传书,在线传书。本地传书可以自动搜索手机里储存的epub格式的文件,也可以自己从手机文件夹打开。

阅读中基本的字体间距的设置肯定是必不可少的。除了这些基本的设置,它最有特点的是支持全平台的使用,如果升级为高级版本,可以将epub格式的文件放在云空间,随意使用多个设备同步阅读。再也不用担心文件丢失了。

它不止支持ios系统,Android,mac,windows均可以使用,不用担心系统不兼容的问题。

传送门:https://www.neat-reader.cn/

在这里插入图片描述

2 ibooks

ibooks是专门为苹果系统开发的软件,可以从App Store免费下载使用,它不仅可以支持电子书的阅读,我们还可以从内置iBookstore挑选一些经典好读的电子书添加到ibooks里。

在图书整理方面,我们可以从作者,书名等方面对图书进行归纳,把书架整理的井井有条。

如果你所使用的电子设备都是苹果系统,它可以通过新的自动书签同步功能,使您的书签、备注以及当前页面以无线方式在 iPhone、iPad 和 iPod touch 之间保持同步。

阅读界面的提供白色或棕褐色页面在不同的场景使用。

传送门:https://www.apple.com/apple-books/

在这里插入图片描述

3 Adobe Digital Editions

当有些小伙伴看到adobe的时候一定是非常的熟悉,adobe公司开发的adobe Photoshop, adobe flash player等相信很多人都有接触过,这款adobe digital editions 也是很不错的一款软件。

除了可以完美支持epub格式电子书的阅读,在图书管理方面它可以提供一个清晰舒服的表格,不用对着乱七八糟的文件而发愁。不仅可以阅读epub格式,如果你有转换格式的需求,它也可以帮助你完成。

它也支持在多个平台上运行,但是好像并没有云存储的功能。

传送门:https://www.adobe.com/cn/solutions/ebook/digital-editions/download.html

在这里插入图片描述

以上是我想给大家推荐的epub阅读器,如果你也有好用的软件或者好看的电子式也可以推荐给我哦,感谢大家的阅读。

本文转自:https://www.jianshu.com/p/5af4ebaa4fd1

2019-11-10 18:34:04 scream1999 阅读数 1504

3款支持ios系统的epub阅读器推荐

在小伙伴看电子书的漫漫长路上,一定会碰到epub格式的电子书。刚接触的小伙伴可能对于这个格式比较陌生,但是这种格式相比较而言是很好用的一种格式。它对于复杂一些的排版,图表的兼容性很强,是常常阅读电子书的小伙伴首选的格式。

有非常多的阅读器可以支持epub格式,当我们使用手机来看电子书的时候难免会有阅读软件的需要,在这里我给大家推荐推荐3款可以在iOS上使用的epub阅读器。

1.neat reader

推荐理由:
1外观好看,简约小清新的风格,功能键设置合理。
2字体大小,间距都可以切换,背景颜色也随看书场景调换。
3阅读模式分为翻页阅读和滚动阅读。
4书签,笔记,高亮都可以在阅读中使用,并且可以一键跳转。
5它支持全平台的使用,高级版本具有云端储存功能,可以把电子书上传到云端,连同书签笔记等都可以同步。

官方网站:https://www.neat-reader.cn/
在这里插入图片描述
2. 亚马逊kindle阅读

推荐理由:
1具有自己的电子书店,买的电子书不仅可以在手机上阅读还可以在kindle上阅读,也可以从本地上传打开。
2在阅读时有字体的选择,屏幕亮度,背景颜色都可以自己手动调节。
3阅读模式中有横屏和竖屏模式进行阅读。
4内置中英,英中等词典,看原版书也不用担心看不懂。

官方网站:https://www.amazon.com/kindle-dbs/fd/kcp?tag=georiot-us-default-20&ascsubtag=trd-3128351844102728998-20
在这里插入图片描述
3. Anyview阅读

推荐理由:
1主打本地阅读功能,操作方式简单,功能按钮分布合理。
2可以快速解析epub格式文件,打开电子书。
3支持中英互译,选中电子书可以自由复制。
4上传电子书除了本地上传,还可以WIFI传书,支持网页同步离线阅读。
5可以从网络书城下载电子书,书城具有免费图书提供。

官方网站:http://www.anyview.net/
在这里插入图片描述

这三款便是我想为大家推荐的epub阅读器,如果大家有这方面的需要可以下载尝试。希望大家可以享受自己的阅读时光,发现自己喜欢的好书。

ios使用epub格式

阅读数 1113