From 95c7522a1e3ba631c2c6dbcaa782931f3d8550df Mon Sep 17 00:00:00 2001 From: dengjinlai <936887607@qq.com> Date: Mon, 29 Jul 2024 16:51:24 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0spire=E5=BA=93=E7=94=9F?= =?UTF-8?q?=E6=88=90word=20=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- input/report_template.html | 5 +++-- output/generated_report.docx | Bin 39306 -> 39303 bytes output/generated_report.html | 10 ++++++---- output/generated_report.pdf | Bin 69838 -> 69872 bytes report_generation.py | 8 ++++++++ requirements.txt | 4 +++- test_files/test_spire.py | 12 ++++++++++++ utils/cv_tools.py | 12 ++++++++++-- 8 files changed, 42 insertions(+), 9 deletions(-) create mode 100644 test_files/test_spire.py diff --git a/input/report_template.html b/input/report_template.html index 43a8e7b..e56a479 100644 --- a/input/report_template.html +++ b/input/report_template.html @@ -73,8 +73,9 @@

图片展示

{% for image in images %} -
- {{ image.alt }} + +
+ {{ image.alt }}

{{ image.caption }}

{% endfor %} diff --git a/output/generated_report.docx b/output/generated_report.docx index e8774d61289906a4b0e3ce230da017cbb1d9a074..a705894c60a7aed966672a0bdfc557b4d97d68b2 100644 GIT binary patch delta 2853 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 delta 2802 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

图片展示

-
- 图片1 + +
+ 图片1

这是一张示例图片1

-
- 图片2 + +
+ 图片2

这是一张示例图片2

