This commit is contained in:
MarkLo 2025-11-26 18:44:47 +08:00
parent 85b2fffef3
commit c9e092202c
2 changed files with 25 additions and 62 deletions

View File

@ -33,69 +33,32 @@ class PDFGenerator:
# Ensure we have the absolute path to the current file
current_file = os.path.abspath(__file__)
# backend/app/services/pdf_generator.py -> backend/app/services -> backend/app -> backend -> root
root_dir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(current_file))))
# Try Noto Serif TC first (best Chinese support)
# Use static font instead of variable font for better ReportLab compatibility
noto_font_path = os.path.join(
root_dir,
'Cactus_Classical_Serif,Noto_Serif_TC',
'Noto_Serif_TC',
'static',
'NotoSerifTC-Regular.ttf' # Use static Regular instead of Variable font
)
print(f"Attempting to load Noto Serif TC from: {noto_font_path}")
if os.path.exists(noto_font_path):
try:
pdfmetrics.registerFont(TTFont('NotoSerifTC', noto_font_path))
self.custom_font = 'NotoSerifTC'
self.chinese_font = 'NotoSerifTC'
print(f"✅ Successfully registered Noto Serif TC font")
except Exception as e:
print(f"❌ Error registering Noto Serif TC: {e}")
else:
print(f"⚠️ Noto Serif TC font not found at {noto_font_path}")
# Try Cactus font as fallback
if not self.custom_font:
custom_font_path = os.path.join(
root_dir,
'Cactus_Classical_Serif',
'CactusClassicalSerif-Regular.ttf'
)
# CRITICAL FIX: Use system fonts for maximum compatibility
# Arial Unicode MS supports: Chinese, English, Math symbols, Emoji
# This avoids font file loading issues with ReportLab
try:
# Try to use Arial Unicode MS (best for all characters)
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
print(f"Attempting to load Cactus font from: {custom_font_path}")
if os.path.exists(custom_font_path):
try:
pdfmetrics.registerFont(TTFont('CactusClassicalSerif', custom_font_path))
self.custom_font = 'CactusClassicalSerif'
print(f"✅ Successfully registered Cactus Classical Serif font")
except Exception as e:
print(f"❌ Error registering custom font: {e}")
# macOS system font path
arial_unicode_path = '/System/Library/Fonts/Supplemental/Arial Unicode.ttf'
if os.path.exists(arial_unicode_path):
pdfmetrics.registerFont(TTFont('ArialUnicode', arial_unicode_path))
self.custom_font = 'ArialUnicode'
self.chinese_font = 'ArialUnicode'
print(f"✅ Successfully registered Arial Unicode MS (supports Chinese, English, Math, Emoji)")
else:
print(f"⚠️ Custom font file not found at {custom_font_path}")
# Try looking in current working directory as fallback
cwd_path = os.path.join(os.getcwd(), 'Cactus_Classical_Serif', 'CactusClassicalSerif-Regular.ttf')
if os.path.exists(cwd_path):
try:
pdfmetrics.registerFont(TTFont('CactusClassicalSerif', cwd_path))
self.custom_font = 'CactusClassicalSerif'
print(f"✅ Successfully registered Cactus Classical Serif font from CWD")
except Exception as e:
print(f"❌ Error registering custom font from CWD: {e}")
# Register Chinese font as fallback for CJK characters
if not self.custom_font:
# Use standard Helvetica if no custom fonts available
# Fallback: Use built-in Helvetica (limited Chinese support)
self.custom_font = 'Helvetica'
self.chinese_font = 'Helvetica'
print(f"⚠️ Using Helvetica (limited Chinese character support)")
except Exception as e:
print(f"❌ Font registration error: {e}")
self.custom_font = 'Helvetica'
self.chinese_font = 'Helvetica'
print("⚠️ Using Helvetica as fallback (limited Chinese support)")
elif not self.chinese_font:
self.chinese_font = self.custom_font
# Set primary font: use custom font if available, otherwise Chinese font
# Set primary font
self.primary_font = self.custom_font if self.custom_font else self.chinese_font
def generate_analyst_report_pdf(

View File

@ -43,7 +43,7 @@ def get_stock_news_openai(query, start_date, end_date):
}
],
temperature=0.5, # Reduced to 0.5 for maximum accuracy and consistency
max_output_tokens=4096,
max_output_tokens=8192, # Increased from 4096 to prevent truncation
top_p=1,
store=True,
)
@ -91,7 +91,7 @@ def get_global_news_openai(curr_date, look_back_days=7, limit=5):
}
],
temperature=0.5, # Reduced to 0.5 for maximum accuracy and consistency
max_output_tokens=4096,
max_output_tokens=8192, # Increased from 4096 to prevent truncation
top_p=1,
store=True,
)
@ -138,7 +138,7 @@ def get_fundamentals_openai(ticker, curr_date):
}
],
temperature=0.5, # Reduced to 0.5 for maximum accuracy and consistency
max_output_tokens=4096,
max_output_tokens=8192, # Increased from 4096 to prevent truncation
top_p=1,
store=True,
)