図書館カタログを分析した後、ほとんどの本が同じスキームを持っていることがすぐに明らかになりました。
[著者] 。 [名前]
[技術データ]
[ #章]
[章のテキスト]
[ #章]
[章のテキスト]
まあなど。 私は他の形態に会ったが、複雑にならなかった。 [ 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 からバイナリを入手してください。