diff --git a/output/generated_report.pdf b/output/generated_report.pdf index 4118c104d90226e4fdcfdbcbbfd998ee0ceed4b9..84dea222b1b9de8504ef0d61c1c08cbcfd343a03 100644 GIT binary patch delta 2823 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 IT5lKo7x}+cxc~qF delta 2784 zcmZuzc|25mAAZN0tr1CGWRfM@bk3PGn?gy7v3Q zq@)tc(tp=X;*#`EI}S`TXAJ3bp47B_)ayKmra2!DVUw zC_yVvZzM(>Ku7`=-*JQJc4UiS)lV!b^zbJZ7XBOm`9FAG9fXdaTT86&LDTF;UH`PPb*1 zjN+}OTjY~3tI8*9(4f3A!7eQ_2j!+e(6E@*>rXi|adv9KEba*{W2X|nDC68LJ1pbb zY>eM!KP*PS;GheVCEC?SAf3;MN8ipqFd%hig_S@@snytXd3w?W27lhYc)?~&F znY=Mn9M!?|oOxWe)ic2Kj!}|j=CJi!&3m0u@lye9*|hV6sfBUzElQoCBA+@`h2Vi} zk^Q=LUKXQaK+X0gj{g?0SO%M5oNOIx7i+)U-CUtx2kz+3_tM<^x@)$Y@sv*P*(n<; zn&uiQh}jsExXx#r!_Y-a`^%ho!PDmB`%d6gf~-w!s$-I9;?R7 zEI^m6QrhE>ITqNNqSc#RLnP}hxYpDFY!5wcl02PV_{Q0!;GhLktpckrX!kt%H#?h> zL=mEDN0<%U)3RilEV!0InNv+rBwkTVIq`WmTF|cI9NeJ%hXR+4OE!#Ca6WuHEwQUU;tnTKgSk z@=}v7`Z}e=Cva&)*{N5-RbotT(r^oykZY@x5jpt(cgL8f*WZ|YxRQMOUE!@v@-M=EG$M_x#4 zf_9wdn@odU!~Um*uqG^TR^5^OF|Dx+)R0FeA&&y>(Gfh;2vwE5ryXDOeU*x)-YUBU z9b6JENiDACnMp{{rV&Ybtz z8CAa|-mmP+)nPQ~8D^=;_U2NQed>`dC@IoJ_4u07zEWNPo><+XX+ns|j$y@{Z{}2V z)@|;d_s{HfO(^#_0L2(XJW;FnpuzOOM|o5bQc#gaXw_@vd3fDkB0Gz$cV^k}TULB>`BiFNE{yIQeRcZeg*|dL*Hk!{4lPcz%IPe- zMyfb9)`7KObrYTnXXcFLg}s^pdsDSK?Ty`R*qs)s)jQ`GEEVjZt$pY!$M7v`_L9r6 zPc91FR&=g}D|^W8bGAysds?yO%l)p{){|OX5InOs99 zA3k9arJM?T=L{#H+|6^m=NVGc8Tisu50OfP!!Atvd3j&65Kjv0^}KMcf&OU!gZTT| zx63T+umP5=ExVsHX{Hi3WYNm|e$jN>o(2zF{UgkF!!}z)XBSgln1RlT{1yF4qb*9g zqpoy6+qih4W#8OW7-SxJkrte#?!f)MtI_~^ zE752JDX%w!%4bcJHZ`yYo1YKmMno!);Ff#N2!D}iu`u^VW*AB+2th}iu^GZBG2~!P zG}0f97lsHB03e%UAP%**#|+_d#DvHo3?ri)t8YYigk6CxM2nzMh(x9AEfrBzmk?4} zO=M#wQM!msjS=D)9gn=O!6WNqq!E=`4UTzC5+p^!0GOlhe&QfRhKTI#!YjWIsltUl zD2&1)jTI(rv?xlJv$>Kj$ex!#5s}Gib@l;C)Lj7ro~`jGr|D5QJZ8^dEHs z5KQJTkU)Y75I+wGLNI>}1_`T*fk=Eg7%Ta30FJ;X#sLs+RmU($;x_~VBA+1uti*`? zlUeawHB}sdCjkup#2}u`pX6J8s}1o4{>k7#0=P;GlHpZah=}{|_%VzhM*;^D@%($j zfn@0ai19zfKeZ5<%)b)+$~yTA#6v`gF9!p_!vM%X>J>4>e->7F#MLnz$e)Bj#I0(C nKwP<)@=cmRA^=2;%s&s@iWp+&NTW<8h(sbrTup5+%|!e!0bD!` diff --git a/report_generation.py b/report_generation.py index 32c4d0e..2553cc1 100644 --- a/report_generation.py +++ b/report_generation.py @@ -67,6 +67,14 @@ def html2docx(html_path, docx_path): pypandoc.convert_file(html_path, 'docx', outputfile=docx_path) print("Word报告生成成功!") +def html2docx_spire(html_path, docx_path): + from spire.doc import FileFormat,XHTMLValidationType,Document + # from spire.doc.common import * + document = Document() + document.LoadFromFile(html_path, FileFormat.Html, XHTMLValidationType.none) + document.SaveToFile(docx_path, FileFormat.Docx2016) + document.Close() + def main(): env = Environment(loader=FileSystemLoader(config.template_dir)) template = env.get_template("report_template.html") diff --git a/requirements.txt b/requirements.txt index 6318b45..805702e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,4 +4,6 @@ pypandoc==1.13 pandas==2.2.2 opencv-python==4.10.0.84 openpyxl==3.1.4 -Jinja2==3.1.4 \ No newline at end of file +Jinja2==3.1.4 + +#Spire.Doc==12.7.1 \ No newline at end of file diff --git a/test_files/test_spire.py b/test_files/test_spire.py new file mode 100644 index 0000000..f72e71f --- /dev/null +++ b/test_files/test_spire.py @@ -0,0 +1,12 @@ +from spire.doc import FileFormat,XHTMLValidationType,Document +# from spire.doc.common import * + +# 创建Document类的对象 +document = Document() + +# 加载一个HTML文件 +document.LoadFromFile("output/generated_report.html", FileFormat.Html, XHTMLValidationType.none) + +# 将HTML文件保存为.docx格式 +document.SaveToFile("Html文件转为Word2.docx", FileFormat.Docx2016) +document.Close() \ No newline at end of file diff --git a/utils/cv_tools.py b/utils/cv_tools.py index a787a17..74e6763 100644 --- a/utils/cv_tools.py +++ b/utils/cv_tools.py @@ -10,8 +10,16 @@ def resize_image(input_path, output_path, new_width=200): new_height = int((float(height) * width_percent)) # 调整图片大小 - resized_img = cv2.resize(img, (new_width, new_height), interpolation=cv2.INTER_LANCZOS4) - + # resized_img = cv2.resize(img, (new_width, new_height), interpolation=cv2.INTER_LANCZOS4) + resized_img = cv2.resize(img, (new_width, new_height), interpolation=cv2.INTER_AREA) + # 保存调整后的图片 cv2.imwrite(output_path, resized_img) print(f"图片已保存为 {output_path}") + + + + +if __name__ == "__main__": + resize_image("./input/image.png","temp2.png") + \ No newline at end of file