順番ではないファイル名
電子書籍のファイルフォーマットであるEPUBを解凍すると画像ファイルを抽出することができます。
漫画の場合は表紙から順番に並んでいない状態で解凍されました。
このままではzipファイルなどにまとめると順番通りにページを開くことができません。
PowerShellを使ってリネーム
手動で対応するのも面倒なので自動的にjpgファイルをリネームするPowerShellを開発しました。
リネームするjpgファイル名を抽出
# 出力ファイルのパス
$outFile = [出力ファイルフルパス]
# 出力ファイルの内容を削除
"" | Out-File $outFile -NoNewline
# XPathクエリで.jpgを含むsrc属性を取り出す
$jpgFilesXpath = "//d:img[contains(@src, '.jpg')]"
# XHTMLファイルを取得するディレクトリのパス
$dirPath = 'C:\tmp\book\out\rename'
# 指定されたディレクトリ内のすべてのXHTMLファイルを取得
$xhtmlFiles = Get-ChildItem -Path $dirPath -Filter '*.xhtml' -File -Recurse
# 名前空間の定義
$namespace = @{ d = "http://www.w3.org/1999/xhtml"}
# 各XHTMLファイルをループしてクエリを実行
foreach ($file in $xhtmlFiles) {
# Select-Xmlコマンドでクエリを実行
$result = Select-Xml -Path $file.FullName -XPath $jpgFilesXpath -Namespace $namespace
# 結果をループしてファイル名をファイルに出力
$result.Node | ForEach-Object {
$_.src | Out-File $outFile -Append
}
}
画像ファイルと同じフォルダに格納されている拡張子「xhtml」からjpgファイル名を抽出
[出力ファイルフルパス]は適時変更してください(テキストファイルで可)
出力結果
表紙からリネームする順番でjpgファイル名が出力されます。
抽出したjpgファイル名からリネーム
# 出力リストを取得
$fileList = Get-Content -Path [リネームjpgファイル名フルパス]
# ファイルのカウンターを設定
$i = 1
# directory_pathにはリネームしたいファイルが存在するディレクトリパスを設定してください
$directory_path = [リネームファイルフォルダフルパス]
foreach ($file in $fileList) {
# 元のファイルのパスを取得
$originalFilePath = Join-Path -Path $directory_path -ChildPath $file
if (Test-Path -Path $originalFilePath) {
# 新しいファイル名を指定(3桁の数字を持つ文字列にカウンター$iをフォーマットします)
$newFileName = "A{0:D3}.jpg" -f $i
# 新しいファイルのフルパスを作成
$newFilePath = Join-Path -Path $directory_path -ChildPath $newFileName
# ファイル名を変更
Rename-Item -Path $originalFilePath -NewName $newFilePath
# カウンターを増やす
$i++
} else {
Write-Output "File $originalFilePath does not exist."
}
}
[リネームファイルフォルダフルパス]で指定したファルダにあるjpgファイルをリネーム
表紙から順番にリネーム
2本目のスクリプトでAから始まるファイル名にリネームを実施した結果です。
表紙からリネームされているのでzipにまとめても問題なく読むことができます。