Files
Doctrine-Check/utils/word_processor.py
2025-12-12 16:43:57 +09:00

258 lines
13 KiB
Python

from docx import Document
from docx.shared import Pt
from docx.enum.text import WD_ALIGN_PARAGRAPH
import os
from datetime import datetime
class WordProcessor:
def __init__(self, template_dir):
self.template_dir = template_dir
self.output_dir = 'output'
os.makedirs(self.output_dir, exist_ok=True)
def generate_document(self, data, cult_name='기타', cult_questions=None):
"""데이터를 워드 문서로 생성"""
doc = Document()
# 기본 정보
basic_info = data.get('basic_info', {})
methodist = data.get('methodist_doctrine', {})
general = data.get('general_cult_doctrine', {})
specific = data.get('specific_cult_doctrine', {})
testimony = data.get('testimony', {})
self.cult_questions = cult_questions or []
# 기본 정보 추출
name = basic_info.get('name', '')
district = basic_info.get('district', '')
cult = basic_info.get('cult', '')
cult_other = basic_info.get('cult_other', '')
# 이단명 결정 (기타 선택 시 직접 입력한 값 사용)
if cult == '기타 (위 선택지에 없을 경우)' and cult_other:
display_cult = cult_other
else:
display_cult = cult
# 문서 맨 위에 기본 정보 표시
title = doc.add_heading('이단 탈퇴자 교리점검표', 0)
title.alignment = WD_ALIGN_PARAGRAPH.CENTER
info_para = doc.add_paragraph()
info_para.add_run('이름: ').bold = True
info_para.add_run(name if name else '(미입력)')
info_para.add_run(' | ')
info_para.add_run('교구: ').bold = True
info_para.add_run(district if district else '(미입력)')
info_para.add_run(' | ')
info_para.add_run('이단교단: ').bold = True
info_para.add_run(display_cult if display_cult else '(미입력)')
info_para.alignment = WD_ALIGN_PARAGRAPH.CENTER
doc.add_paragraph('') # 빈 줄
# 1. 첫 번째 단락: 별첨 목록
doc.add_paragraph('*별첨1 : 감리교 신앙고백서 확인점검')
doc.add_paragraph('*별첨2 : 이단 일반 점검')
doc.add_paragraph('*별첨3 : 이단 상세 점검')
doc.add_paragraph('*별첨4 : 간증문')
doc.add_paragraph('') # 빈 줄
# 2. 두 번째 단락: [별첨1] 감리교 신앙고백서 확인점검
self._add_section_title(doc, '[별첨1] 감리교 신앙고백서 확인점검 (각 문항에 대해 예, 아니오 또는 필요시 서술형으로 답변해 주시면 됩니다)')
self._add_methodist_table(doc, methodist)
doc.add_paragraph('') # 빈 줄
# 3. 세 번째 단락: [별첨2] 이단 일반 점검
self._add_section_title(doc, '[별첨2] 이단 일반 점검 (각 문항에 대해 예, 아니오 또는 필요시 서술형으로 답변해 주시면 됩니다)')
self._add_general_cult_table(doc, general)
# 기타의견
if general.get('other_opinions'):
doc.add_paragraph('기타의견:')
doc.add_paragraph(general.get('other_opinions', ''))
doc.add_paragraph('') # 빈 줄
# 4. 네 번째 단락: [별첨3] 이단 상세 점검 (기타가 아닌 경우만)
# '기타' 선택 시 직접 입력한 이단명 사용
display_cult_name = cult_name
if cult_name == '기타 (위 선택지에 없을 경우)':
cult_other = basic_info.get('cult_other', '')
if cult_other:
display_cult_name = cult_other
else:
display_cult_name = '기타'
if cult_name and cult_name != '기타 (위 선택지에 없을 경우)' and specific:
self._add_section_title(doc, f'[별첨3] 이단 상세 점검 ({display_cult_name}) (각 문항에 대해 예, 아니오 또는 필요시 서술형으로 답변해 주시면 됩니다)')
self._add_specific_cult_table(doc, specific, self.cult_questions)
# 기타의견
if specific.get('other_opinions'):
doc.add_paragraph('기타의견:')
doc.add_paragraph(specific.get('other_opinions', ''))
doc.add_paragraph('') # 빈 줄
# 5. 다섯 번째 단락: [별첨4] 간증문
self._add_section_title(doc, '[별첨4] 간증문 (상담 소감을 간략히 서술해 주시면 됩니다)')
testimony_content = testimony.get('content', '')
if testimony_content:
doc.add_paragraph(testimony_content)
else:
doc.add_paragraph('(간증문 없음)')
# 출력 파일명
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
name = basic_info.get('name', '무명')
output_filename = f'교리점검표_{name}_{timestamp}.docx'
output_path = os.path.join(self.output_dir, output_filename)
doc.save(output_path)
return output_path
def _add_section_title(self, doc, title_text):
"""섹션 제목을 굵은 글씨로 추가"""
para = doc.add_paragraph()
run = para.add_run(title_text)
run.bold = True
run.font.size = Pt(12)
def _add_methodist_table(self, doc, methodist_data):
"""감리교 신앙고백서 확인점검 표 추가"""
# 문항 목록
questions = [
'1. 우주 만물을 창조하시고 섭리하시며 주관하시는 거룩하시고 자비하시며 오직 한 분이신 아버지 하나님을 믿습니까?',
'2. 말씀이 육신이 되어 우리 가운데 오셔서 하나님의 나라를 선포하시고 십자가에 달려 죽으셨다가 부활승천 하심으로 대속자가 되시고 구세주가 되시는 예수 그리스도를 믿습니까?',
'3. 우리와 함께 계셔서 우리를 거듭나게 하시고 거룩하게 하시며 완전하게 하시며 위안과 힘이 되시는 성령을 믿습니까?',
'4. 성령의 감동으로 기록된 하나님의 말씀인 성경이 구원에 이르는 도리와 신앙생활에 충분한 표준이 됨을 믿습니까?',
'5. 하나님의 은혜로 믿음을 통해 죄사함을 받아 거룩해지며 하나님의 구원의 역사에 동참하도록 부름받음을 믿습니까?',
'6. 예배와 친교, 교육과 봉사, 전도와 선교를 위해 하나가 된 그리스도의 몸인 교회를 믿습니까?',
'7. 만민에게 복음을 전파함으로 하나님의 정의와 사랑을 나누고 평화의 세계를 이루는 모든 사람들이 하나님 앞에 형제됨을 믿습니까?',
'8. 예수 그리스도의 재림과 심판 우리 몸의 부활과 영생 그리고 의의 최후 승리와 영원한 하나님 나라를 믿습니까?'
]
# 표 생성 (2컬럼: 문항 | 응답)
table = doc.add_table(rows=1, cols=2)
table.style = 'Light Grid Accent 1'
# 헤더 행
header_cells = table.rows[0].cells
header_cells[0].text = '문항'
header_cells[1].text = '응답'
# 헤더 굵게
for cell in header_cells:
for paragraph in cell.paragraphs:
for run in paragraph.runs:
run.bold = True
# 데이터 행 추가
for i, question in enumerate(questions, 1):
key = f'q{i}_' + ['father_god', 'jesus_christ', 'holy_spirit', 'bible', 'salvation', 'church', 'mission', 'second_coming'][i-1]
answer = methodist_data.get(key, '')
row = table.add_row()
row.cells[0].text = question
row.cells[1].text = str(answer) if answer else ''
def _add_general_cult_table(self, doc, general_data):
"""이단 일반 점검 표 추가"""
# 문항 목록
questions = [
'1. 우리의 구원을 위해서 성경 이외의 가르침이 필요하다고 생각하십니까?',
'2. 어떤 특별한 성경 번역본만이 진리이고 다른 번역본에는 문제가 있다고 생각하십니까?',
'3. 성경의 진리 가운데 그동안 숨겨져 온 부분이 있고, 그 내용을 계시 받은 특별한 사람이 있다고 믿고 있습니까?',
'4. 성경을 해석하기 위해서 비유가 매우 중요하다고 생각하십니까? 비유를 깨닫기 위해서 별도의 성경공부가 필요하다고 생각하십니까?',
'5. 성경의 내용들 가운데 모든 것이 서로 짝이 있습니까?',
'6. 구세주 되시는 예수님은 모든 인류의 구원을 위해서 죽으셨는데 아직도 특별한 사람을 대리자로 세워서 구원사역을 이루실 필요가 있습니까?',
'7. 나는 죄인이라고 생각하십니까? 나의 구원은 확실하십니까? 그 이유는 무엇입니까?',
'8. 우리는 구원 받았을 때 회개했습니다. 그리고 이후에 다시 회개가 필요합니까?',
'9. 우리가 주일을 성수하는 것은 성경적입니까?',
'10. 안식일을 지키는 것이 구원의 조건입니까?',
'11. 성탄절은 예수님이 탄생한 날입니다. 12월 25일에 기념해도 되는 겁니까?',
'12. 예수 그리스도의 재림의 때가 구체적으로 언제인지 정해져 있다고 믿으십니까?',
'13. 성경에서 말하는 동방은 한국을 말하는 것이 맞습니까?',
'14. 당신의 종교적 신념을 지키는 것이 가정을 지키는 것보다 더 중요합니까?',
'15. 당신이 믿는 바를 전하고 사명을 감당하기 위해서 모략을 사용하는 것이 바람직합니까?',
'16. 주일성수, 새벽기도, 십일조 등 기존의 교회제도는 율법의 산물이기에 지킬 필요가 없다고 생각하십니까?',
'17. 사람이 질병에 걸리는 이유는 귀신의 영향 때문입니까?'
]
# 표 생성
table = doc.add_table(rows=1, cols=2)
table.style = 'Light Grid Accent 1'
# 헤더 행
header_cells = table.rows[0].cells
header_cells[0].text = '문항'
header_cells[1].text = '응답'
# 헤더 굵게
for cell in header_cells:
for paragraph in cell.paragraphs:
for run in paragraph.runs:
run.bold = True
# 데이터 행 추가
for i, question in enumerate(questions, 1):
key_map = {
1: 'q1_additional_teaching',
2: 'q2_special_bible',
3: 'q3_hidden_truth',
4: 'q4_parable',
5: 'q5_pairs',
6: 'q6_mediator',
7: 'q7_sin_salvation', # 기타의견란에 작성
8: 'q8_repentance',
9: 'q9_sunday',
10: 'q10_sabbath',
11: 'q11_christmas',
12: 'q12_second_coming_date',
13: 'q13_east',
14: 'q14_family',
15: 'q15_deception',
16: 'q16_church_system',
17: 'q17_disease'
}
key = key_map.get(i, f'q{i}')
answer = general_data.get(key, '')
# 7번은 기타의견란에 작성하므로 표에는 기타의견 참조로 표시
if i == 7:
answer = '(기타의견란 참조)' if general_data.get('other_opinions') else '(답변 없음)'
else:
answer = str(answer) if answer else ''
row = table.add_row()
row.cells[0].text = question
row.cells[1].text = answer
def _add_specific_cult_table(self, doc, specific_data, questions_list):
"""이단 상세 점검 표 추가"""
if not questions_list:
doc.add_paragraph('(이단 상세 점검 답변 없음)')
return
# 표 생성
table = doc.add_table(rows=1, cols=2)
table.style = 'Light Grid Accent 1'
# 헤더 행
header_cells = table.rows[0].cells
header_cells[0].text = '문항'
header_cells[1].text = '응답'
# 헤더 굵게
for cell in header_cells:
for paragraph in cell.paragraphs:
for run in paragraph.runs:
run.bold = True
# 문항 목록과 답변 매칭
q_index = 1 # 실제 답변 키 인덱스
for i, question in enumerate(questions_list, 1):
# 기타의견란에 작성하는 문항은 건너뛰기
if '기타의견란' in question or '기타의견' in question:
continue
key = f'q{q_index}'
answer = specific_data.get(key, '')
row = table.add_row()
# 문항 텍스트 그대로 사용 (번호 포함)
row.cells[0].text = question.strip()
row.cells[1].text = str(answer) if answer else ''
q_index += 1