读取目录下图片,创建生成PDF,并加入水印
为了读取目录下的所有图片,生成PDF,并在PDF上添加水印,可以按照以下步骤实现。这将使用Python的Pillow库处理图片,reportlab库生成PDF,以及PyPDF2库为PDF添加水印。
1. 安装必要的库
你需要安装以下Python库:
- Pillow
- reportlab
- PyPDF2
可以使用以下命令安装这些库:
pip install Pillow reportlab PyPDF2
2. 实现代码
下面是一个完整的Python代码示例,该代码将读取指定目录中的所有图片,生成一个PDF,并在PDF上添加水印:
import os
from PIL import Image
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from PyPDF2 import PdfReader, PdfWriter
def images_to_pdf(image_folder, output_pdf_path):
print("Converting images to PDF...")
images = []
for file_name in os.listdir(image_folder):
if file_name.lower().endswith(('png', 'jpg', 'jpeg')):
image_path = os.path.join(image_folder, file_name)
images.append(Image.open(image_path))
print(f"Added image: {file_name}")
if not images:
print("No images found in the folder.")
return
images[0].save(output_pdf_path, save_all=True, append_images=images[1:])
print(f"PDF created at {output_pdf_path}")
def add_watermark(input_pdf_path, output_pdf_path, watermark_text):
print("Adding watermark...")
# Create a watermark PDF
watermark_pdf_path = "watermark.pdf"
c = canvas.Canvas(watermark_pdf_path, pagesize=letter)
c.setFont("Helvetica", 50)
c.setFillColorRGB(1, 1, 1, alpha=0.3) # Set color to white
width, height = letter
text_width = c.stringWidth(watermark_text, "Helvetica", 50)
c.drawString(width - text_width - 10, 10, watermark_text) # Right bottom corner
c.save()
print("Watermark created.")
# Add watermark to existing PDF
reader = PdfReader(input_pdf_path)
writer = PdfWriter()
watermark = PdfReader(watermark_pdf_path).pages[0]
for page_num, page in enumerate(reader.pages, start=1):
page.merge_page(watermark)
writer.add_page(page)
print(f"Watermark added to page {page_num}.")
with open(output_pdf_path, "wb") as output_file:
writer.write(output_file)
print(f"Watermarked PDF saved at {output_pdf_path}")
os.remove(watermark_pdf_path) # Cleanup watermark file
print("Temporary watermark file removed.")
def main():
image_folder = input("Enter the path to the image folder: ")
output_pdf_path = input("Enter the output PDF path: ")
watermark_text = input("Enter the watermark text: ")
temp_pdf_path = "temp_output.pdf"
# Create PDF from images
images_to_pdf(image_folder, temp_pdf_path)
# Add watermark to the PDF
add_watermark(temp_pdf_path, output_pdf_path, watermark_text)
# Cleanup temporary file
os.remove(temp_pdf_path)
print("Temporary PDF file removed.")
# Run the main function
main()
代码说明
- images_to_pdf:
- 读取指定目录中的所有图片,并生成一个PDF。
- 使用Pillow库的Image.open方法打开图片,使用save方法生成PDF。
- add_watermark:
- 使用reportlab库创建一个带有水印的PDF页面。
- 使用PyPDF2库将水印添加到生成的PDF中。
- main:
- 调用images_to_pdf生成PDF。
- 调用add_watermark在生成的PDF上添加水印。
- 删除临时生成的无水印PDF。
上述水印内容不支持中文
要支持中文水印内容,必须使用支持中文字体的库,并确保在生成PDF时使用这些字体。下面的代码使用reportlab库的支持中文字体功能。我们将使用reportlab.pdfbase.ttfonts.TTFont和reportlab.pdfbase.pdfmetrics来注册和使用中文字体。
首先,需要一个支持中文的字体文件,比如SimHei.ttf(黑体字体)。你可以从你的系统中找到适合的中文字体文件。
# 注册中文字体
pdfmetrics.registerFont(TTFont('SimHei', font_path))
修改点
- 注册中文字体: 使用reportlab.pdfbase.ttfonts.TTFont和reportlab.pdfbase.pdfmetrics.registerFont来注册一个支持中文的字体。
- 使用中文字体: 在生成水印时,设置字体为注册的中文字体。