ginipick commited on
Commit
0d4954e
ยท
verified ยท
1 Parent(s): 400ea45

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +54 -72
app.py CHANGED
@@ -971,81 +971,67 @@ async def convert_text_to_pdf(text_content: str, title: str) -> str:
971
  # ์˜๊ตฌ ์ €์žฅ์†Œ์˜ ํŒŒ์ผ ๊ฒฝ๋กœ
972
  file_path = PERMANENT_PDF_DIR / filename
973
 
974
- # ํฐํŠธ ์„ค์ • (ํ•œ๊ธ€ ์ง€์› ํฐํŠธ)
975
- from reportlab.pdfbase import pdfmetrics
976
- from reportlab.pdfbase.ttfonts import TTFont
977
 
978
- # ํฐํŠธ ๋””๋ ‰ํ† ๋ฆฌ ์„ค์ •
979
- FONT_DIR = BASE / "fonts"
980
- if not FONT_DIR.exists():
981
- FONT_DIR.mkdir(parents=True)
982
-
983
- # ๊ธฐ๋ณธ ํ•œ๊ธ€ ํฐํŠธ ํŒŒ์ผ ๊ฒฝ๋กœ
984
- default_font_path = FONT_DIR / "NanumGothic.ttf"
985
-
986
- # ํฐํŠธ ํŒŒ์ผ์ด ์—†์œผ๋ฉด ๋‹ค์šด๋กœ๋“œ
987
- if not default_font_path.exists():
988
- import urllib.request
989
- try:
990
- # ๋‚˜๋ˆ”๊ณ ๋”• ํฐํŠธ ๋‹ค์šด๋กœ๋“œ (Google Fonts์—์„œ)
991
- font_url = "https://fonts.gstatic.com/s/nanumgothic/v21/PN_3Rfi-oW3hYwmKDpxS7F_z-7rJxHVIsPV5MbNO2rV2_va-Nv6p.ttf"
992
- urllib.request.urlretrieve(font_url, str(default_font_path))
993
- logger.info(f"ํ•œ๊ธ€ ํฐํŠธ ๋‹ค์šด๋กœ๋“œ ์™„๋ฃŒ: {default_font_path}")
994
- except Exception as e:
995
- logger.error(f"ํฐํŠธ ๋‹ค์šด๋กœ๋“œ ์‹คํŒจ: {e}")
996
- # ํฐํŠธ ๋‹ค์šด๋กœ๋“œ ์‹คํŒจ ์‹œ ๊ธฐ๋ณธ ํฐํŠธ ์‚ฌ์šฉ
997
- default_font_path = None
998
-
999
- # ํฐํŠธ ๋“ฑ๋ก
1000
- font_name = "NanumGothic"
1001
- if default_font_path and default_font_path.exists():
1002
- pdfmetrics.registerFont(TTFont(font_name, str(default_font_path)))
1003
- else:
1004
- # ๊ธฐ๋ณธ ํฐํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ Helvetica ์‚ฌ์šฉ
1005
- font_name = "Helvetica"
1006
- logger.warning("ํ•œ๊ธ€ ํฐํŠธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์–ด ๊ธฐ๋ณธ ํฐํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•œ๊ธ€์ด ์ œ๋Œ€๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.")
1007
-
1008
- # ์ž„์‹œ PDF ํŒŒ์ผ ์ƒ์„ฑ
1009
- pdf_buffer = io.BytesIO()
1010
- doc = SimpleDocTemplate(pdf_buffer, pagesize=letter, encoding='utf-8')
1011
- styles = getSampleStyleSheet()
1012
-
1013
- # ์Šคํƒ€์ผ ์„ค์ • - ํ•œ๊ธ€ ํฐํŠธ ์ ์šฉ
1014
- styles['Title'].fontName = font_name
1015
- styles['Normal'].fontName = font_name
1016
 
