2013-09-23 1 views
12

전자 책 (epub 형식)을 읽는 Android 애플리케이션을 개발하고 있습니다. 현재는 매우 훌륭한 epub 리더 인 Paul Siegeman의 epublib 라이브러리를 사용하고 있습니다. 하지만 몇 가지 제한 사항이 있습니다. 예를 들어 필요로하는 것이 있습니다. 실제 책을 읽는 것처럼 가로로 페이지를 이동할 수 없으므로 독자적으로 구현해야하지만 막혀 있습니다. 내가 유일한 스크롤 가능성을 알고 당신은 내가 지금까지 웹뷰에서 전자 책을 표시 볼 그래서화면 크기에 따라 Epub HTML을 페이지로 분할하는 방법

private void openEpub(String bookFilename){ 

    WebView webView = (WebView) findViewById(R.id.webView); 

    nl.siegmann.epublib.domain.Book book=null; 
    try { 
     book = (new EpubReader()).readEpub(new FileInputStream(Environment.getExternalStorageDirectory().getPath() + "/" + bookFilename)); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    String baseUrl = Environment.getExternalStorageDirectory().getPath() + "/"; 
    String data=null; 
    try { 
     data = new String(book.getContents().get(1).getData()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    webView.loadDataWithBaseURL(baseUrl, data, "text/html", "UTF-8", null); 

} 

:

실제로 EPUB를 읽고 다음 웹보기 안에 넣는다 방법은 다음이다 webview는 위/아래입니다.

getData()가 반환하는 웹 문자열과 페이지로의 webview로드를 나누고 viewpager와 함께 하나씩 표시하는 방법을 생각했지만 화면 크기에 따라 html을 올바르게 분할하는 방법은 무엇입니까?

이 생각으로 나는 올바른 방향에 있다고 생각합니까? epub을 왼쪽에서 오른쪽/오른쪽에서 왼쪽 (페이지 매김)이나 다른 "무료 또는 저렴한"라이브러리로 표시하는 다른 솔루션은 그렇게 할 수 있습니까? (PageTurner를 시도했는데, 정말 좋았지 만 상업용 버전은 나에게 너무 비싸다)

답변

2

다음은 github이다.

FbReader는 epub 및 pdf reader를위한 훌륭한 라이브러리를 제공합니다.

또는 당신은 웹보기를 확장하여 자신의 사용자 정의 웹보기를 할 수 있습니다 ....이보십시오. 여기서 WebView에서 원하는 모든 기능을 배치하고 수정할 수 있습니다.

제 동료가이 FbReader를 사용하여 독자를 만들었으며 정말 멋졌습니다.

+0

에 URL을로드합니다. 이제 저는 무료는 아니지만 단지 놀라운 응용 프로그램 인 Page Turner Reader를 사용하고 있습니다. –

1

안녕하세요, 저는 이것이 당신을 도울 것이라고 생각합니다. Nacho L의 답변이 나를 위해 일했습니다. 여기 HTML book-like pagination?

+0

나는 독자를 사기로 결정한 솔루션을 찾지 않고 결국 Jatin을 위해 아래에서 말했듯이 atihska를 고맙게 생각합니다. 이제는 독자를 사기로 결정했습니다. 이제는 자유가 아닌 Page Turner 리더를 사용하고 있지만 놀라운 앱입니다. –

+0

@Atishka, 귀하의 충고를 테스트 한 결과 작동합니다. 나는 js가 좋지 않으므로 클릭하거나 스크롤하여 페이지를 변경하는 방법을 알려줄 수 있습니까? 힌트를 주시면 감사하겠습니다. –

8

나는이 같은 안드로이드의 페이지 매김 영향을했던 ..

->를 사용자 정의 웹보기 클래스를 만들 수 있습니다.
-> 클라이언트보다 아래에 설정하고 URL을로드하면 페이지 수가 증가하는 가로 스크롤이 발생합니다.
-> webview 기본 스크롤을 잠급니다.
-> webview의 스크롤을 움직이는 대신 매끄러운 페이지 매김 효과를 얻으려면 전체 웹보기를 움직여 한 페이지에 하나의 webview가있게하십시오.
-> 이전 및 다음 페이지를 버퍼링하기 위해 자신의 viewflippers를 사용하십시오.


나는 이러한 모든 구현을 완료했으며 조직을위한 제품을 만들었습니다. 제 생각에 가장 좋은 솔루션으로 접근하는 방법에 대한 아이디어를 공유하고 있습니다. 제 3의 패리티를 사용하고 그 sdk의 제한 때문에 중간에 집착하는 대신 모든 일을 자신의 것으로 만드십시오.

private class MyWebClient extends WebViewClient 
    { 
     @Override 
     public void onPageStarted(WebView view, String url, Bitmap favicon) { 

      super.onPageStarted(view, url, favicon); 
     } 
     @Override 
     public void onPageFinished(WebView view, String url) 
     { 
      super.onPageFinished(view, url); 

      final MyWebView myWebView = (MyWebView) view; 


       String varMySheet = "var mySheet = document.styleSheets[0];"; 

       String addCSSRule = "function addCSSRule(selector, newRule) {" 
         + "ruleIndex = mySheet.cssRules.length;" 
         + "mySheet.insertRule(selector + '{' + newRule + ';}', ruleIndex);" 

         + "}"; 

       String insertRule1 = "addCSSRule('html', 'padding: 0px; height: " 
         + (myWebView.getMeasuredHeight()/getContext().getResources().getDisplayMetrics().density) 
         + "px; -webkit-column-gap: 0px; -webkit-column-width: " 
         + myWebView.getMeasuredWidth() + "px;')"; 



       myWebView.loadUrl("javascript:" + varMySheet); 
       myWebView.loadUrl("javascript:" + addCSSRule); 
       myWebView.loadUrl("javascript:" + insertRule1); 




     } 
    } 

    private class MyWebChromeClient extends WebChromeClient 
    { 
     @Override 
     public void onProgressChanged(WebView view, int newProgress) 
     { 
      super.onProgressChanged(view, newProgress); 

      if(newProgress == 100) 
      { 
       postDelayed(new Runnable() 
       { 
        @Override 
        public void run() 
        { 
         calculateNoOfPages(); 
        }  

       },200); 
      } 
     } 
    } 
private void calculateNoOfPages() 
    { 
     if(GlobalSettings.EPUB_LAYOUT_TYPE == GlobalConstants.FIXED) 
     { 

     } 
     else 
     { 
      if(getMeasuredWidth() != 0) 
      { 
       int newPageCount = computeHorizontalScrollRange()/getMeasuredWidth(); 
       getData().getChapterVO().setPageCount(newPageCount); 

      } 
     } 
    } 
@Override 
    public int computeHorizontalScrollRange() { 
     // TODO Auto-generated method stub 
     return super.computeHorizontalScrollRange(); 
    } 

한 당신은 마지막으로하고 나는 독자를 구입하기로 결정하는 중요한 프로젝트로 내 문제에 대한 해결책을 찾지 못하는 한 후, 대단히 Jatin 감사

+0

형제 최후 통첩 ... 나는 정말로 일주일 동안 해결책을 찾고있었습니다. 최후 통첩 형제 님, 저를 위해서 정말로 문제가 해결되었습니다. 내가 100을 줄 수 있으면 좋겠어. 해결책을 찾는 사람이라면 위의 사람은 완벽하게 작동합니다. addCSS 규칙을 약간 변경해야 할 수도 있지만 솔루션은 확실히 작동합니다. 고마워요 형제 –

+1

의견 감사합니다 arunavh !! 당신은 더 이상의 도움을 환영합니다 r : –

+0

대단히 고맙습니다. Uday, 제가 할 수있는대로 시도해 보겠습니다.하지만 당신의 솔루션은 구현하기 쉽습니다. (내가 사무실에있을 때 나는 그것을 빨리 읽었습니다.) –