0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

縦書きEPUBをPDFに変換する

Posted at

はじめに

こちらは縦書きのEPUBをPDFに変換したときの備忘録です。
変換ソフトやwebアプリ等で変換してもうまくいかず、
自分でやったところうまくいったので記事にしました。
Pythonを使ってますが、やってること自体は簡単なので別言語でもできると思います。

必要なもの

  • Chrome
  • EPUBファイル
  • Python
    • bs4 0.0.1
    • lxml 4.9.1
    • pypdf 3.3.0

EPUBの展開

EPUBの実態はzipファイルなので展開できます。
記事で使用するデモ用のepubは夏目漱石作のこころ使用しています。理由はフリーで手に入るからです。(ファイル名はkokoro.epub)
早速作業開始します。

kokoro.epubの拡張子を.zipに変更し展開します。
展開結果は以下のようになります。

kokoro
│  content.opf
│  cover.jpeg
│  mimetype
│  page_styles.css
│  stylesheet.css
│  titlepage.xhtml
│  toc.ncx
│
├─META-INF
│      container.xml
│
└─text
        part0000.html
        part0001.html
        part0002.html
        part0003.html
        part0004_split_000.html
        part0004_split_001.html
        part0005.html

htmlファイルの結合

htmlファイルに各文章が入っているため1つのファイルに結合します。
以下pythonスクリプトをkokoroファルダに配置して実行します。

import glob
from bs4 import BeautifulSoup

texts=[]
    
for file in glob.glob('./text/*.html'):
    with open(file,encoding='utf-8')as f:
        soup = BeautifulSoup(f.read(),"lxml")
    body=soup.find('body')
    texts.append(''.join([str(content) for content in body.contents]))
    texts.append('<div style="page-break-after: always;"></div>')#改ページ
with open('body.txt','w',encoding='utf-8') as f:
    f.writelines(texts)

やっていることは、各htmlファイルからbody部を抜き出して、1つのファイルにまとめていきます。
その時、印刷時の改ページの設定もしておきます。

次にtextファルダにある適当なhtmlをコピーしてindex.htmlという名前に変更します。
そして、htmlのbody部を作成したものに置き換えます。
(スクリプト作ってもよかったですが、コピペでもたいして時間変わらないので作りませんでした。すみません。)

変更前.html
<?xml version='1.0' encoding='utf-8'?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" xml:lang="ja">
  <head>
    <link class="horizontal" rel="alternate stylesheet" href="../styles/a00773_h.css" type="text/css" title="横組"/>
    <title>こころ</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  <link rel="stylesheet" type="text/css" href="../stylesheet.css"/>
<link rel="stylesheet" type="text/css" href="../page_styles.css"/>
</head>
<body class="newpagestyle">
  <div class="align_left"><p class="class1"><span class="size">こころ</span><br class="class1"/></p></div>
  <div class="align_right"><div class="class2"><p class="calibre">夏目漱石</p>
  </div>
  </div>
</body></html>
変更後.html
<?xml version='1.0' encoding='utf-8'?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" xml:lang="ja">
  <head>
    <link class="horizontal" rel="alternate stylesheet" href="../styles/a00773_h.css" type="text/css" title="横組"/>
    <title>こころ</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  <link rel="stylesheet" type="text/css" href="../stylesheet.css"/>
<link rel="stylesheet" type="text/css" href="../page_styles.css"/>
</head>
<body class="newpagestyle">
  <div class="align_left"><p class="class1"><span class="size">こころ</span><br class="class1"/></p></div>
  <p class="class1"><br class="class1"/></p>
  </div>
  <div style="page-break-after: always;"></div>
</body></html>
text
        index.html
        part0000.html
        part0001.html
        part0002.html
        part0003.html
        part0004_split_000.html
        part0004_split_001.html
        part0005.html

リンク先の変更

現時点でindex.htmlをブラウザで開いてみます。
横スクロールで見れる小説になっていることが確認できます。
ここで1つ問題があります。目次等でリンクが張ってある場合もともとあったhtmlファイルに
飛んでしまいます。これはPDFにしたときにちゃんと動かないのでこれを修正します。
リンクいらない方はこの項目はしなくても構いません。
index.htmlをエディタで開いてhref=属性でxxxx.html#xxxxとなっているところを#xxxxになるように修正していきます。
(これもスクリプト作ってません。大体リンク張っている位置は固まってるのですぐ終わります。)
修正後、再度index.htmlをブラウザで開いてみます。そして、リンクがindex.html内で移動していることを確認します。

PDFで保存

できたindex.htmlをブラウザでctrl+pの印刷画面でPDFに保存でPDFにします。余白等のパラメータは自分の好みで設定してください。
保存名はbody.pdfにします。

表紙の作成

titlepage.xhtmlcover.jpegのどちらかを印刷画面でPDFに保存します。
titlepage.xhtmlstyleタグが邪魔して変な大きさになる時があるので調整してください。
保存名はcover.pdfにします。

表紙と本体の結合

表紙と本体を結合します。pypdfを使って結合しているだけです。
Web上にあるPDF結合ツールを使っても構いません。

from pypdf import PdfWriter

merger = PdfWriter()

for pdf in ["cover.pdf", "body.pdf"]:
    merger.append(pdf)

merger.write("kokoro.pdf")
merger.close()

完成です。

最後に

今回は縦書きEPUBのPDF変換を行いました。
みなさまのお役に立てれば幸いです。
今回手抜きで作らなかった部分やこうした方がいい等のコメントがありましたら教えてください。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?