Home 修复 EPUB 漫画的乱序图片
Post
Cancel

修复 EPUB 漫画的乱序图片

漫画平台提供的 EPUB 格式文件,由于部分内容维护者操作的不严谨,很多漫画的图片文件名是乱序的。例如:第 1 页的图片起名为 008.jpg,第 2 页的图片起名为 003.jpg…,等等。如果用 EPUB 阅读器观看,不会感受到次序的问题。但若用漫画阅读器观看(为了获得满屏显示的最佳阅读体验),页面将会是乱序的。本文将会分析这个问题的原因,并探讨如何去解决。

两类阅读器加载内容的区别

为了方便理解问题,解压一个乱序 EPUB 文件,可以观察到部分的目录结构是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
.
├── html
│   ├── 1.html
│   ├── 2.html
│   ├── 3.html
│   ├── ...
|
├── image
│   ├── vol-003890.jpg
│   ├── vol-017993.jpg
│   ├── vol-028358.jpg
│   ├── ...
│
...

打开第 1 页的文件 1.html,内容是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>第1页</title>
  <link rel="stylesheet" type="text/css" href="../css/style.css" />
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
  <div class="fs">
    <div>
      <img src="../image/vol-491489.jpg" alt="Comic Book Images" class="singlePage" />
    </div>
  </div>
</body>
</html>

在第 11 行的 <img> 定义了该页应该读取图片地址 ../image/vol-491489.jpg

EPUB 阅读器之所以能够获得正常的阅读顺序,是因为它是根据 HTML 文件来确定每页的图片,所以图片名乱序也不会影响 EPUB 阅读器。而漫画阅读器则是从文件夹 image 里按照图片命名排序来加载内容的,乱序之源就在于此。

修复思路

观察完 HTML 文件内容,不难找到解决的思路:根据每个 HTML 文件的次序来确定每个 JPG 文件的命名。例如:

  1. html/1.html 指向的图片 image/vol-491489.jpg,重命名为 image/1.jpg
  2. 修改 html/1.html<img>src 属性,即: <img src="../image/1.jpg" ... />

实施细节

使用 Calibre 可以编辑 EPUB 文件里面的内容,实现上述思路。

下列截图是 macOS 平台的 Calibre,版本号 5.34.0。不同平台或版本号的界面可能会有差异。

  1. Calibre 打开 EPUB,点击 Edit book 打开 Edit Book 界面。

  2. File browser > Text > 选中 {num}.html 文件(注意保留封面页 cover.jpg.html)> 右键导出到桌面:

    edit-text

    接着删除选中的 Text 内容:

    del-text

  3. 滚动 File browser,对 Images 部分完成类似上一步的操作:导出除封面之外的图片到桌面,然后删除。
  4. 第 2、3 步导出的内容将会被存放在 htmlimage 文件夹里。现实情况中,一集漫画的页数在 190 页 ~ 240 页左右,手动修改基本是不可能的任务,所以还需要借助 脚本 来代劳。
  5. Edit Book 导入经脚本修正过的 htmlimage 的内容:File > Import files into book > 选择 htmlimage > Save

    保存之前,务必校验 Text 的文件数量是否与 Images 一致:鼠标移动到 File browserTextImages 时,会出现文件数及体积统计。

  6. 关闭 Edit Book 返回到 Calibre 界面,点击 Save to disk 就完工了。

附:修订图片的脚本

使用方法:把下列脚本保存为文件 fix-img.sh,放置在 htmlimage 同级的目录,然后运行即可。

如果在 macOS 执行此脚本,则需要安装 gnu-sed

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/usr/bin/env bash

set -eu

page_size=$(ls -l html | wc -l)
index_length=$(($(echo $page_size | wc -c) - 1))

opt_img_noly=false

while (($#)); do
  opt="$1"
  case $opt in
  -i | --image-only)
    opt_img_noly=true
    shift
    ;;
  *)
    echo "Unknown option"
    exit 1
    ;;
  esac
done

for html in html/*html; do
  img=$(grep "<img src=" $html | sed 's|.*\.\./image/||;s/" .*//')

  index=$(basename $html | sed 's/\.html//')

  if $opt_img_noly; then
    new_img="$index.$(echo $img | sed 's/.*\.//')"
  else
    new_img="$(printf "%0${index_length}d" $index).$(echo $img | sed 's/.*\.//')"

    # Update HTML reference
    src="${img%.*}"
    dest=${new_img%.*}

    sed -i "s/$src/$dest/" "$html"
    echo "Update reference of $html"
  fi

  # Rename image file
  mv "image/$img" "image/$new_img"
  echo "Rename 'image/$img' as 'image/$new_img'"
done

if $opt_img_noly; then
  rm -rf html
fi
This post is licensed under CC BY 4.0 by the author.

GitHub 的 Git LFS 奇遇

-