Files
k3GPT/main/f_build.py

222 lines
4.7 KiB
Python
Raw Normal View History

2025-11-19 19:42:59 +08:00
"""
生成文档包括word和pdf两种类型
"""
import pypandoc
import pdfkit
from init import gcfg
from utils import regular_filename
#pdf文档的配置选项
options = {
'enable-local-file-access': None, # 允许访问本地文件
'page-size': 'A4',
'margin-top': '0.5in',
'margin-right': '0.5in',
'margin-bottom': '0.5in',
'margin-left': '0.5in',
'encoding': "UTF-8",
'custom-header': [
('Accept-Encoding', 'gzip')
],
'no-outline': None,
'footer-center': '[page]',
'footer-font-size': '8',
'dpi': '300',
'disable-smart-shrinking': ''
}
header_html="""
<!DOCTYPE html>
<html>
<head>
<style>
table {
border-collapse: collapse;
}
td,th {
border: 1px solid #ccc;
min-width: 50px;
height: 20px;
}
th {
background-color: #f1f1f1;
}
blockquote {
border-left: 8px solid #d0e5f2;
padding: 10px 10px;
margin: 10px 0;
background-color: #f1f1f1;
}
code {
font-family: monospace;
background-color: #eee;
padding: 3px;
border-radius: 3px;
}
pre>code {
display: block;
padding: 10px;
}
/* 基础样式 */
h1, h2, h3, h4, h5 {
font-weight: bold;
line-height: 1.2;
margin-top: 1.5em;
margin-bottom: 0.5em;
}
/* 特定级别样式 */
h1 {
font-size: 2.5em; /* 或者使用百分比如 250% */
color: #333;
border-bottom: 1px solid #ddd;
}
h2 {
font-size: 2.5em;
color: #444;
}
h3 {
font-size: 2em;
color: #000;
}
h4 {
font-size: 1.75em;
color: #000;
}
h5 {
font-size: 1.5em;
color: #000;
}
ul {
list-style-type: disc; /* 默认样式为实心圆 */
margin: 0;
padding-left: 20px; /* 根据需要调整缩进 */
}
ul li {
margin-bottom: 0.5em; /* 可选增加项目之间的间距 */
}
ol {
list-style-type: decimal; /* 默认样式为数字1, 2, 3... */
margin: 0;
padding-left: 20px; /* 根据需要调整缩进 */
}
ol li {
margin-left: 0.5em;
margin-bottom: 0.5em; /* 可选增加项目之间的间距 */
}
body {
font-size: 1.5em;
}
</style>
</head>
"""
html_template="""
<body>
{body}
</body>
</html>
"""
def gen_word(name,content):
name = regular_filename(name)
path =f'{gcfg["fs"]["path"]}/pub/{name}.docx'
fname=f'pub/{name}.docx'
content = content.replace('src="/api/',f'src="{gcfg["fs"]["path"]}/')
html_content = header_html+html_template.format(body=content)
output = pypandoc.convert_text(html_content, 'docx', format='html', outputfile=path)
return fname
def gen_pdf(name,content):
name = regular_filename(name)
path =f'{gcfg["fs"]["path"]}/pub/{name}.pdf'
fname=f'pub/{name}.pdf'
content = content.replace('src="/api/',f'src="files://{gcfg["fs"]["path"]}/')
html_content = header_html+html_template.format(body=content)
pdfkit.from_string(html_content, path,options=options)
return fname
def gen_ppt(name,content):
name = regular_filename(name)
path =f'{gcfg["fs"]["path"]}/pub/{name}.pptx'
fname=f'pub/{name}.pptx'
from make_ppt2 import create_unified_ppt
from gen_img_servie import create_ppt_images
color = create_ppt_images()
style={"title_style":2,"main_color":color,"style":0}
create_unified_ppt(content,path,style)
return fname
#颜色转换
def hex_to_rgb(hex_color):
# 去掉可能的 '#' 字符
hex_color = hex_color.lstrip('#')
# 使用 int 和 base=16 将十六进制字符串转换为整数,然后用 ',' 分隔这些值,并创建一个元组
rgb = tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4))
return rgb
def gen_ppt_by_ai(name,content,style):
name = regular_filename(name)
path =f'{gcfg["fs"]["path"]}/pub/{name}.pptx'
fname=f'pub/{name}.pptx'
from make_ppt2 import create_unified_ppt
from gen_img_servie import create_ppt_images
style["main_color"] = hex_to_rgb(style["main_color"])
create_ppt_images(style["main_color"]) #宝石蓝
create_unified_ppt(content,path,style)
return fname
#生成海报
def gen_poster(name,content):
name = regular_filename(name)
path =f'{gcfg["fs"]["path"]}/pub/{name}.png'
fname=f'pub/{name}.png'
from make_poster import create_poster
create_poster(content,path)
return fname
#生成海报,根据样式生成
def gen_poster_style(name,content,style):
name = regular_filename(name)
path =f'{gcfg["fs"]["path"]}/pub/{name}.png'
fname=f'pub/{name}.png'
from make_poster import create_poster_style
create_poster_style(content,path,style)
return fname
def test_pdf():
html_content = "<h1>Hello, World!</h1><p>这是生成文档的内容,如果出现乱码,请检查字体是否安装!</p>"
pdfkit.from_string(html_content, 'output.pdf',options=options)
print("文件已成功转换并保存至 output.pdf")
if __name__=="__main__":
test_pdf()