1017
- # ๋‚ด์šฉ์„ ๋ฌธ๋‹จ์œผ๋กœ ๋ถ„ํ• 
1018
- content = []
1019
 
1020
  # ์ œ๋ชฉ ์ถ”๊ฐ€
1021
- title_style = styles['Title']
1022
- content.append(Paragraph(title, title_style))
1023
- content.append(Spacer(1, 12))
1024
 
1025
- # ๋ณธ๋ฌธ ํ…์ŠคํŠธ ์Šคํƒ€์ผ
1026
- normal_style = styles['Normal']
 
 
1027
 
1028
- # ํ…์ŠคํŠธ๋ฅผ ๋‹จ๋ฝ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์ถ”๊ฐ€
1029
  paragraphs = text_content.split('\n\n')
1030
- for para in paragraphs:
1031
- if para.strip():
1032
- # XML ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌ
1033
- from xml.sax.saxutils import escape
1034
- safe_para = escape(para.replace('\n', '<br/>'))
1035
- p = Paragraph(safe_para, normal_style)
1036
- content.append(p)
1037
- content.append(Spacer(1, 10))
1038
 
1039
- # PDF ์ƒ์„ฑ
1040
- doc.build(content)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1041
 
1042
- # ํŒŒ์ผ๋กœ ์ €์žฅ
1043
- with open(file_path, 'wb') as f:
1044
- f.write(pdf_buffer.getvalue())
1045
 
1046
  # ๋ฉ”์ธ ๋””๋ ‰ํ† ๋ฆฌ์—๋„ ๋ณต์‚ฌ
1047
- with open(PDF_DIR / filename, 'wb') as f:
1048
- f.write(pdf_buffer.getvalue())
1049
 
1050
  # PDF ID ์ƒ์„ฑ ๋ฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ €์žฅ
1051
  pdf_id = generate_pdf_id(filename)
@@ -1067,14 +1053,10 @@ async def convert_text_to_pdf(text_content: str, title: str) -> str:
1067
 
1068
  # AI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…์ŠคํŠธ๋ฅผ ๋” ๊ตฌ์กฐํ™”๋œ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜
1069
  async def enhance_text_with_ai(text_content: str, title: str) -> str:
1070
- try:
1071
- # API ํ‚ค๊ฐ€ ์—†๊ฑฐ๋‚˜ ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์›๋ณธ ํ…์ŠคํŠธ ๋ฐ˜ํ™˜
1072
- if not HAS_VALID_API_KEY or not openai_client:
1073
- return text_content
1074
-
1075
- # ํ…์ŠคํŠธ๊ฐ€ ์งง์€ ๊ฒฝ์šฐ ์›๋ณธ ๋ฐ˜ํ™˜
1076
- if len(text_content) < 100:
1077
- return text_content
1078
 
1079
  # ์ปจํ…์ŠคํŠธ ํฌ๊ธฐ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ํ…์ŠคํŠธ๊ฐ€ ๋„ˆ๋ฌด ๊ธธ๋ฉด ์•ž๋ถ€๋ถ„๋งŒ ์‚ฌ์šฉ
1080
  max_context_length = 60000
 
971
  # ์˜๊ตฌ ์ €์žฅ์†Œ์˜ ํŒŒ์ผ ๊ฒฝ๋กœ
972
  file_path = PERMANENT_PDF_DIR / filename
973
 
974
+ # ๊ธฐ๋ณธ Helvetica ํฐํŠธ ์‚ฌ์šฉ (ํ•œ๊ธ€ ์ง€์› ์—†์Œ)
975
+ from reportlab.lib.pagesizes import letter
976
+ from reportlab.pdfgen import canvas
977
 
978
+ # PDF ์ƒ์„ฑ
979
+ c = canvas.Canvas(str(file_path), pagesize=letter)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
980
 
981
+ # ํŽ˜์ด์ง€ ํฌ๊ธฐ ์„ค์ •
982
+ page_width, page_height = letter
983
 
984
  # ์ œ๋ชฉ ์ถ”๊ฐ€
