Wordを〇す


はじめに

Word提出

それはこの世で最も人を不幸にする.

やりたいこと

漢はLaTeX.Wordなど使わない.
しかし単位を落とすわけにもいかない.
せやっ!PDFを埋め込めばええんや!

やったこと

python-docxpdf2imageを使ってPDFを埋め込みます.
コードは下記においてあります.pipenv使えます.
https://github.com/S-aiueo32/kill-docx

(追記) 若干コード修正したのでmasterにあるコードとは別の違う感じになってます.READMEを参照されたし.

コード

置いてあるコードと順番とかは異なりますが,ざっくりと説明します.

まずは使うものだけインポートします.

from docx import Document
from docx.shared import Mm  # 寸法
from pdf2image import convert_from_path

Documentインスタンス生成とマージン&用紙サイズの指定.今回はA4を想定しています.

# Documentのインスタンス
doc = Document()

# セクションごとにマージン&用紙サイズの指定
# 今回は空のDocumentなので1つしかセクションは入ってない
sections = doc.sections
for section in sections:
    section.top_margin = 0
    section.bottom_margin = 0
    section.left_margin = 0
    section.right_margin = 0
    section.page_height = Mm(297)
    section.page_width = Mm(210)

Documentにパラグラフを追加して,パラグラフの操作用インスタンスを生成.

p = doc.add_paragraph() 
r = p.add_run()

PDFファイルをビットマップ画像に変換して,出力ファイルリストを返却するヘルパーを定義します.

def save_pages(filename):
    pages = convert_from_path(str(src_dir / filename))  # PILイメージのリストを返してくる
    out_files = []
    for i, page in enumerate(pages):
        out_file = src_dir / f'{filename.replace(".pdf", "")}_{i:0>4}.png'
        out_files.append(out_file)
        page.save(out_file)  # 保存
    return out_files

ページの画像化と画像の追加.

image_paths = save_pages(args.filename)

for image_path in image_paths:
    r.add_picture(str(image_path), height=Mm(297), width=Mm(210))

ファイルの保存.終わり.

doc.save('./output.docx')

結果

こうなる.

まとめ

良い子はマネしないでね.

Special Thanks

🐓

Zongker, Doug. "Chicken chicken chicken: Chicken chicken." Annals of Improbable Research 12 , no. 5 (2006): 16--21.