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.caption }}
{% endfor %}
diff --git a/output/generated_report.docx b/output/generated_report.docx
index e8774d61289906a4b0e3ce230da017cbb1d9a074..a705894c60a7aed966672a0bdfc557b4d97d68b2 100644
GIT binary patch
delta 2853
zcmZWr2{e>#8=e_t?8S^dYh)RcEqut98AM3P)`*GEzV8}KO+z#^*~Xg2Ha_c6mMl#R
znuM&0M*1|e%V){@qjUc6^#9K}&w1|ay6^kF@ArM)bFMp?47x`Kaafu$FhT$zFc_d^
zyjREZ49IYJlDmK>f#^fS{%5yya5ysn;H3lroB{v<;r>DH=iL3>LVZzwA&L>cK8ucy
z!Gp$-+sifmvpSgyADbhlEteKAkGsZM6rv)1@6W2szqZ(Zq!h0u{-__rD
c*Q4XUvyNBdE>1<%zI9bb&LjkYEKZWh|1Ncfgpx
znual`n)LNJh`+oYyiVztiT0W%uLfzAnGMSI!%l?uzYEcP$*Vv`1n0>@EG?ZrF@bUV^$Ufo4cd
zhcUkn5?U9mA7Wq{q7pD_t8b0DR0Yk^4`STUrb(jKCt&+(6I7|$eW$ux(9TDLQdT{+
zb|^FbiRPrh>Jds?)B7xS4l9trNL(jlE#p|y+#Fgy`cGe=i7-t5?74aGzi^WM!12M|qr%^j>-Fkz}0u(>eB`
zOC>t2UYDlf(&A@#+sIn|Qz@o6my#{r7!ub9XFJ#%XYla*+#F2bS}BQL!?f+u#qOLe
zhJyb1H1WKxA#itNaq14jSe`M7YiG$ZdS+vl%+&e=dD4I=@c{EWd2RMmXf(M+In9&*
z!C1Q7h04~QjU_jarH^7$I3u=$h+yhRjR5pgTZo@O7iiz}mD|AD4m|o(BHL6QHlIEk
zKKy!laWZ=NY;ZA=*Mx>|`_u5M4)C*dxp
zZyWSK2*bj~KXc;@h^rd5Wwe&s$LLyE~UXuOu
z1AWt`baBDe26^udvg6+~McH;)E>8kMDjnpj&XdLK%@#iiN)yw;FVnZ3NRh;Vr|S8Q
zhQjdpA581~r^Z`b;U8`V=tR3$VHYfJ-Fr`o3f+?hA-tb_u~7Hwt$<53T8ZVb@}gu?
zK0L+n$ho^Ypit1|F2`Aqj5las@cDUP!zNn$rDcVNTKIw#8-t?9SOm<)Unz;dcr?<7
zLe<)K$mLFeDH>?fL&a;JD<=|XVwYSYyEpF`Rqqc9oc;z-O?sYLQmGs9eBPR7^rxr2
zR#i7suRo$?SSaeLkM}6KB{>BddGiK-caycdP-dolmpgMTAoSEl5q{
z(?X|A@eIQ}eae{K
zyp1^7ZeE@?P?g-ahL)NgK~M=2-koiisQfW9CWM|^S$)KtuZXG-K2!0My+0y}Z`O!`
zyi$I!Crx&IP^9j
zU7csUu2QOCVfz|{6>x|L^KtRKryEDy=kFsbn&+gH7Ahn=0P`@G=lIf@2}U~m-h+Bk
zHB$Ad?oGV$^~pX?X;3C|=O+7Q1~s;ma$6|Hp6Dob1u(1v>%UgMihA{;L}ZJiX8rPt
z^bcui$9+?DpZLdDf0}umkI&JzS*qd55h+Rfcbn6
zE54);)B%SEXg6rpe#;W2v@hqoA&q@6QpyEcu_i61^C6R)m!cHwd2nK_tnW_p{I&MA
zYa>Hr6H&LjF2wNOg4I*T?Rje1aA;Y5f)lZ&L*%VU7oVUZ3v*C+Zsmb5a{9(^Do##h
zwLX?{{1{u=v79HclYi;D2B$Ijn2G0w|6-_o%s}vw($`xGM&rl%&!U;W$Ih!;x(a-a
z`$BwUl=8-LFg69#=r}&z$*hFION*pl;JFc(y`@`(bG?8>PpfP$D`zlVSOOqn3nuL{ZI_Yp7W#o-Al1Hg$n#f{hFpL`Ds#@>X
z2&z|_)1t2o{^A*rD8dVu5FXoqjOtk5txde2m-2eQJe^A(qz2jCXDLZ4ilc}Xx8Kr=
zU)e#mXUD>Bblm<{c&jcV#=c!g!DIP8{d$}{X{v&;_^LqWr)xJ|M_5j+jyc&yTx@8e
zqnv!97jH5SYGs0ADZw!2NI3p%uiAPiKe7Tbcnu0Kk98Mf;s9Nkieo
z;68Hzfa|ve89XghKmq-7f^I`GC!wN@}
z=D+JTJ~vD3_`TW>Gpz9AS)#{i_Yi%>^JhyOBb{s^AQS$2_L*Z8mn{UclEeo{{(srd
l!$4vDME0*o9vq@;c%dB0<23yoA)qAQIp^#N$&8~0{sS?08odAj
delta 2802
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
图片展示
-
-

+
+
+
这是一张示例图片1
-
-

+
+
+
这是一张示例图片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