2021-11-19 14:38:49 +08:00
|
|
|
|
from reportlab.lib.colors import HexColor
|
|
|
|
|
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_RIGHT
|
|
|
|
|
from reportlab.pdfbase import pdfmetrics
|
|
|
|
|
from reportlab.pdfbase.ttfonts import TTFont
|
|
|
|
|
from reportlab.lib.styles import ParagraphStyle as PS
|
|
|
|
|
from reportlab.platypus import TableStyle
|
|
|
|
|
from reportlab.lib import colors
|
|
|
|
|
|
|
|
|
|
import pandas as pd
|
|
|
|
|
import numpy as np
|
|
|
|
|
|
2021-12-07 15:28:49 +08:00
|
|
|
|
from Report.path_tool import get_font_path
|
2021-11-19 14:38:49 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# rgb
|
|
|
|
|
darkGolden = '#C8A063'
|
|
|
|
|
lightGrey = '#F4F2EF'
|
|
|
|
|
darkGrey = '#A1A8AB'
|
|
|
|
|
Seashell4 = '#8B8682'
|
|
|
|
|
|
|
|
|
|
# font
|
|
|
|
|
pdfmetrics.registerFont(TTFont('pingbold', get_font_path(font='PingBold.ttf')))
|
|
|
|
|
pdfmetrics.registerFont(TTFont('SimHei', get_font_path(font='simhei.ttf')))
|
|
|
|
|
|
|
|
|
|
# toc
|
|
|
|
|
toc_style_1 = PS(name='TOCHeading1', fontName='pingbold', fontSize=16, leftIndent=20, firstLineIndent=-20, spaceBefore=10, leading=16)
|
|
|
|
|
toc_style_2 = PS(name='TOCHeading2', fontName='pingbold', fontSize=12, leftIndent=40, firstLineIndent=-20, spaceBefore=5, leading=12)
|
|
|
|
|
|
|
|
|
|
# table of content
|
|
|
|
|
table_content_style = PS(name="table_content_style", fontName="pingbold", fontSize=18, leading=40, alignment=TA_CENTER)
|
|
|
|
|
|
|
|
|
|
# cover
|
|
|
|
|
cover_space = PS(name='cover_space', fontSize=0, leading=75, alignment=TA_CENTER)
|
|
|
|
|
cover_company_style = PS(name="cover_company_style", fontName="pingbold", fontSize=30, leading=60, alignment=TA_CENTER)
|
|
|
|
|
cover_report_style = PS(name="cover_report_style", fontName="pingbold", fontSize=18, leading=400, alignment=TA_CENTER)
|
|
|
|
|
cover_fecr_style = PS(name="cover_fecr_style", fontName="pingbold", fontSize=18, leading=20, alignment=TA_CENTER)
|
|
|
|
|
cover_time_style = PS(name="cover_time_style", fontName="pingbold", fontSize=16, leading=40, alignment=TA_CENTER, spaceBefore=20)
|
|
|
|
|
|
|
|
|
|
# chapter & section
|
|
|
|
|
chapter_style = PS(name="chapter_style", fontName="pingbold", fontSize=18, leading=40, alignment=TA_LEFT, spaceBefore=6)
|
|
|
|
|
section_style = PS(name="section_style", fontName="pingbold", fontSize=12, leading=30, alignment=TA_LEFT, spaceBefore=6, textColor=HexColor(darkGolden))
|
|
|
|
|
|
|
|
|
|
# table
|
|
|
|
|
table_name = PS(name="table_name", fontName="pingbold", fontSize=8, leading=16, alignment=TA_CENTER, spaceBefore=2, textColor=HexColor(darkGrey))
|
|
|
|
|
table_unit = PS(name="table_unit", fontName="SimHei", fontSize=6, leading=8, alignment=TA_RIGHT, spaceBefore=2)
|
|
|
|
|
table_mark = PS(name="table_mark", fontName="SimHei", fontSize=6, leading=16, alignment=TA_LEFT, spaceBefore=2)
|
|
|
|
|
|
|
|
|
|
# para
|
|
|
|
|
para_style_single = PS(name="para_style_single", fontName="SimHei", fontSize=8, leading=18, alignment=TA_LEFT, spaceBefore=6)
|
|
|
|
|
para_style_normal = PS(name="para_style_normal", fontName="SimHei", fontSize=8, leading=18, alignment=TA_LEFT, spaceBefore=6, firstLineIndent=16)
|
|
|
|
|
para_style_bold = PS(name="para_style_bold", fontName="pingbold", fontSize=10, leading=18, alignment=TA_LEFT, spaceBefore=6)
|
|
|
|
|
para_bold_style = PS(name="para_style", fontName="pingbold", fontSize=9, leading=18, alignment=TA_LEFT, spaceBefore=6)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# table
|
|
|
|
|
def adjust_table_widths(list_):
|
|
|
|
|
total_width = 410
|
|
|
|
|
df = pd.DataFrame()
|
|
|
|
|
|
|
|
|
|
for list__ in list_:
|
|
|
|
|
df = df.append(dict(zip(range(len(list__)), list__)), ignore_index=True)
|
|
|
|
|
|
|
|
|
|
df = df.apply(lambda x: x.str.len())
|
|
|
|
|
df = df.replace(0, np.NaN)
|
|
|
|
|
|
|
|
|
|
width_rate = (df.mean() / df.mean().sum()).values.tolist()
|
|
|
|
|
cols_num = len(width_rate)
|
|
|
|
|
if width_rate[0] < 0.33:
|
|
|
|
|
widths = [width_rate[0] * total_width] + [((1 - width_rate[0]) / (cols_num - 1)) * total_width] * (cols_num - 1)
|
|
|
|
|
else:
|
|
|
|
|
widths = [0.33 * total_width] + [(0.67 / (cols_num - 1)) * total_width] * (cols_num - 1)
|
|
|
|
|
|
|
|
|
|
return widths
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def adjust_table_style(list_):
|
|
|
|
|
return TableStyle([
|
|
|
|
|
# 边框
|
|
|
|
|
('INNERGRID', (0, 0), (-1, -1), 0.25, colors.grey),
|
|
|
|
|
('BOX', (0, 0), (-1, -1), 1, colors.black),
|
|
|
|
|
# 文字
|
|
|
|
|
('FONTNAME', (0, 0), (-1, -1), 'SimHei'),
|
|
|
|
|
('FONTSIZE', (0, 0), (-1, -1), 8),
|
|
|
|
|
|
|
|
|
|
('TEXTCOLOR', (0, 0), (-1, 0), colors.white),
|
|
|
|
|
# 排版
|
|
|
|
|
('ALIGN', (1, 0), (-1, -1), 'CENTER'),
|
|
|
|
|
# 背景
|
|
|
|
|
# ('BACKGROUND', (0, 0), (0, -1), HexColor(lightGrey)),
|
|
|
|
|
('BACKGROUND', (0, 0), (-1, 0), HexColor(darkGolden)),
|
|
|
|
|
])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def adjust_line_width(str_, font_size):
|
|
|
|
|
|
|
|
|
|
mark_length = 400
|
|
|
|
|
trans_length = mark_length/font_size-1
|
|
|
|
|
|
|
|
|
|
if len(str_) < trans_length:
|
|
|
|
|
return str_
|
|
|
|
|
|
|
|
|
|
n = 0
|
|
|
|
|
s1 = ''
|
|
|
|
|
s2 = ''
|
|
|
|
|
for i in range(len(str_)):
|
|
|
|
|
|
|
|
|
|
if n == 0 and str_[i] in [',', '。', '、', ';']:
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
if u'\u4e00' <= str_[i] <= u'\u9fa5':
|
|
|
|
|
s2 += str_[i]
|
|
|
|
|
n = n + 1
|
|
|
|
|
elif str_[i] in ['!', '?', '。', '"', '#', '$', '%', '&', ''', '(', ')', '*', '+', ',', '-', '-', '/', ':', ';', '<', '=', '>', '@', '[', '\', ']', '^', '_', '`', '{', '|', '}', '~', '、', '〃', '》', '《', '「', '」', '『', '』', '【', '】', '〔', '〕', '〖', '〗', '〝', '〞', '“', '”']:
|
|
|
|
|
s2 += str_[i]
|
|
|
|
|
n = n + 1
|
|
|
|
|
else:
|
|
|
|
|
s2 += str_[i]
|
|
|
|
|
n = n + 0.5
|
|
|
|
|
|
|
|
|
|
if (n > trans_length) and (i != len(str_)-1):
|
|
|
|
|
if str_[i+1] in [',', '。', '、', ';']:
|
|
|
|
|
s2 += str_[i+1]
|
|
|
|
|
s2 += '<br/>'
|
|
|
|
|
n = 0
|
|
|
|
|
s1 += s2
|
|
|
|
|
s2 = ''
|
|
|
|
|
else:
|
|
|
|
|
s2 += '<br/>'
|
|
|
|
|
n = 0
|
|
|
|
|
s1 += s2
|
|
|
|
|
s2 = ''
|
|
|
|
|
elif i == len(str_)-1:
|
|
|
|
|
s1 += s2
|
|
|
|
|
|
|
|
|
|
return s1
|