Skip to main content

Modern Python library for creating, manipulating and viewing comics in CBZ, CBR and PDF formats.

Project description

CBZ

CBZ is a Python library designed for creating, manipulating, and viewing comic book files in CBZ, CBR, and PDF formats. It offers a straightforward interface to pack comic pages into CBZ archives, extract metadata from CBZ and CBR files, and display comics using a built-in player.

Features

  • Seamless installation via pip
  • Pack images into CBZ format for comics and manga
  • Extract and manage metadata: title, series, format, and more
  • Handle comic pages with attributes like type, dimensions, and bookmarks
  • Unpack CBZ and CBR files to retrieve comic information, or extract images from PDF files
  • Built-in player for viewing CBZ, CBR, and PDF comics
  • Sequence protocol: iterate, index, and slice comic pages directly
  • Dataclass-based models with automatic XML mapping and strict type validation
  • Image support: JPEG, PNG, GIF, BMP, TIFF, WebP, JPEG XL, AVIF
  • Fully open-source! Pull requests welcome

Installation

Install CBZ from PyPI using pip:

pip install cbz

With AVIF and JPEG XL support:

pip install cbz[pillow]

Quick Start

Here's a quick example of how to create a CBZ file from a series of images:

from pathlib import Path

from cbz import ComicInfo, PageInfo, PageType, Format, YesNo, Manga, AgeRating

if __name__ == "__main__":
    paths = sorted(Path("path/to/your/images").iterdir())

    # Load each page from the images folder into a list of PageInfo objects
    pages = [
        PageInfo.load(
            path=path,
            type=(
                PageType.FRONT_COVER if i == 0
                else PageType.BACK_COVER if i == len(paths) - 1
                else PageType.STORY
            ),
        )
        for i, path in enumerate(paths)
    ]

    # Create a ComicInfo object with metadata
    comic = ComicInfo.from_pages(
        pages=pages,
        title="Your Comic Title",
        series="Your Comic Series",
        number=1,
        language_iso="en",
        format=Format.WEB_COMIC,
        black_white=YesNo.NO,
        manga=Manga.NO,
        age_rating=AgeRating.RATING_PENDING,
    )

    # Display the comic in the built-in reader
    comic.show()

    # Save directly as a CBZ file
    comic.save("your_comic.cbz")

    # Or pack to bytes for custom handling
    cbz_content = comic.pack()
    Path("your_comic.cbz").write_bytes(cbz_content)

Player

CBZ includes a command-line player for viewing comic book files in multiple formats. Simply run cbzplayer <file> to launch the player with the specified comic book file.

Supported Formats

  • CBZ (Comic Book ZIP) - Standard ZIP archives containing images and metadata
  • CBR (Comic Book RAR) - RAR archives containing images and metadata
  • PDF - Portable Document Format files with embedded images (images only, no metadata)

Usage

usage: cbzplayer [-h] <file>

CBZ/CBR/PDF comic reader

positional arguments:
<file>      Path to the CBZ, CBR or PDF comic book file.

options:
-h, --help  show this help message and exit

Examples

# View a CBZ file
cbzplayer my_comic.cbz

# View a CBR file
cbzplayer my_comic.cbr

# View a PDF file
cbzplayer my_comic.pdf

Keyboard Shortcuts

Shortcut Action
Left / Right arrows Navigate pages
+ / - Zoom in / out
Ctrl+Q Quit
Mouse wheel Vertical scroll
Shift+Mouse wheel Horizontal scroll
Ctrl+Mouse wheel Zoom

Requirements for CBR Support

CBR file support requires:

  • The rarfile Python package (automatically installed with CBZ)
  • An external RAR extraction tool such as:
    • unrar (recommended) - Available in most package managers
    • rar - Commercial RAR archiver
    • 7zip - Free alternative with RAR support

For installation instructions and compatibility details, see the rarfile documentation.

Detailed Usage

Creating a ComicInfo Object

The ComicInfo class represents a comic book with metadata and pages. It supports initialization from a list of PageInfo objects:

from cbz import ComicInfo, PageInfo, PageType, Format, YesNo, Manga, AgeRating

