本記事では、pythonにて複数の画像ファイルを1ページに並べる数を指定してpdfに貼り付けて保存し、さらに作成したpdfファイルをMicrosoft OfficeのWordへ変換する雛形コードを載せました。使用するライブラリは「pillow」「reportlab」「pdf2docx」です。
下図は各頁に6枚の画像を貼り付けた場合の出力結果です。

下図は各頁に8枚の画像を貼り付けた場合の出力結果です。

■ライブラリのインストール
pip install pillow
pip install reportlab
pip install pdf2docx
■本プログラム
import glob
from PIL import Image
from reportlab.pdfgen import canvas
from pdf2docx.main import parse
def calculate_positions(image_paths, images_per_page, page_width, page_height):
margin = 20
spacing_x = (page_width - 2 * margin) // 2
spacing_y = (page_height - 2 * margin) // (images_per_page // 2)
x_positions = []
y_positions = []
for i in range(images_per_page):
row = i // 2
col = i % 2
x = margin + col * spacing_x
y = page_height - margin - row * spacing_y
x_positions.append(x)
y_positions.append(y)
for i in range(images_per_page):
if i < len(image_paths):
image_path = image_paths[i]
image = Image.open(image_path)
target_width = spacing_x * 0.8
target_height = target_width * image.height / image.width
if target_height > spacing_y:
target_height = spacing_y * 0.8
target_width = target_height * image.width / image.height
x_positions[i] += (spacing_x - target_width) / 2
y_positions[i] -= (spacing_y - target_height) / 2
return x_positions[:images_per_page], y_positions[:images_per_page]
def images_to_pdf(image_paths, output_pdf, images_per_page=4, page_width=595, page_height=842):
pdf = canvas.Canvas(output_pdf, pagesize=(page_width, page_height))
for i in range(0, len(image_paths), images_per_page):
x_positions, y_positions = calculate_positions(image_paths[i:i+images_per_page], images_per_page, page_width, page_height)
for j in range(images_per_page):
if i + j < len(image_paths):
image_path = image_paths[i + j]
image = Image.open(image_path)
target_width = page_width // 2 * 0.8
target_height = target_width * image.height / image.width
image.thumbnail((target_width, target_height))
x, y = x_positions[j], y_positions[j]
pdf.drawImage(image_path, x, y - image.size[1], width=image.size[0], height=image.size[1])
pdf.showPage()
pdf.save()
def main():
image_paths = glob.glob("./dir_img/*.jpg")
images_per_page_list = [4, 6, 8]
for images_per_page in images_per_page_list:
output_pdf = f"output_{images_per_page}_per_page.pdf"
images_to_pdf(image_paths, output_pdf, images_per_page)
output_docx = output_pdf[:-4] + '.docx'
parse(output_pdf, output_docx)
if __name__ == "__main__":
main()
以上
<広告>
リンク
リンク