論文を読むにむけて、英語が苦手なのでMarkdownにして翻訳して読んでいることを前に書いた。引き続き読んでいるのだが、最近はEPUBにして、iPhoneのブックアプリで読んでいる。もとはポッドキャストも一緒にオーディオブックとして管理したかったからだが、EPUBをブックでスクロール読みにすると使い勝手がよかった。
唯一不満だなぁ…と思っていたのが画像の入れ方だったのだが、すぐに解決できることがわかった笑 ChatGPTに聞きながら調べてみると、Doclingでオプションを調整すれば、画像も抽出、参照するMarkdownを作成でき、Pandocで画像入りEPUBも作成できるとわかった。
今回は、この一連について簡単に紹介しようと思う。
はじめに
早速だが、今回はこれまでも使ってきたDocling、Pandocで、画像抽出や画像挿入のコマンドや関数を確認する感じになる。関数て呼び方は古いかもだが笑
今回の環境は以下の通り。
- MacBook Air (M2、メモリ16GB)
- Python 3.12.11
- Docling 2.82.0
- Pandoc 3.10.2
Macはやってる間に上げちゃったりして確認しそびれた。今の26.6.2でも一応動いてる。
作成したスクリプトは、次のような流れになっている。
PDF ↓ Docling ├─ Markdown └─ images/ 内の画像ファイル ↓ Pandoc ↓ 画像付きEPUB
この辺の構成図?テキスト?はCodexが書いてくれたがありがたい。文章はなかなか自分の文体を覚えてくれなくて、ほぼ自分が書いているのがなんだかなぁだが。
実装
DoclingでPDFからMarkdownと画像を出力
あまりDoclingの仕様を細かく理解していなかったが、コードブロック PdfPipelineOptions(generate_picture_images=True) で画像を出力するか指定する。いろいろ入れ子だが、それを最終的には引数に DocumentConverter を作成して、関数を呼んで変換していくことになる。
pipeline_options = PdfPipelineOptions(generate_picture_images=True) converter = DocumentConverter( format_options={ InputFormat.PDF: PdfFormatOption( pipeline_options=pipeline_options ) } ) result = converter.convert(str(pdf_path))
その後、save_as_markdown()でMarkdownを書き出す。画像については別ファイルとして出すらしいREFERENCEDを指定した。指定しないとどうなるのかはテストしていない。
result.document.save_as_markdown(
markdown_path,
artifacts_dir=images_dir,
image_mode=ImageRefMode.REFERENCED,
)
markdown_pathがMarkdownの保存先で、images_dirが画像の保存先になる。今回、自分の実装では、はじめにスクリプトの引数でPDFファイルを入力するようにしており、 argparse などでパスを処理して先ほどの markdown_path や images_dir は設定した。
ただ、DoclingでMarkdownを保存する際に、そのままだと画像の参照が絶対パスになってしまうことがわかった。そこで、一度ファイルを読んで、そのテキストを replace して相対パスにして書き込みを実施した。なんとなく、アナログ感に溢れているので、もっと良い解決があるのかもしれないなとも思った。今回、細かくは追わなかったのだが、Doclingの保存も相対パスいけそうだと思うので…
image_prefix = f"{images_dir.resolve().as_posix()}/" markdown_path.write_text( markdown_path.read_text(encoding="utf-8").replace( image_prefix, "images/", ), encoding="utf-8", )
Pandocで画像付きEPUBを作成
Pandocを呼び出す部分は次の通り。
pandoc_command = [
"pandoc",
str(markdown_path),
"--from=markdown",
"--to=epub3",
f"--resource-path={markdown_path.parent}",
"--output",
str(epub_path),
]
subprocess.run(pandoc_command, check=True)
--resource-pathにはMarkdownファイルのディレクトリを指定している。画像はその中のimages/もあり、Markdown内で相対パスでimages/...対応する画像ファイルを見つけて埋め込む動きになるようだ。
コマンドかけよという感じだが、同じPythonファイル内で実装したため、上記の感じで subprocess を用いた。
まとめ
今回はDoclingとPandocを使って、PDFから画像付きEPUBを作ってみた。コードもまあ、Codexと相談しつつ、やってみたというところもあり、すぐにはできたものの、理解の範疇内のコードにするのが難しい笑 こちらの力不足なだけだとは思うが。
また、最近の感想だが、、、あまりLLM側も進化を感じなくなって来た気がするのは、こちらの認識に対してレベルが上がりすぎているのだろうか…?BLEACHの霊圧みたいだな… 書いているうちにFable 5.1も出たし、GPTも新しいの出るらしいし。この論文翻訳系の今後の課題としては、翻訳自体をローカルのLLMにやらせるところは試したいなと思っている。
また、そろそろ手描きのローカルLLMによるテキストかも最近のモデルだとどうか確かめたいなとも思ったりしている。この辺りで取り組みたいものを考えて、次回、と思ったりしている。





