Javaを使用してライブラリlib.ruをepub形式に変換する

すべての良い一日。 最近、Kobo Touchという電子リーダーを入手しました。書籍の入手先についての質問がありました。 悪名高いフリバスタは確かに良いことであり、私はそこから多くの本を取りますが、それでもlib.ruに惹かれました。 コプロコードの嫌いな人はそれについて考えるべきです。 このテキストを読むために。 コードは本当に信じられないほど残酷です。



図書館カタログを分析した後、ほとんどの本が同じスキームを持っていることがすぐに明らかになりました。

[著者][名前]

[技術データ]

[ #章]

[章のテキスト]

[ #章]

[章のテキスト]

まあなど。 私は他の形態に会ったが、複雑にならなかった。 [ Author ] [ Title ][ #Chapter ]は特定のタグの間にあることに注意してください-""と ""(これらは異なる文字、Ascii形式です)。



残っているのは、ページの単純なパーサーを書くことだけです。 Javaを使用しました。 そもそも、データを読み取るエンコーディングについて質問がありました。私の観察によると、各ページのエンコーディングは異なるためです。 これを行うには、サードパーティのライブラリjuniversalchardetに頼ったので、エンコードを認識して文字列に書き込みます。

URLConnection con = url.openConnection(); con.connect(); InputStream urlfs; urlfs = con.getInputStream(); byte[] buf = new byte[4096]; UniversalDetector detector = new UniversalDetector(null); int nread; while ((nread = urlfs.read(buf)) > 0 && !detector.isDone()) { detector.handleData(buf, 0, nread); } detector.dataEnd(); String encoding = detector.getDetectedCharset(); detector.reset();
      
      





次に、BufferedReaderを使用してページを読み取ります。

  BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), encoding)); String str; while ((str = in.readLine()) != null) { string = string + str; } in.close();
      
      





便利な解析のために、記号をに変更し、ファイルの最後に新しい記号を追加します。

  string = string.replace(" ", " "); /* .     ,       . */ string = string + " ";
      
      





最後に、本に含まれる章の合計数はまだわかりません(既に述べたように、章はタグとタグの間にあります)。 私も自分で追加したので、1つの章を取り上げます。

  int count = 0; for (char c : string.toCharArray()) if (c == ' ') count++; loop = (count-1);
      
      





ケースは終わりに近づいています。 すべてのコンテンツを章、説明、タイトルのある著者に分割することは残っています。

  /*       ". ".  . */ String[] authorandtitle = parsedstring[2].split("\\."); AUTHOR = authorandtitle[0]; TITLE = authorandtitle[1]; /*   , .     .    . ,  */ for(int i = 4; i <= loop; i++){ if((i % 2) ==0 ){ CHAPTER[i] = parsedstring[i]; HEADER[i] = parsedstring[i]; }else{ PARAG[i] = parsedstring[i]; } }
      
      





もちろん、常連でこれをすべて引き出すことは可能でしたが、彼が最初に思いついたものは書かれていました。

これで、ドキュメントを作成するための名前がす​​べて揃いEPUBGenライブラリを使用して最終的なドキュメントを作成しました。 幸いなことに、これらの例は非常に有益であり、数分で完了しました。 まず、ドキュメントを作成し、メタデータを入力します。

  Publication epub = new Publication(); epub.addDCMetadata("title", TITLE); epub.addDCMetadata("creator", AUTHOR); epub.addDCMetadata("language", "ru-RU");
      
      





次に、OPS / imagesディレクトリに画像を保存し、cover.xhtmlドキュメントにリンクを作成する必要があります

  DataSource dataSource = new FileDataSource(new File(cover)); BitmapImageResource imageResource = epub.createBitmapImageResource( "OPS/images/cover.jpg", "image/jpeg", dataSource); DataSource coverdata = new StringDataSource("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<title>Cover</title>\n<style type=\"text/css\"> img { max-width: 100%; } </style>\n</head>\n<body>\n<div id=\"cover-image\">\n<img src=\"images/cover.jpg\" alt=\"Title\"/>\n</div>\n</body>\n</html>"); Resource coverres = epub.createResource("OPS/cover.xhtml", "xhtml", coverdata); epub.addToSpine(coverres);
      
      





最後のアクションは、コンテンツのテーブルを追加した後、コンテンツ自体を再帰的に追加することです。

 NCXResource toc = epub.getTOC(); TOCEntry rootTOCEntry = toc.getRootTOCEntry(); for(int i = 4; i <= loop; i++){ if((i % 2) ==0 ){ /*  .*/ OPSResource main = epub.createOPSResource("OPS/"+i+".html"); epub.addToSpine(main); /*   . */ mainDoc = main.getDocument(); /*     .*/ TOCEntry mainTOCEntry = toc.createTOCEntry(CHAPTER[i], mainDoc .getRootXRef()); rootTOCEntry.add(mainTOCEntry); body = mainDoc.getBody(); /*  . */ Element h1 = mainDoc.createElement("h1"); h1.add(HEADER[i]); body.add(h1); }else{ /*   . */ Element paragraph = mainDoc.createElement("p"); paragraph.add(PARAG[i]); body.add(paragraph); } }
      
      





    OCFContainerWriter writer = new OCFContainerWriter( new FileOutputStream(output)); epub.serialize(writer);
      
      





最終結果は次のようになりました。



Swingのインターフェースですが、安くて陽気です。

ライブラリ全体を理解するのにあまり努力しなかったため、このような古いモデル(単純なテキストモデル)の書籍でのみ機能します。

このような大量のたわごとコードを読んだ後も死ななかった人は、ここ から bitbucket からバイナリ入手してください。



All Articles