Files
k3GPT/main/f_build.py
2025-11-19 19:42:59 +08:00

222 lines
4.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
生成文档包括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()