diff --git a/backend/app/services/pdf_generator.py b/backend/app/services/pdf_generator.py
index 376e0322..ef22afec 100644
--- a/backend/app/services/pdf_generator.py
+++ b/backend/app/services/pdf_generator.py
@@ -330,8 +330,9 @@ class PDFGenerator:
text = re.sub(r'```[^`]*?```', '', text, flags=re.DOTALL)
text = re.sub(r'`([^`]+?)`', r'\1', text)
- # 5. Clean up bullet points
- text = re.sub(r'^\s*[\*\-\+]\s+', '• ', text, flags=re.MULTILINE)
+ # 5. Clean up bullet points - USE ASCII DASH, NOT UNICODE BULLET
+ # Unicode bullet • (U+2022) renders as '煉' in STSong-Light font!
+ text = re.sub(r'^\s*[\*\-\+]\s+', '- ', text, flags=re.MULTILINE)
# 6. Remove horizontal rules
text = re.sub(r'^[\-\*_]{3,}\s*$', '', text, flags=re.MULTILINE)
diff --git a/frontend/app/page.tsx b/frontend/app/page.tsx
index fcde07f6..55e26597 100644
--- a/frontend/app/page.tsx
+++ b/frontend/app/page.tsx
@@ -330,6 +330,22 @@ export default function HomePage() {
/>
+
+ {/* Call to Action Section */}
+
+
準備好開始智能交易分析了嗎?
+
+ 立即體驗 12 位專業 AI 代理協同工作,為您提供全方位的股票分析報告
+
+
+
+
+
);
}
diff --git a/safe_emoji_mapping.py b/safe_emoji_mapping.py
deleted file mode 100644
index ca1a4e0b..00000000
--- a/safe_emoji_mapping.py
+++ /dev/null
@@ -1,93 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-"""
-最簡單的解決方案:完全移除可能導致問題的 Unicode 符號
-改用最安全的 ASCII 和基本中文字符
-"""
-
-# 問題分析:
-# STSong-Light 對某些 Unicode 符號的支持不完整
-# 可能將某些符號(如 ★ ※ ◈ 等)錯誤渲染為「煉」
-
-# 解決方案:
-# 1. 完全移除這些 Unicode 符號
-# 2. 改用 ASCII 字符或簡單的中文文字
-# 3. 如果必須使用符號,只使用最基本的 ASCII 符號
-
-SAFE_EMOJI_MAPPING = {
- # Status - 使用 ASCII
- '✅': '[OK]',
- '❌': '[X]',
- '⚠️': '[!]',
- '⚡': '*',
- '🔔': 'o',
-
- # Rating - 使用 ASCII
- '⭐': '*',
- '🌟': '*',
- '💎': '+',
- '🏆': '#',
-
- # Charts - 使用簡單文字
- '📊': '', # 完全移除
- '📈': '^', # 向上
- '📉': 'v', # 向下
- '📋': '-',
- '📌': '*',
-
- # Money - 保留貨幣符號(這些是安全的)
- '💰': '$',
- '💵': '$',
- '💴': 'Y', # 改用 ASCII Y 代替 ¥
- '💶': 'E', # 改用 ASCII E 代替 €
- '💷': 'P', # 改用 ASCII P 代替 £
- '💸': '$',
- '💹': '^',
-
- # Direction - 使用 ASCII
- '🚀': '^^',
- '⬆️': '^',
- '⬇️': 'v',
- '➡️': '>',
- '⬅️': '<',
- '🔼': '^',
- '🔽': 'v',
-
- # Symbols - 純 ASCII
- '🎯': 'o',
- '🔥': '*',
- '💡': '*',
- '⚙️': '*',
- '🔧': '>',
- '🔨': '>',
-
- # Tech - 全部移除或改 ASCII
- '🤖': '',
- '💻': '',
- '📱': '',
- '🖥️': '',
-
- # People - 全部移除
- '👤': '',
- '👥': '',
- '🔬': '',
- '📚': '',
-
- # Time - 純 ASCII
- '⏰': 'o',
- '📅': '-',
- '⏱️': 'o',
-
- # Other - 純 ASCII 或移除
- '✨': '*',
- '🎨': '',
- '📝': '-',
- '📄': '-',
- '🗂️': '=',
- '🌐': 'o',
- '🔗': '~',
- '💼': '',
-}
-
-print("安全的 Emoji 映射(只使用 ASCII 和基本字符):")
-print(SAFE_EMOJI_MAPPING)
diff --git a/test_ascii_pdf.py b/test_ascii_pdf.py
deleted file mode 100644
index 63b8f5a8..00000000
--- a/test_ascii_pdf.py
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-import sys
-sys.path.insert(0, '/Users/yaolo/Desktop/TradingAgentsX')
-
-from backend.app.services.pdf_generator import PDFGenerator
-
-# 測試包含各種符號的內容
-test_content = '''# 測試報告
-
-## 市場分析
-- 上漲趨勢 ^
-- 技術指標 *
-- 支撐位 o
-
-## 風險評估
-- 警告標記 [!]
-- 確認標記 [OK]
-- 否定標記 [X]
-
-## 結論
-純文字和 ASCII 符號測試,不應該出現「煉」字
-'''
-
-pdf_gen = PDFGenerator()
-pdf_bytes = pdf_gen.generate_analyst_report_pdf(
- analyst_name='ASCII 符號測試',
- ticker='TEST',
- analysis_date='2025-11-27',
- report_content=test_content
-)
-
-with open('/tmp/test_ascii_only.pdf', 'wb') as f:
- f.write(pdf_bytes)
-
-print('✓ 已生成測試 PDF: /tmp/test_ascii_only.pdf')
-print('請檢查 PDF 中是否還有「煉」字出現')
-print('如果沒有「煉」,說明 ASCII-only 方案成功解決問題')
diff --git a/test_symbol_rendering.py b/test_symbol_rendering.py
deleted file mode 100644
index e4e356c0..00000000
--- a/test_symbol_rendering.py
+++ /dev/null
@@ -1,56 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-"""
-測試找出哪個字符在 STSong-Light 中被渲染為「煉」
-"""
-import sys
-sys.path.insert(0, '/Users/yaolo/Desktop/TradingAgentsX')
-
-from backend.app.services.pdf_generator import PDFGenerator
-import io
-
-# 測試內容 - 包含我們使用的所有符號
-test_symbols = {
- '星號': '★',
- '菱形': '◆',
- '方塊': '▓',
- '小方': '▪',
- '雙菱': '◈',
- '空菱': '◇',
- '雙圓': '◎',
- '米字': '※',
- '時鐘': '◷',
- '點': '‧',
- '無限': '∞',
- '粗方': '▣',
- '對號': '✓',
- '叉號': '✗',
- '警告': '⚠',
- '閃電': '⚡',
-}
-
-print("測試每個符號在 PDF 中的渲染...\n")
-
-pdf_gen = PDFGenerator()
-
-for name, symbol in test_symbols.items():
- test_content = f"測試{name}符號: {symbol}"
-
- try:
- pdf_bytes = pdf_gen.generate_analyst_report_pdf(
- analyst_name=f"測試: {symbol}",
- ticker="TEST",
- analysis_date="2025-11-27",
- report_content=test_content
- )
-
- # 保存測試 PDF
- filename = f"/tmp/test_symbol_{name}.pdf"
- with open(filename, 'wb') as f:
- f.write(pdf_bytes)
-
- print(f"✓ {name} ({symbol}) - U+{ord(symbol):04X} - 已生成: {filename}")
- except Exception as e:
- print(f"✗ {name} ({symbol}) - 錯誤: {e}")
-
-print("\n請手動檢查 /tmp/test_symbol_*.pdf 文件,看看哪個符號顯示為「煉」")