First commit
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
"""CJK font registration helper for reportlab using WenQuanYi Micro Hei TTF."""
|
||||
|
||||
from reportlab.pdfbase import pdfmetrics
|
||||
from reportlab.pdfbase.ttfonts import TTFont
|
||||
|
||||
_REGISTERED = False
|
||||
CJK_FONT = "Helvetica" # fallback
|
||||
|
||||
|
||||
def register_cjk_font():
|
||||
"""Register a CJK font with reportlab. Returns the font name to use."""
|
||||
global _REGISTERED, CJK_FONT
|
||||
if _REGISTERED:
|
||||
return CJK_FONT
|
||||
|
||||
# WenQuanYi Micro Hei: TTC with TrueType outlines (reportlab compatible)
|
||||
# subfontIndex 0 = regular
|
||||
candidates = [
|
||||
"/usr/share/fonts/wenquanyi/wqy-microhei/wqy-microhei.ttc",
|
||||
"/usr/share/fonts/wqy-microhei/wqy-microhei.ttc",
|
||||
]
|
||||
|
||||
for path in candidates:
|
||||
try:
|
||||
pdfmetrics.registerFont(TTFont("WenQuanYi", path, subfontIndex=0))
|
||||
CJK_FONT = "WenQuanYi"
|
||||
_REGISTERED = True
|
||||
return CJK_FONT
|
||||
except Exception:
|
||||
continue
|
||||
|
||||
print("WARNING: No CJK font available, Chinese text may not render correctly")
|
||||
_REGISTERED = True
|
||||
return CJK_FONT
|
||||
|
||||
|
||||
def _has_cjk(text: str) -> bool:
|
||||
"""Check if text contains CJK characters."""
|
||||
for ch in text:
|
||||
cp = ord(ch)
|
||||
if (
|
||||
0x4E00 <= cp <= 0x9FFF # CJK Unified Ideographs
|
||||
or 0x3400 <= cp <= 0x4DBF # CJK Extension A
|
||||
or 0x3000 <= cp <= 0x303F # CJK Symbols
|
||||
or 0xFF00 <= cp <= 0xFFEF # Fullwidth Forms
|
||||
or 0x2E80 <= cp <= 0x2EFF # CJK Radicals
|
||||
or 0xF900 <= cp <= 0xFAFF # CJK Compatibility
|
||||
):
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def draw_cjk_text(c, x, y, text, font_name="Helvetica", font_size=10):
|
||||
"""Draw text, switching to CJK font if needed."""
|
||||
cjk_font = register_cjk_font()
|
||||
if _has_cjk(text) and cjk_font != "Helvetica":
|
||||
c.setFont(cjk_font, font_size)
|
||||
else:
|
||||
c.setFont(font_name, font_size)
|
||||
c.drawString(x, y, text)
|
||||
Reference in New Issue
Block a user