iT邦幫忙

2021 iThome 鐵人賽

DAY 15
0
Mobile Development

如何開發適合電子書閱讀器使用的瀏覽器 Android APP系列 第 15

電子書閱讀器上的瀏覽器 [Day15] 網頁匯出成 epub 檔案 (I)

  • 分享至 

  • xImage
  •  

為電子書閱讀器而開發的瀏覽器 APP,在繞了一大圈之後,終於又繞回了電子書本身。原本的實作就已經可以將網頁輸出成 pdf 檔案。不過,如果希望產生的檔案可以更有彈性地調整字型大小,或是在不同的設備上閱讀,轉成 epub 格式會是更好的選擇。但目前市面上的行動瀏覽器都沒有這樣子的設計,頂多提供輸出成 pdf,或 mhtml 等格式。

引入函式庫

為了在 browser 中加入這功能,當務之急是先找到一個可以在 Android 設備上新增、開啟和編輯 epub 的函式庫。找來找去,似乎選擇也不多,只有 Epublib 是個比較完整的方案。

https://github.com/psiegman/epublib

Epublib 是個純 Java 的函式庫,不過也支援在 Android 系統中使用。雖然它已經很久沒有什麼更新了,但看起來功能應該還算符合我的需求。它並沒有把它的函式庫放在常用的 public repository 中;文件中是建議直接下載 jar 檔案,塞在 Android app 中。不過這和發布到 F-Droid 的規則有抵觸,所以我去 mavenCentral 找到了其他人幫忙上傳的版本。比最新版差了些 commit,但並不影響我需要的功能。

https://search.maven.org/artifact/com.positiondev.epublib/epublib-core

實作

目前我在實作上,會先跳出系統的 document picker ,讓使用者建立一個新檔名,或是選擇一個已經存在的 epub 檔案,再把目前網頁的 innerHtml 內容取出,利用 Epublib 注入到 epub 檔案中,當成一個新的章節。

https://ithelp.ithome.com.tw/upload/images/20210913/20140260n12VJb6PJl.png

677 行的 getRawHtml() 利用注入 javasript 取得 raw html。拿到手的 raw html 還不行直接拿來用,因為它裡頭有些字元已經被轉換過了,需要加入

implementation 'org.apache.commons:commons-text:1.7'

https://ithelp.ithome.com.tw/upload/images/20210913/20140260AjcoVrfx8C.png

然後呼叫 StringEscapeUtils.unscapeJava() ,還原成可用的字串。

電子書名及章節名稱

getBookName()getChapterName() 都會跳出 AlertDialog 讓使用者輸入字串。因為不想再用 callback 的方式,所以把它們都包成 suspendCoroutine,讓程式好讀一點。

getChapterName() 為例,在代入恰當的參數到 TextInputDialog 後,就可以得到想要的章節名稱。

https://ithelp.ithome.com.tw/upload/images/20210913/20140260M3ki9U7Esb.png

TextInputDialog 只是很單純地實作了 show(),在使用者有任何互動後,把字串傳出。

https://ithelp.ithome.com.tw/upload/images/20210913/20140260tsSOmPNzaC.png

待改進的地方

目前只能把純文字的資料存進 epub 檔案裡。在下一回會介紹如何把網頁中的圖片也存到 epub 檔案中,讓產生的 epub 更有價值。

參考原始碼連結

v8.6.0 https://github.com/plateaukao/browser/releases/tag/v8.6.0


上一篇
電子書閱讀器上的瀏覽器 [Day14] 中文直排閱讀模式
下一篇
電子書閱讀器上的瀏覽器 [Day16] 網頁匯出成 epub 檔案 (II)
系列文
如何開發適合電子書閱讀器使用的瀏覽器 Android APP30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言