[Python] Document(), .paragraph, .replace(), convert()

공부한 내용 정리하는 공간입니다.

틀린 내용이 있을 수 있습니다.

모든 지적, 첨언 환영합니다.

오늘의 코드

1. 사용자가 입력한 정보로 docx 파일 수정

2. docx 파일을 pdf 파일로 변환

3. pdf 파일 이메일로 전송

from flask import Flask, render_template, request, send_file
from docx import Document
from docx2pdf import convert
import smtplib
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from dotenv import load_dotenv
import os

app = Flask(__name__)

def mail_sender(user_mail, file_path):
    load_dotenv()

    send_email = os.getenv("SECRET_ID")
    send_pwd = os.getenv("SECRET_PASS")
    recv_email = user_mail

    smtp_name = "smtp.naver.com"
    smtp_port = 587              

    text = "수료증입니다"

    msg = MIMEMultipart()
    msg['Subject'] = "수료증 발급" 
    msg['From'] = send_email          
    msg['To'] = recv_email            

    contentPart = MIMEText(text) 
    msg.attach(contentPart)

    etc_file_path = file_path
    with open(etc_file_path, 'rb') as f : 
        etc_part = MIMEApplication( f.read() )
        etc_part.add_header('Content-Disposition','attachment', filename=etc_file_path)
        msg.attach(etc_part)

    email_string = msg.as_string()

    s = smtplib.SMTP(smtp_name, smtp_port)
    s.starttls()
    s.login(send_email, send_pwd)
    s.sendmail(send_email, recv_email, email_string)
    s.quit()

@app.route("/")
def index():
    return render_template('index.html')

@app.route("/upload", methods=['GET', 'POST'])
def upload():
    name = request.form['name']
    course = request.form['course']
    date = request.form['date']
    user_mail = request.form['user_mail']
    doc = Document('template.docx')
    for paragraph in doc.paragraphs:
        if 'NAME' in paragraph.text:
            paragraph.text = paragraph.text.replace('NAME', name)
        elif 'COURSE' in paragraph.text:
            paragraph.text = paragraph.text.replace('COURSE', course)
        elif 'DATE' in paragraph.text:
            paragraph.text = paragraph.text.replace('DATE', date)
    doc.save(f"{name}_certificate.docx")
    convert(f"{name}_certificate.docx", f"{name}_certificate.pdf")
    mail_sender(user_mail, f"{name}_certificate.pdf")
    
    return render_template('index.html')

if __name__ == '__main__':
    app.run(debug=True)

 


index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>수료증 발급</title>
</head>
<body>
    <h1>수료증 발급을 위한 정보 입력</h1>
    <form method="post" action="{{url_for('upload')}}">
        <b>이름 </b><input type="text" name="name"></br>
        <b>과정 </b><input type="text" name="course"></br>
        <b>날짜 </b><input type="date" name="date"></br>
        <b>이메일 </b><input type="text" name="user_mail"></br>
        <input type="submit" value="발급">
    </form>
</body>
</html>

 


Document()

word 문서 파일을 열거나 새로 생성할 때 사용

python-docx 라이브러리의 클래스

 


.paragraph

word 문서의 모든 단락(paragraph)을 리스트 형태로 가져오는 속성

word 문서에서 줄 바꿈이나 Enter를 통해 나뉘는 각 부분이 하나의 단락으로 인식

객체로 저장한 뒤 단락 속성 사용 가능

    >paragraph=doc.paragraphs일 때

    >paragraph.text=단락의 텍스트

    >paragraph.style=단락의 스타일

 


.replace(A, B)

문자열에서 A를 B로 바꿔주는 메서드

새로운 문자열을 반환하며, 원본 문자열은 바뀌지 않음

 


convert("A.docx", "b.pdf")

word 문서 파일 A를 PDF 파일 b로 변환

패키지 추가 설치 이후 사용할 수 있음

 


오늘의 코드

1. 사용자가 입력한 정보로 docx 파일 수정

2. docx 파일을 pdf 파일로 변환

3. pdf 파일 이메일로 전송

from flask import Flask, render_template, request, send_file
from docx import Document
from docx2pdf import convert
import smtplib
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from dotenv import load_dotenv
import os

app = Flask(__name__)

def mail_sender(user_mail, file_path):
    load_dotenv()

    send_email = os.getenv("SECRET_ID")
    send_pwd = os.getenv("SECRET_PASS")
    recv_email = user_mail

    smtp_name = "smtp.naver.com"
    smtp_port = 587              

    text = "수료증입니다"

    msg = MIMEMultipart()
    msg['Subject'] = "수료증 발급" 
    msg['From'] = send_email          
    msg['To'] = recv_email            

    contentPart = MIMEText(text) 
    msg.attach(contentPart)

    etc_file_path = file_path
    with open(etc_file_path, 'rb') as f : 
        etc_part = MIMEApplication( f.read() )
        etc_part.add_header('Content-Disposition','attachment', filename=etc_file_path)
        msg.attach(etc_part)

    email_string = msg.as_string()

    s = smtplib.SMTP(smtp_name, smtp_port)
    s.starttls()
    s.login(send_email, send_pwd)
    s.sendmail(send_email, recv_email, email_string)
    s.quit()

@app.route("/")
def index():
    return render_template('index.html')

@app.route("/upload", methods=['GET', 'POST'])
def upload():
    name = request.form['name']
    course = request.form['course']
    date = request.form['date']
    user_mail = request.form['user_mail']
    doc = Document('template.docx')
    for paragraph in doc.paragraphs:
        if 'NAME' in paragraph.text:
            paragraph.text = paragraph.text.replace('NAME', name)
        elif 'COURSE' in paragraph.text:
            paragraph.text = paragraph.text.replace('COURSE', course)
        elif 'DATE' in paragraph.text:
            paragraph.text = paragraph.text.replace('DATE', date)
    doc.save(f"{name}_certificate.docx")
    convert(f"{name}_certificate.docx", f"{name}_certificate.pdf")
    mail_sender(user_mail, f"{name}_certificate.pdf")
    
    return render_template('index.html')

if __name__ == '__main__':
    app.run(debug=True)

 


index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>수료증 발급</title>
</head>
<body>
    <h1>수료증 발급을 위한 정보 입력</h1>
    <form method="post" action="{{url_for('upload')}}">
        <b>이름 </b><input type="text" name="name"></br>
        <b>과정 </b><input type="text" name="course"></br>
        <b>날짜 </b><input type="date" name="date"></br>
        <b>이메일 </b><input type="text" name="user_mail"></br>
        <input type="submit" value="발급">
    </form>
</body>
</html>

오늘의 코드 설명

doc = Document('template.docx')

template.docx라는 이름의 word 파일을 열고 doc에 저장

1. 사용자가 입력한 정보로 docx 파일 수정

for paragraph in doc.paragraphs:

객체 paragraph는 문서의 모든 단락을 순회

if 'NAME' in paragraph.text:
	paragraph.text = paragraph.text.replace('NAME', name)

단락에 NAME이라는 문자열이 포함되어 있으면

NAME이라는 문자열을 변수 name의 값으로 대체함

doc.save(f"{name}_certificate.docx")

word 파일을 저장

2. docx 파일을 pdf 파일로 변환

convert(f"{name}_certificate.docx", f"{name}_certificate.pdf")

word 문서 파일을 PDF로 변환

3. pdf 파일 이메일로 전송

mail_sender(user_mail, f"{name}_certificate.pdf")

user_mail로 pdf 파일을 첨부해서 메일 전송