Merge remote-tracking branch 'origin/release/release_2.12' into release/release_2.12

This commit is contained in:
liaodanlong
2025-04-27 17:20:40 +08:00
2 changed files with 82 additions and 52 deletions

View File

@@ -129,23 +129,23 @@ class PrintingUtils(models.AbstractModel):
output_temp_path = '/tmp/output_temp.pdf' output_temp_path = '/tmp/output_temp.pdf'
try: try:
# 使用reportlab创建一个新的PDF
# 注册中文字体 # 注册中文字体
font_paths = [ font_paths = [
"c:/windows/fonts/simsun.ttc", # Windows系统宋体
"/usr/share/fonts/windows/simsun.ttc", # Windows系统宋体 "/usr/share/fonts/windows/simsun.ttc", # Windows系统宋体
"c:/windows/fonts/simsun.ttc", # Windows系统宋体另一个位置
"/usr/share/fonts/truetype/droid/DroidSansFallbackFull.ttf", # Linux Droid字体 "/usr/share/fonts/truetype/droid/DroidSansFallbackFull.ttf", # Linux Droid字体
"/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc", # 文泉驿正黑 "/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc", # 文泉驿正黑
"/usr/share/fonts/chinese/TrueType/simsun.ttc", # 某些Linux发行版位置 "/usr/share/fonts/chinese/TrueType/simsun.ttc", # 某些Linux发行版位置
"/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc", # Noto Sans CJK
] ]
font_found = False font_found = False
for font_path in font_paths: for font_path in font_paths:
if os.path.exists(font_path): if os.path.exists(font_path):
try: try:
# 注册两个字体,一个用于中文,一个用于数字
pdfmetrics.registerFont(TTFont('SimSun', font_path)) pdfmetrics.registerFont(TTFont('SimSun', font_path))
pdfmetrics.registerFont(TTFont('Arial', 'c:/windows/fonts/arial.ttf'))
font_found = True font_found = True
break break
except: except:
@@ -167,7 +167,7 @@ class PrintingUtils(models.AbstractModel):
# 设置字体 # 设置字体
if font_found: if font_found:
c.setFont('SimSun', 10) # 用于中文文本 c.setFont('SimSun', 10) # 增大字体大小到14pt
else: else:
# 如果没有找到中文字体,使用默认字体 # 如果没有找到中文字体,使用默认字体
c.setFont('Helvetica', 10) c.setFont('Helvetica', 10)
@@ -181,23 +181,11 @@ class PrintingUtils(models.AbstractModel):
if buttom_text: if buttom_text:
# 在二维码下方绘制文字 # 在二维码下方绘制文字
# 分离中文和数字 text = buttom_text
import re text_width = c.stringWidth(text, "SimSun" if font_found else "Helvetica", 10) # 准确计算文字宽度
text_parts = re.split('(\d+)', buttom_text) text_x = page_width - qr_size - margin + (qr_size - text_width) / 2 # 文字居中对齐
text_x = page_width - qr_size - margin + (qr_size - c.stringWidth(buttom_text, "SimSun", 10)) / 2 text_y = margin + 20 # 文字位置靠近底部
text_y = margin + 20 c.drawString(text_x, text_y, text)
current_x = text_x
for part in text_parts:
if part: # 跳过空字符串
if part.isdigit():
c.setFont('Arial', 10) # 数字使用Arial字体
current_font = 'Arial'
else:
c.setFont('SimSun', 10) # 中文使用宋体
current_font = 'SimSun'
c.drawString(current_x, text_y, part)
current_x += c.stringWidth(part, current_font, 10)
c.save() c.save()

View File

@@ -261,8 +261,50 @@ def transfer_files(
target_path = f"{target_dir}/{relative_path}/{item}" target_path = f"{target_dir}/{relative_path}/{item}"
else: else:
target_path = f"{target_dir}/{item}" target_path = f"{target_dir}/{item}"
# 规范化路径
target_path = target_path.replace('\\', '/').strip('/')
# 确保目标目录存在
target_dir_path = '/'.join(target_path.split('/')[:-1])
try:
target_ftp.ftp.cwd('/') # 回到根目录
for dir_part in target_dir_path.split('/'):
if dir_part:
try:
target_ftp.ftp.cwd(dir_part)
except:
try:
target_ftp.ftp.mkd(dir_part)
target_ftp.ftp.cwd(dir_part)
except Exception as e:
logging.error(f"创建目录失败 {dir_part}: {str(e)}")
raise
except Exception as e:
logging.error(f"处理目标目录失败: {str(e)}")
raise
# 检查FTP连接状态
try:
target_ftp.ftp.voidcmd('NOOP')
except:
logging.error("FTP连接已断开尝试重新连接")
target_ftp.ftp.connect(target_ftp_info['host'], target_ftp_info['port'])
target_ftp.ftp.login(target_ftp_info['username'], target_ftp_info['password'])
# 上传文件
try:
with open(temp_path, 'rb') as f: with open(temp_path, 'rb') as f:
# 检查文件是否可读
content = f.read()
if not content:
raise Exception("临时文件为空")
f.seek(0) # 重置文件指针
target_ftp.ftp.storbinary(f'STOR {target_path}', f) target_ftp.ftp.storbinary(f'STOR {target_path}', f)
except Exception as e:
logging.error(f"上传文件失败: {str(e)}")
logging.error(f"目标路径: {target_path}")
raise
transfered_file_list.append(item) transfered_file_list.append(item)
# 删除临时文件 # 删除临时文件
@@ -270,37 +312,37 @@ def transfer_files(
logging.info(f"已传输文件: {item}") logging.info(f"已传输文件: {item}")
# 清空目标目录下的所有内容 # 清空目标目录下的所有内容
try: # try:
target_ftp.ftp.cwd(target_dir) # target_ftp.ftp.cwd(target_dir)
files = target_ftp.ftp.nlst() # files = target_ftp.ftp.nlst()
for f in files: # for f in files:
try: # try:
# 尝试删除文件 # # 尝试删除文件
target_ftp.ftp.delete(f) # target_ftp.ftp.delete(f)
except: # except:
try: # try:
# 如果删除失败,可能是目录,递归删除目录 # # 如果删除失败,可能是目录,递归删除目录
def remove_dir(path): # def remove_dir(path):
target_ftp.ftp.cwd(path) # target_ftp.ftp.cwd(path)
sub_files = target_ftp.ftp.nlst() # sub_files = target_ftp.ftp.nlst()
for sf in sub_files: # for sf in sub_files:
try: # try:
target_ftp.ftp.delete(sf) # target_ftp.ftp.delete(sf)
except: # except:
remove_dir(f"{path}/{sf}") # remove_dir(f"{path}/{sf}")
target_ftp.ftp.cwd('..') # target_ftp.ftp.cwd('..')
target_ftp.ftp.rmd(path) # target_ftp.ftp.rmd(path)
remove_dir(f"{target_dir}/{f}") # remove_dir(f"{target_dir}/{f}")
except: # except:
logging.error(f"无法删除 {f}") # logging.error(f"无法删除 {f}")
pass # pass
logging.info(f"已清空目标目录 {target_dir}") # logging.info(f"已清空目标目录 {target_dir}")
except Exception as e: # except Exception as e:
logging.error(f"清空目标目录失败: {str(e)}") # logging.error(f"清空目标目录失败: {str(e)}")
raise Exception(f"清空目标目录失败: {str(e)}") # raise Exception(f"清空目标目录失败: {str(e)}")
# 开始遍历 # 开始遍历
traverse_dir(source_dir) traverse_dir(source_dir)