作品展示
背景需求:
1、前文完成了mj图片的生成与下载,并制作了两款4图学具——4图左脸、4图右脸
本文继续探索其他图片布局方法——左列2图左脸+右列2图右脸
在左侧列2单元插入两张左脸图,在右侧列2单元格两张右脸脸图
一、制作左脸图4张和右脸图4张
word模板 ——插入2行4列,
代码重点:
代码展示
'''
目的:A4横版 一页4个半脸(4个人物,左侧2个人都是2张左侧图,右侧2个人物都是2张右侧图 分别靠左靠右)
时间:2024年3月3日17:27
# '''
num=int(input('生成几份?\n'))
print('----------第1-1步:提取所有的幼儿照片的路径------------')
import os
p=r"C:\Users\jg2yXRZ\OneDrive\桌面\儿童正脸"
tall=['04左脸图','05右脸图']
path=[]
for t3 in range(len(tall)):
p1=p+r'\{}'.format(tall[t3])
print(p1)
imgs=os.listdir(p1)
for img in imgs:
if img.endswith(".png"):
path.append(p1+'\\'+img)
print(path)
print(len(path))
# 50张图
s=int(len(path)/2)
# 25个一组
pathall=[]
for t4 in range(int(len(path)/s)):
pathall.append(path[t4*s:t4*s+s])
print(pathall)
print(len(pathall))
# [[左脸图25个],[有脸图25个],]
print('----------第-2步:坐标提取------------')
bg=[]
for x in range(0,4,3):
# zb=int('{}'.format(t3))
for y in range(0,t3+1):
# for y in range(0,4,2): # 左侧插图
# for y in range(1,4,2): # 右侧插图
bg.append('{}{}'.format('%02d'%y,'%02d'%x))
print(bg)
# ['0000', '0100', '0003', '0103']
# ['0000', '0100', 是左侧两图的左侧图坐标位置
# '0003', '0103']是右侧两图的右侧图坐标位置
print('----------第2步:新建一个临时文件夹------------')
# 新建一个”装N份word和PDF“的文件夹
imagePath1=p+r'\零时Word'
if not os.path.exists(imagePath1): # 判断存放图片的文件夹是否存在
os.makedirs(imagePath1) # 若图片文件夹不存在就创建
print('----------第3步:随机抽取4张图片 ------------')
import docx
from docx import Document
import random
import os,time
from docx.shared import Inches,Cm,Pt
from docx.shared import RGBColor
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
# # from docx.enum.text import WD_VERTICAL_ALIGNMENT
# from docx.enum.table import WD_CELL_VERTICAL_ALIGNMENT #用来设置单元格垂直对齐方式
from docx.oxml.ns import qn
from docxtpl import DocxTemplate
import pandas as pd
from docx2pdf import convert
from docx.shared import RGBColor
for nn in range(0,num): # 读取图片的全路径 的数量 31张
doc = Document(p+r'\对称脸.docx')
# 随机抽取2+2图
figures=[]
for xx in range(len(pathall)): # [[],[]]里面的每个【】里面的25个里面抽取2个
fig=random.sample(pathall[xx],2) # 随机抽取4个图片
# print(fig)
for f in fig:
figures.append(f)
print(figures)
table = doc.tables[0]
for t in range(len(bg)): # 02
pp=int(bg[t][0:2])
qq=int(bg[t][2:4])
k=figures[t]
# print(pp,qq,k)
# 写入1张大图
run=doc.tables[0].cell(pp,qq).paragraphs[0].add_run() # # 图片位置 第一个表格的0 3 插入照片
run.add_picture(r'{}'.format(k),width=Cm(5.00),height=Cm(9.9))
if t==0 or t==1:
table.cell(pp,qq).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT #居中
else:
table.cell(pp,qq).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.LEFT #居中
doc.save(imagePath1+r'\{}.docx'.format('%02d'%nn))
# 19份docx合并成1个pdf
import os
from docx2pdf import convert
from PyPDF2 import PdfMerger
# 获取docx文件列表
docx_files = os.listdir(imagePath1)
docx_files = [f for f in docx_files if f.lower().endswith('.docx')]
docx_files = docx_files[:] # 只处理前10个docx文件 所有文件都处理
# 将docx文件转换为PDF
pdf_files = []
for docx_file in docx_files:
docx_path = os.path.join(imagePath1, docx_file)
pdf_file = docx_file[:-5] + '.pdf'
pdf_path = os.path.join(imagePath1, pdf_file)
convert(docx_path, pdf_path)
pdf_files.append(pdf_path)
# 合并PDF文件
merger = PdfMerger()
for pdf_file in pdf_files:
merger.append(pdf_file)
# 保存合并后的PDF文件
output_file = os.path.join(p, '(打印)儿童脸部对称图-左侧列2张左图+右侧列2张右图({}份).pdf'.format(num))
merger.write(output_file)
merger.close()
print('合并完毕,结果保存在{}'.format(p))
# # print('----------第5步:删除临时文件夹------------')
import shutil
shutil.rmtree(imagePath1) #递归删除文件夹,即:删除非空文件夹