C#でePubリーダーを作ってみた

気になっているので作りたい。C#で作ろうと思いとりあえずVisualC#をきどうしてみました。
でもってePubのファイル形式をみていくとzip圧縮されているxhtmlの塊なんですね。拡張子をzipに変更して解凍したら中身を見ることができました。
次からは、実際中に書かれている内容を読み取って表示する部分を作っていきたいと思います。
ちなみに要件仕様
これだと思えるePubリーダーが無い。
✅表紙で一覧表示可能
✅横フリックでサクサクページ移動
✅画像データも大画面表示でサクサク
✅SD内データも読める
✅OneDriveの栞データをWindows、Android共有
✅縦書きもしっかり表示
こんな機能があるリーダー作ろう。まずは、Windows。次にAndroid。— kataen (@kataencom) April 7, 2019
C#でXMLを読み込む
[blogcard url=”https://www.sejuku.net/blog/86867#LINQxml”]
これを参考にLINQというものを使えば簡単に読み込めるらしい。
ちょっとソースをいじってみたけれども、エラーを吐いて予想以上に何もできなかったorz
#CでXMLを読み込む #2
https://kataen.com/mainichi_20190409
ここでできなかったXMLの読み込みですが、原因がわかりました。
XMLのタグにネームスペースが設定されており、読み込みにヒットしませんでした。
もともとは↓を参考にしており…
[blogcard url=”https://csharp.keicode.com/topics/xml-selectnodes.php”]
ネームスペースの件を踏まえて↓を参考に…
[blogcard url=”https://csharp.keicode.com/topics/xml-selectnodes-namespace.php”]
他にもいろいろなパターンを見て習得していきたい所存です。
XML読み込み方法
XMLの読み込みまではできるようになりました。名前空間でつまずいておりました。
XElement xml = XElement.Load(@"D:\epubtest\doro\OEBPS\content.opf"); XNamespace nspace = xml.Name.Namespace; XElement table = xml.Element(nspace + "manifest"); var rows = table.Elements(nspace + "item"); foreach (XElement row in rows) { var e1 = row.Attribute("id").Value; var e2 = row.Attribute("href").Value; webb.Navigate("d:/epubtest/doro/oebps/"+e2); }
これで一応、WebBrowserのコントロールに表示できるようになりました。ePubの中身は決め打ち仕様のため、網羅性は不明です。
表示例
ePubを表示してみた結果がこんな感じ。ナチュラルにそのまま表示してしまっているだけなのではみ出ております。
見開き対応?
見開きにするときはWebBrowserを横に2個並べて、対になるページを表示させればOK?でも、文章のみのサイズ指定でレイアウトが自由になるやつはどうやって対応する?ロジック組む?
サイズ修正、リフロー対応等
画像のサイズが現状ザルなので、見やすく修正をしたいのですがこのあたりは追加CSSやjavascriptで対応していったほうがいいのかな?WebBrowserにePub読み込ませて、追加で専用CSSを実行時に書き込むイメージですかね~
WebBrowserコントロールに翻弄される
WebBrowserにePubのXHTMLを表示するところまではできたのですが、画像が大きすぎるのでスタイルシートで縮小しようとしたら問題が発生。
なんか、更新されない現象。
Refresh()しても更新されない。
なんなら、元ファイル消しても表示され続ける。
キャッシュされてる?
そもそもIEベースだし、キャッシュされるしでC#でWebBrowserコントロールを使うのはあまり得策ではないのか?
C#でePubリーダー作成、CefSharpに切り替える
やはりLoadで弾かれてうまくいかず。
バージョンとか関係あるの?
CefSharpのLoadが動きました
先週末からePubリーダーをC#で作ろうとしていて、ブラウザコントロールをCefSharpに変えたもののURLが変えられなくて、壁にぶち当たって数日を費やしてしまいました。
このほど、やっとうごきました!
[blogcard url=”https://ourcodeworld.com/articles/read/173/how-to-use-cefsharp-chromium-embedded-framework-csharp-in-a-winforms-application”]
[blogcard url=”https://qiita.com/yaju/items/6fc1b72e60dbcc031669″]
これを参考にしたわけですが、結果的にはすぐにLoadを実行していたのが主因でした。
上記のQiitaに従って、メニューボタンにロード命令をつけたらちゃんとLoadすることができました。
こんな感じのサンプルを作りました。
namespace ePubb { public partial class Form1 : Form { private ChromiumWebBrowser chromeBrowser; public Form1() { InitializeComponent(); InitializeChromium(); } private void Form1_Load(object sender, EventArgs e) { } public void InitializeChromium() { CefSettings settings = new CefSettings(); // Initialize cef with the provided settings Cef.Initialize(settings); //System.Threading.Thread.Sleep(10000); // Create a browser component chromeBrowser = new ChromiumWebBrowser("http://ourcodeworld.com"); // Add it to the form and fill it to the form window. this.Controls.Add(chromeBrowser); chromeBrowser.Dock = DockStyle.Fill; } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { Cef.Shutdown(); } private void Open_ToolStripMenuItem_Click(object sender, EventArgs e) { chromeBrowser.Load("https://yahoo.co.jp"); } } }
表示できたので、ePubリーダー作成は一旦ストップしようかと思います。
ディスカッション
コメント一覧
まだ、コメントがありません