Simple EPUB builder library, works in modern browsers.
- 📚 Create EPUB books programmatically in browsers
- 🔧 Simple and intuitive API
- 🏷️ Full TypeScript support with type definitions
- 🌐 Internationalization support (21+ languages)
- 📱 Modern ES modules and UMD builds
- 🖼️ Image and cover support
- 📝 HTML content with EJS templating
npm install --save jepub
You can also use it via a CDN:
<!-- UMD build -->
<script src="https://unpkg.com/jepub/dist/jepub.js"></script>
or:
<!-- UMD build -->
<script src="https://cdn.jsdelivr.net/npm/jepub/dist/jepub.js"></script>
For ES modules:
<!-- ES module build -->
<script type="module">
import jEpub from 'https://unpkg.com/jepub/dist/jepub.es.js';
</script>
jEpub requires JSZip and EJS as external dependencies.
Make sure these libraries are loaded before jEpub:
<!-- Required dependencies -->
<script src="https://unpkg.com/jszip/dist/jszip.min.js"></script>
<script src="https://unpkg.com/ejs/ejs.min.js"></script>
<!-- jEpub library -->
<script src="https://unpkg.com/jepub/dist/jepub.js"></script>
<script>
const jepub = new jEpub();
// jepub.init({
// do something
</script>
You need to install dependencies separately:
npm install jepub jszip ejs
import jEpub from 'jepub';
// Dependencies will be resolved by your bundler
const jepub = new jEpub();
// jepub.init({
// do something
jEpub includes full TypeScript type definitions. No additional @types
packages
needed!
import jEpub, { jEpubInitDetails, jEpubGenerateType } from 'jepub';
const details: jEpubInitDetails = {
i18n: 'en',
title: 'My Book',
author: 'Author Name',
publisher: 'Publisher',
description: '<b>Book</b> description',
tags: ['epub', 'typescript'],
};
const jepub = new jEpub();
jepub.init(details);
// Type-safe generate method
const epub: Promise<Blob> = jepub.generate('blob');
const jepub = new jEpub();
Initialize the EPUB with book details or existing JSZip instance.
interface jEpubInitDetails {
i18n?: string; // Language code (e.g., 'en', 'fr', 'de', 'ja', 'ar' - supports 21+ languages)
title?: string; // Book title
author?: string; // Book author
publisher?: string; // Book publisher
description?: string; // Book description (supports HTML)
tags?: string[]; // Book tags/categories
}
jepub.init({
i18n: 'en',
title: 'Book title',
author: 'Book author',
publisher: 'Book publisher',
description: '<b>Book</b> description',
tags: ['epub', 'tag'],
});
Set custom publication date.
jepub.date(new Date());
Set custom UUID for the book.
jepub.uuid('unique-book-id');
Add cover image to the book.
// From file input
const fileInput = document.querySelector(
'input[type="file"]'
) as HTMLInputElement;
const file = fileInput.files?.[0];
if (file) {
jepub.cover(file);
}
// From fetch
const response = await fetch('cover.jpg');
const arrayBuffer = await response.arrayBuffer();
jepub.cover(arrayBuffer);
Add an image to the book.
const response = await fetch('image.jpg');
const arrayBuffer = await response.arrayBuffer();
jepub.image(arrayBuffer, 'myImage');
Use in content: <%= image['myImage'] %>
Add notes page to the book.
jepub.notes('<p>These are my notes...</p>');
Add a page/chapter to the book.
// HTML content
jepub.add('Chapter 1', '<p>Content...</p>');
// With images
jepub.add('Chapter 2', '<p>Image: <%= image["myImage"] %></p>');
// Array of strings
jepub.add('Chapter 3', ['Line 1', 'Line 2', 'Line 3']);
// With deep level
jepub.add('Chapter 3.1', '<p>Content...</p>', 1);
generate(type?: jEpubGenerateType, onUpdate?: jEpubUpdateCallback): Promise<Blob | ArrayBuffer | Uint8Array | Buffer>
Generate the EPUB file.
type jEpubGenerateType = 'blob' | 'arraybuffer' | 'uint8array' | 'nodebuffer';
// Generate as Blob (default)
const epub: Blob = await jepub.generate();
// Generate as ArrayBuffer
const buffer: ArrayBuffer = await jepub.generate('arraybuffer');
// With progress callback
const epub = await jepub.generate('blob', (metadata) => {
console.log(`Progress: ${metadata.percent}% - ${metadata.currentFile}`);
});
Convert HTML to plain text.
const text = jEpub.html2text('<b>Bold</b> text', false);
// Returns: "Bold text"
ISC. Copyright 2018 lelinhtinh