💨

TEI/XMLファイルを縦書きPDFに変換する方法の1例

2022/10/03に公開

概要

TEI/XMLファイルを縦書きPDFに変換する方法について、その1例を備忘録として残します。

以下のノートブックで、「校異源氏物語」を対象としたプログラムをお試しいただけます。

https://colab.research.google.com/github/nakamura196/ndl_ocr/blob/main/TEI_XMLファイルを縦書きPDFに変換する.ipynb

変換の流れ

今回は、Quartoを使用しています。

https://quarto.org/

インストールの方法は以下を参考にしてください。

https://quarto.org/docs/get-started/

TEI/XML -> qmd

まずTEI/XMLファイルの内容をqmdファイルに変換します。以下は、変換スクリプトのサンプルです。

from bs4 import BeautifulSoup
soup = BeautifulSoup(open(file,'r'), "xml")
elements = soup.findChildren(text=True, recursive=True)

import os

id = os.path.splitext(os.path.basename(file))[0]

title = soup.find("title").text
author = soup.find("author").text

elements = soup.find("body").find("p").findChildren()

text = ""

for e in elements:

    if e.name == "pb":
        text += "\n"

    if e.name == "seg":
        text += e.text + "  \n"

opath = f"data/{id}.qmd"
os.makedirs(os.path.dirname(opath), exist_ok=True)

text = f"""---
title: "{title}"
author: "{author}"
format: 
    docx:
        reference-doc: /content/kouigenjimonogatari/tools/genji-doc-style.docx
---
{text.strip()}
"""

with open(opath, "w") as f:
    f.write(text)

以下がqmdファイルの例です。

---
title: "校異源氏物語・きりつぼ"
author: "池田亀鑑"
format: 
    docx:
        reference-doc: /content/kouigenjimonogatari/tools/genji-doc-style.docx
---
いつれの御時にか女御更衣あまたさふらひ給けるなかにいとやむことなきゝは  
にはあらぬかすくれて時めき給ありけりはしめより我はと思あかり給へる御方  
〱めさましきものにおとしめそねみ給おなしほとそれより下らうの更衣たち  
はましてやすからすあさゆふの宮つかへにつけても人の心をのみうこかしうら  
みをおふつもりにやありけむいとあつしくなりゆきもの心ほそけにさとかちな  
るをいよ〱あかすあはれなる物におもほして人のそしりをもえはゝからせ給  
はす世のためしにもなりぬへき御もてなし也かんたちめうへ人なともあいなく  
めをそはめつゝいとまはゆき人の御おほえなりもろこしにもかゝることのおこ  
りにこそ世もみたれあしかりけれとやう〱あめのしたにもあちきなう人のも  
てなやみくさになりて楊貴妃のためしもひきいてつへくなりゆくにいとはした  
なきことおほかれとかたしけなき御心はへのたくひなきをたのみにてましらひ  
給ちゝの大納言はなくなりてはゝ北の方なんいにしへの人のよしあるにておや  
うちくしさしあたりて世のおほえはなやかなる御方〱にもいたうおとらすな  
にことのきしきをももてなしたまひけれととりたてゝはか〱しきうしろみし  

なけれは事ある時はなをより所なく心ほそけ也さきの世にも御ちきりやふかか 

qmd -> Word(docx)

次に、qmdファイルをwordファイルに変換します。この時、事前に用意した縦書きのwordテンプレートを参照することで、マークダウン形式のテキストを縦書きのwordファイルに変換します。

こちらについては、以下の記事が参考になります。

https://www.infoworld.com/article/3671668/how-to-create-word-docs-from-r-or-python-with-quarto.html#toc-4

https://quarto.org/docs/output-formats/ms-word-templates.html

結果、以下のようなwordファイルが作成されます。

Word(docx) -> PDF

最後に、wordファイルをpdfに変換します。手動による変換に加えて、以下のライブラリによる自動変換も可能です。

https://pypi.org/project/docx2pdf/

これにより、TEI/XMLをPDFファイルに機械的に変換することができます。

まとめ

他にもより効率的な変換方法があるかと思います。変換方法を検討する際の一例として参考になりましたら幸いです。

また本フローは、qmdファイルを経由することにより、レイアウト等に一部制約が加わることが課題として挙げられます。以下のpython-docxのようなライブラリを使って、TEI/XMLからwordファイルを直接作成する方法も有効かと思います。

https://pypi.org/project/python-docx/

もちろんxsltを使った変換も有効です。他にも色々な方法がありますので、引き続き検討したいと思います。

なお、epubに変換する方法の一例も以下に記載しています。参考になりましたら幸いです。

https://zenn.dev/nakamura196/articles/a8c55f6689ea89

Discussion