pages = [
    PageInfo.load(path="page1.jpg", type=PageType.FRONT_COVER),
    PageInfo.load(path="page2.jpg", type=PageType.STORY),
    PageInfo.load(path="page3.jpg", type=PageType.BACK_COVER),
]

comic = ComicInfo.from_pages(
    pages=pages,
    title="My Comic",
    series="Comic Series",
    number=1,
    language_iso="en",
    format=Format.WEB_COMIC,
    black_white=YesNo.NO,
    manga=Manga.NO,
    age_rating=AgeRating.RATING_PENDING,
)

You can also create pages directly from bytes or base64-encoded data:

page = PageInfo.loads(data=image_bytes, name="page.jpg", type=PageType.STORY)

Sequence Protocol

ComicInfo implements the full sequence protocol, so you can interact with pages directly:

len(comic)  # Number of pages
comic[0]  # First page
comic[-1]  # Last page
comic[1:3]  # Slice of pages
for page in comic:  # Iteration
    print(page.image_width, page.image_height)
page in comic  # Containment check

Extracting Metadata

Retrieve comic information as a dictionary using get_info():

info = comic.get_info()
print(info)

Packing and Saving

Pack the comic into CBZ format as bytes:

cbz_content = comic.pack()

Or save directly to disk (more memory-efficient for large archives):

comic.save("output.cbz")

Loading from Different Formats

Load a comic from an existing CBZ file (with metadata):

comic = ComicInfo.from_cbz("your_comic.cbz")

Load a comic from an existing CBR file (with metadata):

comic = ComicInfo.from_cbr("your_comic.cbr")

Load a comic from a PDF file (images only, no metadata):

comic = ComicInfo.from_pdf("your_comic.pdf")

Notes:

  • CBR support requires an external RAR extraction tool. For detailed compatibility information and advanced configuration, see the rarfile documentation.
  • PDF files only provide image content; comic metadata (title, series, etc.) is not available from PDF files.

Page Properties

Each PageInfo object exposes the following properties, automatically extracted from the image content:

page = comic[0]

page.content  # bytes - raw image data
page.image_width  # int - width in pixels
page.image_height  # int - height in pixels
page.image_size  # int - file size in bytes
page.suffix  # str - file extension (.jpg, .png, etc.)
page.name  # str - original file name
page.type  # PageType - page type (FrontCover, Story, etc.)
page.bookmark  # str - bookmark / chapter name
page.double  # bool - double page spread

Metadata Fields

All ComicInfo.xml v2.1 metadata fields are supported as dataclass attributes:

Attribute Type Default Description
title str "" Issue title
series str "" Series name
number Optional[int] None Issue number
count Optional[int] None Total number of issues
volume Optional[int] None Volume number
year Optional[int] None Publication year
month Optional[int] None Publication month
day Optional[int] None Publication day
writer str "" Writer(s), comma-separated
penciller str "" Pencil artist(s)
inker str "" Inker(s)
colorist str "" Colorist(s)
letterer str "" Letterer(s)
cover_artist str "" Cover artist(s)
editor str "" Editor(s)
translator str "" Translator(s)
publisher str "" Publisher
imprint str "" Publisher imprint
genre str "" Genre(s), comma-separated
tags str "" Tags, comma-separated
web str "" Web URL
language_iso LanguageISO "" ISO language code (e.g., "en", "fr")
format Format UNKNOWN Publication format
black_white YesNo UNKNOWN Black and white
manga Manga UNKNOWN Manga / reading direction
age_rating AgeRating UNKNOWN Content age rating
community_rating Optional[Rating] None Community rating (0.0-5.0)
summary str "" Synopsis / description
characters str "" Character names, comma-separated
teams str "" Team names, comma-separated
locations str "" Locations, comma-separated
story_arc str "" Story arc name
story_arc_number Optional[int] None Position in story arc
main_character_or_team str "" Primary character or team
scan_information str "" Scan / digitization notes
ean str "" EAN / ISBN
book_price str "" Cover price

Enumerations

from cbz import PageType, Format, YesNo, Manga, AgeRating

