建筑设计公司在项目执行过程中,会产生大量的设计图纸、效果图、实景照片等图片资料。这些资料按照项目名称、阶段、专业等维度存放在多个文件夹和子文件夹中。
操作需求:为了方便内部管理和向客户交付完整的设计方案,公司需要将每个项目文件夹及其子文件夹内的图片分别转换成 PDF 文件。比如,一个大型商业建筑项目,将概念设计阶段的草图、初步设计的效果图、施工图等图片合并成一个完整的 PDF 方案,便于查阅和保存。
以下是一个基于 Python 的解决方案,它可以将多个文件夹里的图片逐个批量转换成多个 PDF 文件,同时支持子文件夹单独合并转换以及子文件夹单独批量转换。
代码实现
python
import os
from PIL import Image
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
from reportlab.lib.utils import ImageReader
def images_to_pdf(folder_path):
# 遍历文件夹及其子文件夹
for root, dirs, files in os.walk(folder_path):
# 筛选出图片文件
image_files = [f for f in files if f.lower().endswith(('.png', '.jpg', '.jpeg'))]
if image_files:
# 为每个文件夹生成一个 PDF 文件
pdf_filename = os.path.join(root, os.path.basename(root) + '.pdf')
c = canvas.Canvas(pdf_filename, pagesize=letter)
for image_file in image_files:
image_path = os.path.join(root, image_file)
try:
img = Image.open(image_path)
width, height = img.size
aspect_ratio = width / height
# 根据页面大小和图片宽高比调整图片尺寸
if aspect_ratio > 1:
# 宽图
new_width = letter[0] - 50
new_height = new_width / aspect_ratio
else:
# 高图
new_height = letter[1] - 50
new_width = new_height * aspect_ratio
x = (letter[0] - new_width) / 2
y = (letter[1] - new_height) / 2
c.drawImage(ImageReader(img), x, y, width=new_width, height=new_height)
c.showPage()
except Exception as e:
print(f"Error processing {image_path}: {e}")
c.save()
if __name__ == "__main__":
# 请将此路径替换为你实际存放图片的根文件夹路径
root_folder = 'your_image_folder'
images_to_pdf(root_folder)
代码解释
-
导入必要的库:
os
:用于文件和目录操作,如遍历文件夹和获取文件路径。PIL.Image
:用于打开和处理图片。reportlab
相关模块:用于生成 PDF 文件,包括设置页面大小、绘制图片等。
-
images_to_pdf
函数:- 使用
os.walk
遍历指定文件夹及其子文件夹。 - 筛选出每个文件夹中的图片文件(支持
.png
、.jpg
和.jpeg
格式)。 - 为每个包含图片的文件夹生成一个 PDF 文件,文件名与文件夹名相同。
- 对于每个图片文件,打开并根据页面大小和图片宽高比调整图片尺寸,然后将其绘制到 PDF 的一页上。
- 处理完一个图片后,调用
c.showPage()
切换到下一页。 - 最后保存 PDF 文件。
- 使用
-
主程序:
- 指定存放图片的根文件夹路径,调用
images_to_pdf
函数进行转换。
- 指定存放图片的根文件夹路径,调用
使用方法
- 确保你已经安装了
Pillow
和reportlab
库,可以使用以下命令进行安装:
bash
pip install pillow reportlab
-
将代码中的
'your_image_folder'
替换为你实际存放图片的根文件夹路径。 -
运行代码,程序会自动遍历指定文件夹及其子文件夹,将每个文件夹中的图片合并成一个 PDF 文件,并保存在相应的文件夹中。
注意事项
- 代码中仅处理了
.png
、.jpg
和.jpeg
格式的图片,如果你需要处理其他格式的图片,可以在筛选条件中添加相应的扩展名。 - 如果图片文件损坏或无法打开,程序会捕获异常并输出错误信息,但不会影响其他图片的处理。