Merge remote-tracking branch 'origin/release/release_2.12' into release/release_2.12
This commit is contained in:
@@ -129,23 +129,23 @@ class PrintingUtils(models.AbstractModel):
|
||||
output_temp_path = '/tmp/output_temp.pdf'
|
||||
|
||||
try:
|
||||
# 使用reportlab创建一个新的PDF
|
||||
|
||||
|
||||
# 注册中文字体
|
||||
font_paths = [
|
||||
"c:/windows/fonts/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/wqy/wqy-zenhei.ttc", # 文泉驿正黑
|
||||
"/usr/share/fonts/chinese/TrueType/simsun.ttc", # 某些Linux发行版位置
|
||||
"/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc", # Noto Sans CJK
|
||||
]
|
||||
|
||||
font_found = False
|
||||
for font_path in font_paths:
|
||||
if os.path.exists(font_path):
|
||||
try:
|
||||
# 注册两个字体,一个用于中文,一个用于数字
|
||||
pdfmetrics.registerFont(TTFont('SimSun', font_path))
|
||||
pdfmetrics.registerFont(TTFont('Arial', 'c:/windows/fonts/arial.ttf'))
|
||||
font_found = True
|
||||
break
|
||||
except:
|
||||
@@ -167,7 +167,7 @@ class PrintingUtils(models.AbstractModel):
|
||||
|
||||
# 设置字体
|
||||
if font_found:
|
||||
c.setFont('SimSun', 10) # 用于中文文本
|
||||
c.setFont('SimSun', 10) # 增大字体大小到14pt
|
||||
else:
|
||||
# 如果没有找到中文字体,使用默认字体
|
||||
c.setFont('Helvetica', 10)
|
||||
@@ -181,23 +181,11 @@ class PrintingUtils(models.AbstractModel):
|
||||
|
||||
if buttom_text:
|
||||
# 在二维码下方绘制文字
|
||||
# 分离中文和数字
|
||||
import re
|
||||
text_parts = re.split('(\d+)', buttom_text)
|
||||
text_x = page_width - qr_size - margin + (qr_size - c.stringWidth(buttom_text, "SimSun", 10)) / 2
|
||||
text_y = margin + 20
|
||||
|
||||
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)
|
||||
text = buttom_text
|
||||
text_width = c.stringWidth(text, "SimSun" if font_found else "Helvetica", 10) # 准确计算文字宽度
|
||||
text_x = page_width - qr_size - margin + (qr_size - text_width) / 2 # 文字居中对齐
|
||||
text_y = margin + 20 # 文字位置靠近底部
|
||||
c.drawString(text_x, text_y, text)
|
||||
|
||||
c.save()
|
||||
|
||||
|
||||
@@ -261,8 +261,50 @@ def transfer_files(
|
||||
target_path = f"{target_dir}/{relative_path}/{item}"
|
||||
else:
|
||||
target_path = f"{target_dir}/{item}"
|
||||
with open(temp_path, 'rb') as f:
|
||||
target_ftp.ftp.storbinary(f'STOR {target_path}', f)
|
||||
|
||||
# 规范化路径
|
||||
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:
|
||||
# 检查文件是否可读
|
||||
content = f.read()
|
||||
if not content:
|
||||
raise Exception("临时文件为空")
|
||||
f.seek(0) # 重置文件指针
|
||||
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)
|
||||
# 删除临时文件
|
||||
@@ -270,37 +312,37 @@ def transfer_files(
|
||||
logging.info(f"已传输文件: {item}")
|
||||
|
||||
# 清空目标目录下的所有内容
|
||||
try:
|
||||
target_ftp.ftp.cwd(target_dir)
|
||||
files = target_ftp.ftp.nlst()
|
||||
# try:
|
||||
# target_ftp.ftp.cwd(target_dir)
|
||||
# files = target_ftp.ftp.nlst()
|
||||
|
||||
for f in files:
|
||||
try:
|
||||
# 尝试删除文件
|
||||
target_ftp.ftp.delete(f)
|
||||
except:
|
||||
try:
|
||||
# 如果删除失败,可能是目录,递归删除目录
|
||||
def remove_dir(path):
|
||||
target_ftp.ftp.cwd(path)
|
||||
sub_files = target_ftp.ftp.nlst()
|
||||
for sf in sub_files:
|
||||
try:
|
||||
target_ftp.ftp.delete(sf)
|
||||
except:
|
||||
remove_dir(f"{path}/{sf}")
|
||||
target_ftp.ftp.cwd('..')
|
||||
target_ftp.ftp.rmd(path)
|
||||
# for f in files:
|
||||
# try:
|
||||
# # 尝试删除文件
|
||||
# target_ftp.ftp.delete(f)
|
||||
# except:
|
||||
# try:
|
||||
# # 如果删除失败,可能是目录,递归删除目录
|
||||
# def remove_dir(path):
|
||||
# target_ftp.ftp.cwd(path)
|
||||
# sub_files = target_ftp.ftp.nlst()
|
||||
# for sf in sub_files:
|
||||
# try:
|
||||
# target_ftp.ftp.delete(sf)
|
||||
# except:
|
||||
# remove_dir(f"{path}/{sf}")
|
||||
# target_ftp.ftp.cwd('..')
|
||||
# target_ftp.ftp.rmd(path)
|
||||
|
||||
remove_dir(f"{target_dir}/{f}")
|
||||
except:
|
||||
logging.error(f"无法删除 {f}")
|
||||
pass
|
||||
# remove_dir(f"{target_dir}/{f}")
|
||||
# except:
|
||||
# logging.error(f"无法删除 {f}")
|
||||
# pass
|
||||
|
||||
logging.info(f"已清空目标目录 {target_dir}")
|
||||
except Exception as e:
|
||||
logging.error(f"清空目标目录失败: {str(e)}")
|
||||
raise Exception(f"清空目标目录失败: {str(e)}")
|
||||
# logging.info(f"已清空目标目录 {target_dir}")
|
||||
# except Exception as e:
|
||||
# logging.error(f"清空目标目录失败: {str(e)}")
|
||||
# raise Exception(f"清空目标目录失败: {str(e)}")
|
||||
|
||||
# 开始遍历
|
||||
traverse_dir(source_dir)
|
||||
|
||||
Reference in New Issue
Block a user