import os
from PIL import Image
from reportlab.lib import colors
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import mm
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Image as ReportLabImage, Paragraph, Spacer
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
# 폰트 등록 (한글 지원을 위해 나눔고딕 사용)
pdfmetrics.registerFont(TTFont('NanumGothic', 'NanumGothic.ttf'))
def create_photo_layout(input_folder_path, output_pdf_path):
# A4 크기 정의
page_width, page_height = A4
# 스타일 설정
styles = getSampleStyleSheet()
title_style = ParagraphStyle('TitleStyle', parent=styles['Heading1'], fontName='NanumGothic', fontSize=24,
alignment=1, bold=True)
normal_style = ParagraphStyle('NormalStyle', parent=styles['Normal'], fontName='NanumGothic', fontSize=12,
alignment=1, leading=14) # leading 추가
# PDF 문서 생성
doc = SimpleDocTemplate(output_pdf_path, pagesize=A4, topMargin=5*mm, bottomMargin=5*mm, leftMargin=10*mm,
rightMargin=10*mm)
# 내용 리스트 생성
content = []
# 입력 폴더에서 이미지 파일 목록 가져오기
image_files = [f for f in os.listdir(input_folder_path) if
f.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.bmp'))]
# 이미지 크기 설정 (표 안에 맞도록 조정)
img_width = 170 * mm
img_height = 110 * mm
for i, image_file in enumerate(image_files):
if i % 2 == 0:
# 새 페이지 시작
if i > 0:
content.append(Paragraph("
", normal_style)) # 제목 추가 content.append(Paragraph("사 진 대 지", title_style)) # 제목과 표 사이에 간격 추가 (5mm) content.append(Spacer(1, 5 * mm)) img_path = os.path.join(input_folder_path, image_file) img = Image.open(img_path) img.thumbnail((img_width, img_height)) # 이미지와 정보를 포함하는 표 생성 img_table = [ [ReportLabImage(img_path, width=img.width, height=img.height)], [Paragraph('위치', normal_style), Paragraph('위치명적기', normal_style), Paragraph('일시', normal_style), Paragraph('2024.8.', normal_style)], [Paragraph('내용', normal_style), Paragraph('내용을 적기', normal_style), '', ''] ] table = Table(img_table, colWidths=[42.5*mm, 42.5*mm, 42.5*mm, 42.5*mm]) table.setStyle(TableStyle([ ('ALIGN', (0, 0), (-1, -1), 'CENTER'), ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'), ('GRID', (0, 0), (-1, -1), 0.5, colors.black), ('BOX', (0, 0), (-1, -1), 1.5, colors.black), ('SPAN', (0, 0), (-1, 0)), ('SPAN', (1, 2), (3, 2)), ('FONTNAME', (0, 0), (-1, -1), 'NanumGothic'), ('TOPPADDING', (0, 1), (-1, -1), 3), # 상단 패딩 추가 ('BOTTOMPADDING', (0, 1), (-1, -1), 3), # 하단 패딩 추가 ])) content.append(table) # PDF 생성 doc.build(content) print(f"PDF가 성공적으로 생성되었습니다: {output_pdf_path}") if __name__ == "__main__": input_folder = r"C:\Users\dbjsj\Desktop\폴더명 적기" output_pdf = os.path.join(input_folder, "사진대지.pdf") create_photo_layout(input_folder, output_pdf)
", normal_style)) # 제목 추가 content.append(Paragraph("사 진 대 지", title_style)) # 제목과 표 사이에 간격 추가 (5mm) content.append(Spacer(1, 5 * mm)) img_path = os.path.join(input_folder_path, image_file) img = Image.open(img_path) img.thumbnail((img_width, img_height)) # 이미지와 정보를 포함하는 표 생성 img_table = [ [ReportLabImage(img_path, width=img.width, height=img.height)], [Paragraph('위치', normal_style), Paragraph('위치명적기', normal_style), Paragraph('일시', normal_style), Paragraph('2024.8.', normal_style)], [Paragraph('내용', normal_style), Paragraph('내용을 적기', normal_style), '', ''] ] table = Table(img_table, colWidths=[42.5*mm, 42.5*mm, 42.5*mm, 42.5*mm]) table.setStyle(TableStyle([ ('ALIGN', (0, 0), (-1, -1), 'CENTER'), ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'), ('GRID', (0, 0), (-1, -1), 0.5, colors.black), ('BOX', (0, 0), (-1, -1), 1.5, colors.black), ('SPAN', (0, 0), (-1, 0)), ('SPAN', (1, 2), (3, 2)), ('FONTNAME', (0, 0), (-1, -1), 'NanumGothic'), ('TOPPADDING', (0, 1), (-1, -1), 3), # 상단 패딩 추가 ('BOTTOMPADDING', (0, 1), (-1, -1), 3), # 하단 패딩 추가 ])) content.append(table) # PDF 생성 doc.build(content) print(f"PDF가 성공적으로 생성되었습니다: {output_pdf_path}") if __name__ == "__main__": input_folder = r"C:\Users\dbjsj\Desktop\폴더명 적기" output_pdf = os.path.join(input_folder, "사진대지.pdf") create_photo_layout(input_folder, output_pdf)