# Page types
PageType.FRONT_COVER  # Front cover
PageType.STORY  # Story page (default)
PageType.BACK_COVER  # Back cover
PageType.INNER_COVER  # Inner cover / dust jacket
PageType.ADVERTISEMENT  # Advertisement
PageType.EDITORIAL  # Editorial / credits
PageType.LETTERS  # Letters page
PageType.PREVIEW  # Preview of upcoming issues
PageType.ROUNDUP  # Recap / summary
PageType.OTHER  # Other
PageType.DELETED  # Marked for deletion

# Publication formats
Format.SERIES  # Regular series
Format.GRAPHIC_NOVEL  # Graphic novel
Format.WEB_COMIC  # Webcomic
Format.ONE_SHOT  # One-shot
Format.TRADE_PAPERBACK  # Trade paperback
Format.ANNUAL  # Annual
Format.ANTHOLOGY  # Anthology
Format.LIMITED_SERIES  # Limited series
Format.MAGAZINE  # Magazine
# ... and more

# Reading direction
Manga.UNKNOWN  # Not specified
Manga.NO  # Western (left to right)
Manga.YES  # Manga
Manga.YES_AND_RIGHT_TO_LEFT  # Manga (right to left)

# Age ratings
AgeRating.UNKNOWN  # Not rated
AgeRating.EVERYONE  # All ages
AgeRating.TEEN  # Teens
AgeRating.MATURE_17_PLUS  # Mature 17+
AgeRating.RATING_PENDING  # Rating pending
# ... and more

Error Handling

The library provides a hierarchy of specific exceptions:

from cbz import CBZError, InvalidImageError, EmptyArchiveError, InvalidMetadataError

try:
    comic = ComicInfo.from_cbz("corrupted.cbz")
except InvalidMetadataError:
    print("ComicInfo.xml is invalid or corrupted")
except EmptyArchiveError:
    print("No valid images found in the archive")
except InvalidImageError:
    print("An image in the archive could not be read")
except CBZError:
    print("General CBZ error")

Format Specification

A complete RFC specification of the CBZ format is available in docs/RFC-CBZ.md.

The ComicInfo.xml XSD schemas (v1.0, v2.0, v2.1) are in docs/schema/.

Changelog

See CHANGELOG.md for the full version history, including migration notes for v4.0.

Contributors

hyugogirubato piskunqa OleskiiPyskun tssujt gokender domenicoblanco RivMt flolep2607 chase-roohms

Licensing

This software is licensed under the terms of MIT License. You can find a copy of the license in the LICENSE file in the root folder.

Third-Party Licenses

This project uses the following third-party libraries:


© hyugogirubato

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cbz-4.0.0.tar.gz (70.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

cbz-4.0.0-py3-none-any.whl (69.9 kB view details)

Uploaded Python 3

File details

Details for the file cbz-4.0.0.tar.gz.

File metadata

  • Download URL: cbz-4.0.0.tar.gz
  • Upload date:
  • Size: 70.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.3.3 CPython/3.14.0 Windows/11

File hashes

Hashes for cbz-4.0.0.tar.gz
Algorithm Hash digest
SHA256 b989f852c5b37724ce9f691ef8d2fb1343aef681c2b8667d74eee2316d3345ed
MD5 153b014d302f6917a3149a21a743c22a
BLAKE2b-256 ed72189a48516a87da284cfad9e4d3e5abd402e71bf432bef7edf068c31985cb

See more details on using hashes here.

File details

Details for the file cbz-4.0.0-py3-none-any.whl.

File metadata

  • Download URL: cbz-4.0.0-py3-none-any.whl
  • Upload date:
  • Size: 69.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.3.3 CPython/3.14.0 Windows/11

File hashes

Hashes for cbz-4.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 461a4ef6a7ee447408931424de588a996d3ef8961fa772183568a38f0ab2f7ff
MD5 7e290e14e4d120ac3ce2c2b736a04e06
BLAKE2b-256 b08f2700b8f006d8cceee7e8e180803ed95b8e78ef50516ade2ec3a5a7fda134

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page