985
+ c.setFont("Helvetica-Bold", 16)
986
+ c.drawCentredString(page_width/2, page_height - 50, title)
 
987
 
988
+ # ๋ณธ๋ฌธ ํ…์ŠคํŠธ ์ถ”๊ฐ€
989
+ c.setFont("Helvetica", 11)
990
+ y_position = page_height - 100
991
+ line_height = 14
992
 
993
+ # ํ…์ŠคํŠธ๋ฅผ ๋‹จ๋ฝ์œผ๋กœ ๋ถ„๋ฆฌ
994
  paragraphs = text_content.split('\n\n')
 
 
 
 
 
 
 
 
995
 
996
+ for para in paragraphs:
997
+ if not para.strip():
998
+ continue
999
+
1000
+ # ๋‹จ๋ฝ ๋‚ด ์ค„ ๋ฐ”๊ฟˆ ์ฒ˜๋ฆฌ
1001
+ lines = para.split('\n')
1002
+ for line in lines:
1003
+ # ํ•œ ์ค„์˜ ์ตœ๋Œ€ ๋ฌธ์ž ์ˆ˜
1004
+ max_chars_per_line = 80
1005
+
1006
+ # ๊ธด ์ค„ ๊ฐ์‹ธ๊ธฐ
1007
+ import textwrap
1008
+ wrapped_lines = textwrap.wrap(line, width=max_chars_per_line)
1009
+
1010
+ for wrapped_line in wrapped_lines:
1011
+ # ํŽ˜์ด์ง€ ๋ฐ”๊ฟˆ ํ™•์ธ
1012
+ if y_position < 50:
1013
+ c.showPage()
1014
+ c.setFont("Helvetica", 11)
1015
+ y_position = page_height - 50
1016
+
1017
+ try:
1018
+ # ASCII ๋ฌธ์ž๋งŒ ์ฒ˜๋ฆฌ
1019
+ ascii_line = ''.join(c if ord(c) < 128 else ' ' for c in wrapped_line)
1020
+ c.drawString(50, y_position, ascii_line)
1021
+ except:
1022
+ # ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ๊ณต๋ฐฑ์œผ๋กœ ๋Œ€์ฒด
1023
+ c.drawString(50, y_position, "[ํ…์ŠคํŠธ ๋ณ€ํ™˜ ์˜ค๋ฅ˜]")
1024
+
1025
+ y_position -= line_height
1026
+
1027
+ # ๋‹จ๋ฝ ๊ฐ„ ๊ฐ„๊ฒฉ
1028
+ y_position -= 10
1029
 
1030
+ # PDF ์ €์žฅ
1031
+ c.save()
 
1032
 
1033
  # ๋ฉ”์ธ ๋””๋ ‰ํ† ๋ฆฌ์—๋„ ๋ณต์‚ฌ
1034
+ shutil.copy2(file_path, PDF_DIR / filename)
 
1035
 
1036
  # PDF ID ์ƒ์„ฑ ๋ฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ €์žฅ
1037
  pdf_id = generate_pdf_id(filename)
 
1053
 
1054
  # AI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…์ŠคํŠธ๋ฅผ ๋” ๊ตฌ์กฐํ™”๋œ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜
1055
  async def enhance_text_with_ai(text_content: str, title: str) -> str:
1056
+ # OpenAI ํ–ฅ์ƒ ๊ธฐ๋Šฅ ์ œ๊ฑฐ - ์›๋ณธ ํ…์ŠคํŠธ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜
1057
+ return text_content
1058
+
1059
+
 
 
 
 
1060
 
1061
  # ์ปจํ…์ŠคํŠธ ํฌ๊ธฐ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ํ…์ŠคํŠธ๊ฐ€ ๋„ˆ๋ฌด ๊ธธ๋ฉด ์•ž๋ถ€๋ถ„๋งŒ ์‚ฌ์šฉ
1062
  max_context_length = 60000