from openpyxl import load_workbook
from fpdf import FPDF
import os
class EmployeeCardPDF(FPDF):
def header(self):
pass
def footer(self):
self.set_y(-15)
self.cell(0, 10, f'Page {self.page_no()}', 0, 0, 'C')
def generate_pdf(excel_path, image_dir, output_path):
wb = load_workbook(filename=excel_path)
ws = wb.active
pdf = EmployeeCardPDF()
pdf.add_page()
pdf.set_auto_page_break(auto=True, margin=15)
try:
pdf.add_font('SimHei', '', 'path/to/simhei.ttf', uni=True)
pdf.set_font('SimHei', size=12)
except Exception as e:
print(f"字体加载失败:{e}")
return
row_count = 0
employees_per_page = 6
for row in ws.iter_rows(min_row=2, values_only=False):
name_cell = row[0].value
pos_cell = row[1].value
img_name = row[2].value
if not name_cell:
continue
if row_count > 0 and row_count % employees_per_page == 0:
pdf.add_page()
pdf.set_font('SimHei', size=12)
x_pos = 20 + (row_count % 3) * 90
y_pos = 20 + (row_count // 3) * 120
pdf.set_xy(x_pos, y_pos)
pdf.rect(x_pos, y_pos, 80, 110, style='D')
img_path = os.path.join(image_dir, str(img_name))
if os.path.exists(img_path):
pdf.image(img_path, x=x_pos + 10, y=y_pos + 10, w=60, h=70)
else:
pdf.text(x_pos + 10, y_pos + 10, "No Photo")
pdf.set_xy(x_pos + 10, y_pos + 85)
pdf.cell(60, 10, txt=f"姓名:{name_cell}", ln=0, align='L')
pdf.set_xy(x_pos + 10, y_pos + 95)
pdf.cell(60, 10, txt=f"职位:{pos_cell}", ln=0, align='L')
row_count += 1
pdf.output(output_path)
print(f"成功生成 {output_path},共处理 {row_count} 条记录。")
if __name__ == '__main__':
generate_pdf(
excel_path='employees.xlsx',
image_dir='images',
output_path='employee_cards.pdf'
)