diff --git a/wetb/utils/report_generator/docx_document/__init__.py b/wetb/utils/report_generator/docx_document/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/wetb/utils/report_generator/docx_document/docx-template_clean/_rels/.rels b/wetb/utils/report_generator/docx_document/docx-template_clean/_rels/.rels new file mode 100644 index 0000000000000000000000000000000000000000..7d3b4d2dfc20a100c75a68089002f3965a8ee0fa --- /dev/null +++ b/wetb/utils/report_generator/docx_document/docx-template_clean/_rels/.rels @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"> +<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="word/document.xml"/> +<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/> +<Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml"/> +<Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officedocument/2006/relationships/metadata/core-properties" Target="docProps/core0.xml"/> +</Relationships> \ No newline at end of file diff --git a/wetb/utils/report_generator/docx_document/docx-template_clean/word/fontTable.xml b/wetb/utils/report_generator/docx_document/docx-template_clean/word/fontTable.xml new file mode 100644 index 0000000000000000000000000000000000000000..c47d943404cc6d8508e71beab7b06c870f93e72c --- /dev/null +++ b/wetb/utils/report_generator/docx_document/docx-template_clean/word/fontTable.xml @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<w:fonts xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> + <w:font w:name="Symbol"> + <w:panose1 w:val="02000500000000000000"/> + <w:charset w:val="02"/> + <w:family w:val="auto"/> + <w:pitch w:val="variable"/> + <w:sig w:usb0="00000000" w:usb1="00000000" w:usb2="00010000" w:usb3="00000000" w:csb0="80000000" w:csb1="00000000"/> + </w:font> + <w:font w:name="Times New Roman"> + <w:panose1 w:val="02020603050405020304"/> + <w:charset w:val="00"/> + <w:family w:val="auto"/> + <w:pitch w:val="variable"/> + <w:sig w:usb0="00000003" w:usb1="00000000" w:usb2="00000000" w:usb3="00000000" w:csb0="00000001" w:csb1="00000000"/> + </w:font> + <w:font w:name="Courier New"> + <w:panose1 w:val="02070309020205020404"/> + <w:charset w:val="00"/> + <w:family w:val="auto"/> + <w:pitch w:val="variable"/> + <w:sig w:usb0="00000003" w:usb1="00000000" w:usb2="00000000" w:usb3="00000000" w:csb0="00000001" w:csb1="00000000"/> + </w:font> + <w:font w:name="Wingdings"> + <w:panose1 w:val="05020102010804080708"/> + <w:charset w:val="02"/> + <w:family w:val="auto"/> + <w:pitch w:val="variable"/> + <w:sig w:usb0="00000000" w:usb1="00000000" w:usb2="00010000" w:usb3="00000000" w:csb0="80000000" w:csb1="00000000"/> + </w:font> + <w:font w:name="Cambria"> + <w:panose1 w:val="02040503050406030204"/> + <w:charset w:val="00"/> + <w:family w:val="auto"/> + <w:pitch w:val="variable"/> + <w:sig w:usb0="00000003" w:usb1="00000000" w:usb2="00000000" w:usb3="00000000" w:csb0="00000001" w:csb1="00000000"/> + </w:font> + <w:font w:name="Calibri"> + <w:panose1 w:val="020F0502020204030204"/> + <w:charset w:val="00"/> + <w:family w:val="auto"/> + <w:pitch w:val="variable"/> + <w:sig w:usb0="00000003" w:usb1="00000000" w:usb2="00000000" w:usb3="00000000" w:csb0="00000001" w:csb1="00000000"/> + </w:font> + <w:font w:name="Arial"> + <w:panose1 w:val="020B0604020202020204"/> + <w:charset w:val="00"/> + <w:family w:val="auto"/> + <w:pitch w:val="variable"/> + <w:sig w:usb0="00000003" w:usb1="00000000" w:usb2="00000000" w:usb3="00000000" w:csb0="00000001" w:csb1="00000000"/> + </w:font> +</w:fonts> diff --git a/wetb/utils/report_generator/docx_document/docx-template_clean/word/footer1.xml b/wetb/utils/report_generator/docx_document/docx-template_clean/word/footer1.xml new file mode 100644 index 0000000000000000000000000000000000000000..f1531e0f808cdb3365a79648c070479350121f57 --- /dev/null +++ b/wetb/utils/report_generator/docx_document/docx-template_clean/word/footer1.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<w:ftr xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" mc:Ignorable="w14 wp14"><w:p w:rsidR="001B1717" w:rsidRDefault="001B1717"><w:pPr><w:pStyle w:val="Footer"/></w:pPr><w:r><w:rPr><w:sz w:val="20"/></w:rPr><w:t>LEFT</w:t></w:r><w:r><w:rPr><w:sz w:val="20"/></w:rPr><w:tab/></w:r><w:r><w:rPr><w:sz w:val="20"/></w:rPr><w:tab/></w:r><w:r w:rsidRPr="001B1717"><w:rPr><w:sz w:val="20"/></w:rPr><w:fldChar w:fldCharType="begin"/></w:r><w:r w:rsidRPr="001B1717"><w:rPr><w:sz w:val="20"/></w:rPr><w:instrText xml:space="preserve"> PAGE \* MERGEFORMAT </w:instrText></w:r><w:r w:rsidRPr="001B1717"><w:rPr><w:sz w:val="20"/></w:rPr><w:fldChar w:fldCharType="separate"/></w:r><w:r w:rsidR="004C0EAC"><w:rPr><w:noProof/><w:sz w:val="20"/></w:rPr><w:t>1</w:t></w:r><w:r w:rsidRPr="001B1717"><w:rPr><w:noProof/><w:sz w:val="20"/></w:rPr><w:fldChar w:fldCharType="end"/></w:r></w:p></w:ftr> \ No newline at end of file diff --git a/wetb/utils/report_generator/docx_document/docx-template_clean/word/numbering.xml b/wetb/utils/report_generator/docx_document/docx-template_clean/word/numbering.xml new file mode 100644 index 0000000000000000000000000000000000000000..415ef5183d82e443ca68cb05ae6638d6531a37c7 --- /dev/null +++ b/wetb/utils/report_generator/docx_document/docx-template_clean/word/numbering.xml @@ -0,0 +1,509 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<w:numbering xmlns:mv="urn:schemas-microsoft-com:mac:vml" xmlns:mo="http://schemas.microsoft.com/office/mac/office/2008/main" xmlns:ve="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"> + <w:abstractNum w:abstractNumId="0"> + <w:nsid w:val="FFFFFF1D"/> + <w:multiLevelType w:val="multilevel"/> + <w:tmpl w:val="D0409C7C"/> + <w:lvl w:ilvl="0"> + <w:start w:val="1"/> + <w:numFmt w:val="bullet"/> + <w:lvlText w:val=""/> + <w:lvlJc w:val="left"/> + <w:pPr> + <w:tabs> + <w:tab w:val="num" w:pos="0"/> + </w:tabs> + <w:ind w:left="0" w:firstLine="0"/> + </w:pPr> + <w:rPr> + <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> + </w:rPr> + </w:lvl> + <w:lvl w:ilvl="1"> + <w:start w:val="1"/> + <w:numFmt w:val="bullet"/> + <w:lvlText w:val="ï‚·"/> + <w:lvlJc w:val="left"/> + <w:pPr> + <w:tabs> + <w:tab w:val="num" w:pos="720"/> + </w:tabs> + <w:ind w:left="1080" w:hanging="360"/> + </w:pPr> + <w:rPr> + <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> + </w:rPr> + </w:lvl> + <w:lvl w:ilvl="2"> + <w:start w:val="1"/> + <w:numFmt w:val="bullet"/> + <w:lvlText w:val="o"/> + <w:lvlJc w:val="left"/> + <w:pPr> + <w:tabs> + <w:tab w:val="num" w:pos="1440"/> + </w:tabs> + <w:ind w:left="1800" w:hanging="360"/> + </w:pPr> + <w:rPr> + <w:rFonts w:ascii="Courier New" w:hAnsi="Courier New" w:hint="default"/> + </w:rPr> + </w:lvl> + <w:lvl w:ilvl="3"> + <w:start w:val="1"/> + <w:numFmt w:val="bullet"/> + <w:lvlText w:val=""/> + <w:lvlJc w:val="left"/> + <w:pPr> + <w:tabs> + <w:tab w:val="num" w:pos="2160"/> + </w:tabs> + <w:ind w:left="2520" w:hanging="360"/> + </w:pPr> + <w:rPr> + <w:rFonts w:ascii="Wingdings" w:hAnsi="Wingdings" w:hint="default"/> + </w:rPr> + </w:lvl> + <w:lvl w:ilvl="4"> + <w:start w:val="1"/> + <w:numFmt w:val="bullet"/> + <w:lvlText w:val=""/> + <w:lvlJc w:val="left"/> + <w:pPr> + <w:tabs> + <w:tab w:val="num" w:pos="2880"/> + </w:tabs> + <w:ind w:left="3240" w:hanging="360"/> + </w:pPr> + <w:rPr> + <w:rFonts w:ascii="Wingdings" w:hAnsi="Wingdings" w:hint="default"/> + </w:rPr> + </w:lvl> + <w:lvl w:ilvl="5"> + <w:start w:val="1"/> + <w:numFmt w:val="bullet"/> + <w:lvlText w:val="ï‚·"/> + <w:lvlJc w:val="left"/> + <w:pPr> + <w:tabs> + <w:tab w:val="num" w:pos="3600"/> + </w:tabs> + <w:ind w:left="3960" w:hanging="360"/> + </w:pPr> + <w:rPr> + <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> + </w:rPr> + </w:lvl> + <w:lvl w:ilvl="6"> + <w:start w:val="1"/> + <w:numFmt w:val="bullet"/> + <w:lvlText w:val="o"/> + <w:lvlJc w:val="left"/> + <w:pPr> + <w:tabs> + <w:tab w:val="num" w:pos="4320"/> + </w:tabs> + <w:ind w:left="4680" w:hanging="360"/> + </w:pPr> + <w:rPr> + <w:rFonts w:ascii="Courier New" w:hAnsi="Courier New" w:hint="default"/> + </w:rPr> + </w:lvl> + <w:lvl w:ilvl="7"> + <w:start w:val="1"/> + <w:numFmt w:val="bullet"/> + <w:lvlText w:val=""/> + <w:lvlJc w:val="left"/> + <w:pPr> + <w:tabs> + <w:tab w:val="num" w:pos="5040"/> + </w:tabs> + <w:ind w:left="5400" w:hanging="360"/> + </w:pPr> + <w:rPr> + <w:rFonts w:ascii="Wingdings" w:hAnsi="Wingdings" w:hint="default"/> + </w:rPr> + </w:lvl> + <w:lvl w:ilvl="8"> + <w:start w:val="1"/> + <w:numFmt w:val="bullet"/> + <w:lvlText w:val=""/> + <w:lvlJc w:val="left"/> + <w:pPr> + <w:tabs> + <w:tab w:val="num" w:pos="5760"/> + </w:tabs> + <w:ind w:left="6120" w:hanging="360"/> + </w:pPr> + <w:rPr> + <w:rFonts w:ascii="Wingdings" w:hAnsi="Wingdings" w:hint="default"/> + </w:rPr> + </w:lvl> + </w:abstractNum> + <w:abstractNum w:abstractNumId="1"> + <w:nsid w:val="FFFFFF7C"/> + <w:multiLevelType w:val="singleLevel"/> + <w:tmpl w:val="9B522538"/> + <w:lvl w:ilvl="0"> + <w:start w:val="1"/> + <w:numFmt w:val="decimal"/> + <w:lvlText w:val="%1."/> + <w:lvlJc w:val="left"/> + <w:pPr> + <w:tabs> + <w:tab w:val="num" w:pos="1492"/> + </w:tabs> + <w:ind w:left="1492" w:hanging="360"/> + </w:pPr> + </w:lvl> + </w:abstractNum> + <w:abstractNum w:abstractNumId="2"> + <w:nsid w:val="FFFFFF7D"/> + <w:multiLevelType w:val="singleLevel"/> + <w:tmpl w:val="1BB4178C"/> + <w:lvl w:ilvl="0"> + <w:start w:val="1"/> + <w:numFmt w:val="decimal"/> + <w:lvlText w:val="%1."/> + <w:lvlJc w:val="left"/> + <w:pPr> + <w:tabs> + <w:tab w:val="num" w:pos="1209"/> + </w:tabs> + <w:ind w:left="1209" w:hanging="360"/> + </w:pPr> + </w:lvl> + </w:abstractNum> + <w:abstractNum w:abstractNumId="3"> + <w:nsid w:val="FFFFFF7E"/> + <w:multiLevelType w:val="singleLevel"/> + <w:tmpl w:val="4720F336"/> + <w:lvl w:ilvl="0"> + <w:start w:val="1"/> + <w:numFmt w:val="decimal"/> + <w:lvlText w:val="%1."/> + <w:lvlJc w:val="left"/> + <w:pPr> + <w:tabs> + <w:tab w:val="num" w:pos="926"/> + </w:tabs> + <w:ind w:left="926" w:hanging="360"/> + </w:pPr> + </w:lvl> + </w:abstractNum> + <w:abstractNum w:abstractNumId="4"> + <w:nsid w:val="FFFFFF7F"/> + <w:multiLevelType w:val="singleLevel"/> + <w:tmpl w:val="7DCEC040"/> + <w:lvl w:ilvl="0"> + <w:start w:val="1"/> + <w:numFmt w:val="decimal"/> + <w:lvlText w:val="%1."/> + <w:lvlJc w:val="left"/> + <w:pPr> + <w:tabs> + <w:tab w:val="num" w:pos="643"/> + </w:tabs> + <w:ind w:left="643" w:hanging="360"/> + </w:pPr> + </w:lvl> + </w:abstractNum> + <w:abstractNum w:abstractNumId="5"> + <w:nsid w:val="FFFFFF80"/> + <w:multiLevelType w:val="singleLevel"/> + <w:tmpl w:val="A01021FA"/> + <w:lvl w:ilvl="0"> + <w:start w:val="1"/> + <w:numFmt w:val="bullet"/> + <w:lvlText w:val="ï‚·"/> + <w:lvlJc w:val="left"/> + <w:pPr> + <w:tabs> + <w:tab w:val="num" w:pos="1492"/> + </w:tabs> + <w:ind w:left="1492" w:hanging="360"/> + </w:pPr> + <w:rPr> + <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> + </w:rPr> + </w:lvl> + </w:abstractNum> + <w:abstractNum w:abstractNumId="6"> + <w:nsid w:val="FFFFFF81"/> + <w:multiLevelType w:val="singleLevel"/> + <w:tmpl w:val="977AAC7C"/> + <w:lvl w:ilvl="0"> + <w:start w:val="1"/> + <w:numFmt w:val="bullet"/> + <w:lvlText w:val="ï‚·"/> + <w:lvlJc w:val="left"/> + <w:pPr> + <w:tabs> + <w:tab w:val="num" w:pos="1209"/> + </w:tabs> + <w:ind w:left="1209" w:hanging="360"/> + </w:pPr> + <w:rPr> + <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> + </w:rPr> + </w:lvl> + </w:abstractNum> + <w:abstractNum w:abstractNumId="7"> + <w:nsid w:val="FFFFFF82"/> + <w:multiLevelType w:val="singleLevel"/> + <w:tmpl w:val="0D26C678"/> + <w:lvl w:ilvl="0"> + <w:start w:val="1"/> + <w:numFmt w:val="bullet"/> + <w:lvlText w:val="ï‚·"/> + <w:lvlJc w:val="left"/> + <w:pPr> + <w:tabs> + <w:tab w:val="num" w:pos="926"/> + </w:tabs> + <w:ind w:left="926" w:hanging="360"/> + </w:pPr> + <w:rPr> + <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> + </w:rPr> + </w:lvl> + </w:abstractNum> + <w:abstractNum w:abstractNumId="8"> + <w:nsid w:val="FFFFFF83"/> + <w:multiLevelType w:val="singleLevel"/> + <w:tmpl w:val="EE200B76"/> + <w:lvl w:ilvl="0"> + <w:start w:val="1"/> + <w:numFmt w:val="bullet"/> + <w:lvlText w:val="ï‚·"/> + <w:lvlJc w:val="left"/> + <w:pPr> + <w:tabs> + <w:tab w:val="num" w:pos="643"/> + </w:tabs> + <w:ind w:left="643" w:hanging="360"/> + </w:pPr> + <w:rPr> + <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> + </w:rPr> + </w:lvl> + </w:abstractNum> + <w:abstractNum w:abstractNumId="9"> + <w:nsid w:val="FFFFFF88"/> + <w:multiLevelType w:val="singleLevel"/> + <w:tmpl w:val="E7381406"/> + <w:lvl w:ilvl="0"> + <w:start w:val="1"/> + <w:numFmt w:val="decimal"/> + <w:pStyle w:val="ListNumber"/> + <w:lvlText w:val="%1."/> + <w:lvlJc w:val="left"/> + <w:pPr> + <w:tabs> + <w:tab w:val="num" w:pos="360"/> + </w:tabs> + <w:ind w:left="360" w:hanging="360"/> + </w:pPr> + </w:lvl> + </w:abstractNum> + <w:abstractNum w:abstractNumId="10"> + <w:nsid w:val="FFFFFF89"/> + <w:multiLevelType w:val="singleLevel"/> + <w:tmpl w:val="ECFC1548"/> + <w:lvl w:ilvl="0"> + <w:start w:val="1"/> + <w:numFmt w:val="bullet"/> + <w:pStyle w:val="ListBullet"/> + <w:lvlText w:val="ï‚·"/> + <w:lvlJc w:val="left"/> + <w:pPr> + <w:tabs> + <w:tab w:val="num" w:pos="360"/> + </w:tabs> + <w:ind w:left="360" w:hanging="360"/> + </w:pPr> + <w:rPr> + <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> + </w:rPr> + </w:lvl> + </w:abstractNum> + <w:abstractNum w:abstractNumId="11"> + <w:nsid w:val="30585973"/> + <w:multiLevelType w:val="multilevel"/> + <w:tmpl w:val="A47E15CE"/> + <w:lvl w:ilvl="0"> + <w:start w:val="1"/> + <w:numFmt w:val="decimal"/> + <w:lvlText w:val="%1."/> + <w:lvlJc w:val="left"/> + <w:pPr> + <w:tabs> + <w:tab w:val="num" w:pos="720"/> + </w:tabs> + <w:ind w:left="720" w:hanging="720"/> + </w:pPr> + </w:lvl> + <w:lvl w:ilvl="1"> + <w:start w:val="1"/> + <w:numFmt w:val="decimal"/> + <w:lvlText w:val="%2."/> + <w:lvlJc w:val="left"/> + <w:pPr> + <w:tabs> + <w:tab w:val="num" w:pos="1440"/> + </w:tabs> + <w:ind w:left="1440" w:hanging="720"/> + </w:pPr> + </w:lvl> + <w:lvl w:ilvl="2"> + <w:start w:val="1"/> + <w:numFmt w:val="decimal"/> + <w:lvlText w:val="%3."/> + <w:lvlJc w:val="left"/> + <w:pPr> + <w:tabs> + <w:tab w:val="num" w:pos="2160"/> + </w:tabs> + <w:ind w:left="2160" w:hanging="720"/> + </w:pPr> + </w:lvl> + <w:lvl w:ilvl="3"> + <w:start w:val="1"/> + <w:numFmt w:val="decimal"/> + <w:lvlText w:val="%4."/> + <w:lvlJc w:val="left"/> + <w:pPr> + <w:tabs> + <w:tab w:val="num" w:pos="2880"/> + </w:tabs> + <w:ind w:left="2880" w:hanging="720"/> + </w:pPr> + </w:lvl> + <w:lvl w:ilvl="4"> + <w:start w:val="1"/> + <w:numFmt w:val="decimal"/> + <w:lvlText w:val="%5."/> + <w:lvlJc w:val="left"/> + <w:pPr> + <w:tabs> + <w:tab w:val="num" w:pos="3600"/> + </w:tabs> + <w:ind w:left="3600" w:hanging="720"/> + </w:pPr> + </w:lvl> + <w:lvl w:ilvl="5"> + <w:start w:val="1"/> + <w:numFmt w:val="decimal"/> + <w:lvlText w:val="%6."/> + <w:lvlJc w:val="left"/> + <w:pPr> + <w:tabs> + <w:tab w:val="num" w:pos="4320"/> + </w:tabs> + <w:ind w:left="4320" w:hanging="720"/> + </w:pPr> + </w:lvl> + <w:lvl w:ilvl="6"> + <w:start w:val="1"/> + <w:numFmt w:val="decimal"/> + <w:lvlText w:val="%7."/> + <w:lvlJc w:val="left"/> + <w:pPr> + <w:tabs> + <w:tab w:val="num" w:pos="5040"/> + </w:tabs> + <w:ind w:left="5040" w:hanging="720"/> + </w:pPr> + </w:lvl> + <w:lvl w:ilvl="7"> + <w:start w:val="1"/> + <w:numFmt w:val="decimal"/> + <w:lvlText w:val="%8."/> + <w:lvlJc w:val="left"/> + <w:pPr> + <w:tabs> + <w:tab w:val="num" w:pos="5760"/> + </w:tabs> + <w:ind w:left="5760" w:hanging="720"/> + </w:pPr> + </w:lvl> + <w:lvl w:ilvl="8"> + <w:start w:val="1"/> + <w:numFmt w:val="decimal"/> + <w:lvlText w:val="%9."/> + <w:lvlJc w:val="left"/> + <w:pPr> + <w:tabs> + <w:tab w:val="num" w:pos="6480"/> + </w:tabs> + <w:ind w:left="6480" w:hanging="720"/> + </w:pPr> + </w:lvl> + </w:abstractNum> + <w:num w:numId="1"> + <w:abstractNumId w:val="11"/> + </w:num> + <w:num w:numId="2"> + <w:abstractNumId w:val="11"/> + <w:lvlOverride w:ilvl="0"> + <w:startOverride w:val="1"/> + </w:lvlOverride> + <w:lvlOverride w:ilvl="1"> + <w:startOverride w:val="1"/> + </w:lvlOverride> + <w:lvlOverride w:ilvl="2"> + <w:startOverride w:val="1"/> + </w:lvlOverride> + <w:lvlOverride w:ilvl="3"> + <w:startOverride w:val="1"/> + </w:lvlOverride> + <w:lvlOverride w:ilvl="4"> + <w:startOverride w:val="1"/> + </w:lvlOverride> + <w:lvlOverride w:ilvl="5"> + <w:startOverride w:val="1"/> + </w:lvlOverride> + <w:lvlOverride w:ilvl="6"> + <w:startOverride w:val="1"/> + </w:lvlOverride> + <w:lvlOverride w:ilvl="7"> + <w:startOverride w:val="1"/> + </w:lvlOverride> + <w:lvlOverride w:ilvl="8"> + <w:startOverride w:val="1"/> + </w:lvlOverride> + </w:num> + <w:num w:numId="3"> + <w:abstractNumId w:val="4"/> + </w:num> + <w:num w:numId="4"> + <w:abstractNumId w:val="3"/> + </w:num> + <w:num w:numId="5"> + <w:abstractNumId w:val="2"/> + </w:num> + <w:num w:numId="6"> + <w:abstractNumId w:val="1"/> + </w:num> + <w:num w:numId="7"> + <w:abstractNumId w:val="0"/> + </w:num> + <w:num w:numId="8"> + <w:abstractNumId w:val="10"/> + </w:num> + <w:num w:numId="9"> + <w:abstractNumId w:val="8"/> + </w:num> + <w:num w:numId="10"> + <w:abstractNumId w:val="7"/> + </w:num> + <w:num w:numId="11"> + <w:abstractNumId w:val="6"/> + </w:num> + <w:num w:numId="12"> + <w:abstractNumId w:val="5"/> + </w:num> + <w:num w:numId="13"> + <w:abstractNumId w:val="9"/> + </w:num> +</w:numbering> diff --git a/wetb/utils/report_generator/docx_document/docx-template_clean/word/settings.xml b/wetb/utils/report_generator/docx_document/docx-template_clean/word/settings.xml new file mode 100644 index 0000000000000000000000000000000000000000..92dfa3f4874cb391eb7e27d2d8b8cec6d19483ea --- /dev/null +++ b/wetb/utils/report_generator/docx_document/docx-template_clean/word/settings.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<w:settings xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:sl="http://schemas.openxmlformats.org/schemaLibrary/2006/main"> + <w:zoom w:percent="90"/> + <w:embedSystemFonts/> + <w:proofState w:spelling="clean" w:grammar="clean"/> + <w:stylePaneFormatFilter w:val="0004"/> + <w:doNotTrackMoves/> + <w:defaultTabStop w:val="720"/> + <w:drawingGridHorizontalSpacing w:val="360"/> + <w:drawingGridVerticalSpacing w:val="360"/> + <w:displayHorizontalDrawingGridEvery w:val="0"/> + <w:displayVerticalDrawingGridEvery w:val="0"/> + <w:characterSpacingControl w:val="doNotCompress"/> + <w:savePreviewPicture/> + <w:rsids> + <w:rsidRoot w:val="00590D07"/> + <w:rsid w:val="00011C8B"/> + <w:rsid w:val="004E29B3"/> + <w:rsid w:val="00590D07"/> + <w:rsid w:val="00784D58"/> + <w:rsid w:val="008D6863"/> + <w:rsid w:val="00B86B75"/> + <w:rsid w:val="00BC48D5"/> + <w:rsid w:val="00C36279"/> + <w:rsid w:val="00E315A3"/> + </w:rsids> + <m:mathPr> + <m:mathFont m:val="Lucida Grande"/> + <m:brkBin m:val="before"/> + <m:brkBinSub m:val="--"/> + <m:smallFrac m:val="false"/> + <m:dispDef m:val="false"/> + <m:lMargin m:val="0"/> + <m:rMargin m:val="0"/> + <m:wrapRight/> + <m:intLim m:val="subSup"/> + <m:naryLim m:val="subSup"/> + </m:mathPr> + <w:themeFontLang w:val="en-US"/> + <w:clrSchemeMapping w:bg1="light1" w:t1="dark1" w:bg2="light2" w:t2="dark2" w:accent1="accent1" w:accent2="accent2" w:accent3="accent3" w:accent4="accent4" w:accent5="accent5" w:accent6="accent6" w:hyperlink="hyperlink" w:followedHyperlink="followedHyperlink"/> + <w:decimalSymbol w:val="."/> + <w:listSeparator w:val=","/> +</w:settings> diff --git a/wetb/utils/report_generator/docx_document/docx-template_clean/word/styles.xml b/wetb/utils/report_generator/docx_document/docx-template_clean/word/styles.xml new file mode 100644 index 0000000000000000000000000000000000000000..0d8224a617a170367b15373b4946f2cc5404bc57 --- /dev/null +++ b/wetb/utils/report_generator/docx_document/docx-template_clean/word/styles.xml @@ -0,0 +1,296 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<w:styles xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> +<w:docDefaults> +<w:rPrDefault> +<w:rPr> +<w:rFonts w:asciiTheme="minorHAnsi" w:eastAsiaTheme="minorHAnsi" w:hAnsiTheme="minorHAnsi" w:cstheme="minorBidi"/> +<w:sz w:val="24"/> +<w:szCs w:val="24"/> +<w:lang w:val="en-US" w:eastAsia="en-US" w:bidi="ar-SA"/> +</w:rPr> +</w:rPrDefault> +<w:pPrDefault> +<w:pPr> +<w:spacing w:after="200"/> +</w:pPr> +</w:pPrDefault> +</w:docDefaults> +<w:latentStyles w:defLockedState="0" w:defUIPriority="0" w:defSemiHidden="0" w:defUnhideWhenUsed="0" w:defQFormat="0" w:count="276"/> +<w:style w:type="paragraph" w:default="1" w:styleId="Normal"> +<w:name w:val="Normal"/> +<w:qFormat/> +<w:rsid w:val="000D33D5"/> +<w:rFonts w:ascii="Tahoma" w:hAnsi="Tahoma" w:cs="Tahoma"/> +</w:style> +<w:style w:type="paragraph" w:styleId="Heading1"> +<w:name w:val="heading 1"/> +<w:basedOn w:val="Normal"/> +<w:next w:val="Normal"/> +<w:link w:val="Heading1Char"/> +<w:uiPriority w:val="9"/> +<w:qFormat/> +<w:rsid w:val="00E315A3"/> +<w:pPr> +<w:keepNext/> +<w:keepLines/> +<w:spacing w:before="480" w:after="0"/> +<w:outlineLvl w:val="0"/> +</w:pPr> +<w:rPr> +<w:rFonts w:ascii="Tahoma" w:hAnsi="Tahoma" w:cs="Tahoma"/> +<w:b/> +<w:bCs/> +<w:color w:val="345A8A" w:themeColor="accent1" w:themeShade="B5"/> +<w:sz w:val="32"/> +<w:szCs w:val="32"/> +</w:rPr> +</w:style> +<w:style w:type="paragraph" w:styleId="Heading2"> +<w:name w:val="heading 2"/> +<w:basedOn w:val="Normal"/> +<w:next w:val="Normal"/> +<w:link w:val="Heading2Char"/> +<w:uiPriority w:val="9"/> +<w:unhideWhenUsed/> +<w:qFormat/> +<w:rsid w:val="00E315A3"/> +<w:pPr> +<w:keepNext/> +<w:keepLines/> +<w:spacing w:before="200" w:after="0"/> +<w:outlineLvl w:val="1"/> +</w:pPr> +<w:rPr> +<w:rFonts w:ascii="Tahoma" w:hAnsi="Tahoma" w:cs="Tahoma"/> +<w:b/> +<w:bCs/> +<w:color w:val="4F81BD" w:themeColor="accent1"/> +<w:sz w:val="26"/> +<w:szCs w:val="26"/> +</w:rPr> +</w:style> +<w:style w:type="paragraph" w:styleId="Heading3"> +<w:name w:val="heading 3"/> +<w:basedOn w:val="Normal"/> +<w:next w:val="Normal"/> +<w:link w:val="Heading3Char"/> +<w:uiPriority w:val="9"/> +<w:unhideWhenUsed/> +<w:qFormat/> +<w:rsid w:val="00E315A3"/> +<w:pPr> +<w:keepNext/> +<w:keepLines/> +<w:spacing w:before="100" w:after="0"/> +<w:outlineLvl w:val="1"/> +</w:pPr> +<w:rPr> +<w:rFonts w:ascii="Tahoma" w:hAnsi="Tahoma" w:cs="Tahoma"/> +<w:b/> +<w:bCs/> +<w:color w:val="4F81BD" w:themeColor="accent1"/> +<w:sz w:val="22"/> +<w:szCs w:val="22"/> +</w:rPr> +</w:style> +<w:style w:type="character" w:default="1" w:styleId="DefaultParagraphFont"> +<w:name w:val="Default Paragraph Font"/> +<w:semiHidden/> +<w:unhideWhenUsed/> +</w:style> +<w:style w:type="table" w:default="1" w:styleId="TableNormal"> +<w:name w:val="Normal Table"/> +<w:semiHidden/> +<w:unhideWhenUsed/> +<w:qFormat/> +<w:tblPr> +<w:tblInd w:w="0" w:type="dxa"/> +<w:tblCellMar> +<w:top w:w="0" w:type="dxa"/> +<w:left w:w="108" w:type="dxa"/> +<w:bottom w:w="0" w:type="dxa"/> +<w:right w:w="108" w:type="dxa"/> +</w:tblCellMar> +</w:tblPr> +</w:style> +<w:style w:type="numbering" w:default="1" w:styleId="NoList"> +<w:name w:val="No List"/> +<w:semiHidden/> +<w:unhideWhenUsed/> +</w:style> +<w:style w:type="table" w:styleId="ColorfulGrid-Accent1"> +<w:name w:val="Colorful Grid Accent 1"/> +<w:basedOn w:val="TableNormal"/> +<w:uiPriority w:val="73"/> +<w:rsid w:val="008D6863"/> +<w:pPr> +<w:spacing w:after="0"/> +</w:pPr> +<w:rPr> +<w:color w:val="000000" w:themeColor="text1"/> +<w:sz w:val="22"/> +<w:szCs w:val="22"/> +</w:rPr> +<w:tblPr> +<w:tblStyleRowBandSize w:val="1"/> +<w:tblStyleColBandSize w:val="1"/> +<w:tblInd w:w="0" w:type="dxa"/> +<w:tblBorders> +<w:insideH w:val="single" w:sz="4" w:space="0" w:color="FFFFFF" w:themeColor="background1"/> +</w:tblBorders> +<w:tblCellMar> +<w:top w:w="0" w:type="dxa"/> +<w:left w:w="108" w:type="dxa"/> +<w:bottom w:w="0" w:type="dxa"/> +<w:right w:w="108" w:type="dxa"/> +</w:tblCellMar> +</w:tblPr> +<w:tcPr> +<w:shd w:val="clear" w:color="auto" w:fill="DBE5F1" w:themeFill="accent1" w:themeFillTint="33"/> +</w:tcPr> +<w:tblStylePr w:type="firstRow"> +<w:rPr> +<w:b/> +<w:bCs/> +</w:rPr> +<w:tblPr/> +<w:tcPr> +<w:shd w:val="clear" w:color="auto" w:fill="B8CCE4" w:themeFill="accent1" w:themeFillTint="66"/> +</w:tcPr> +</w:tblStylePr> +<w:tblStylePr w:type="lastRow"> +<w:rPr> +<w:b/> +<w:bCs/> +<w:color w:val="000000" w:themeColor="text1"/> +</w:rPr> +<w:tblPr/> +<w:tcPr> +<w:shd w:val="clear" w:color="auto" w:fill="B8CCE4" w:themeFill="accent1" w:themeFillTint="66"/> +</w:tcPr> +</w:tblStylePr> +<w:tblStylePr w:type="firstCol"> +<w:rPr> +<w:color w:val="FFFFFF" w:themeColor="background1"/> +</w:rPr> +<w:tblPr/> +<w:tcPr> +<w:shd w:val="clear" w:color="auto" w:fill="365F91" w:themeFill="accent1" w:themeFillShade="BF"/> +</w:tcPr> +</w:tblStylePr> +<w:tblStylePr w:type="lastCol"> +<w:rPr> +<w:color w:val="FFFFFF" w:themeColor="background1"/> +</w:rPr> +<w:tblPr/> +<w:tcPr> +<w:shd w:val="clear" w:color="auto" w:fill="365F91" w:themeFill="accent1" w:themeFillShade="BF"/> +</w:tcPr> +</w:tblStylePr> +<w:tblStylePr w:type="band1Vert"> +<w:tblPr/> +<w:tcPr> +<w:shd w:val="clear" w:color="auto" w:fill="A7BFDE" w:themeFill="accent1" w:themeFillTint="7F"/> +</w:tcPr> +</w:tblStylePr> +<w:tblStylePr w:type="band1Horz"> +<w:tblPr/> +<w:tcPr> +<w:shd w:val="clear" w:color="auto" w:fill="A7BFDE" w:themeFill="accent1" w:themeFillTint="7F"/> +</w:tcPr> +</w:tblStylePr> +</w:style> +<w:style w:type="character" w:customStyle="1" w:styleId="Heading1Char"> +<w:name w:val="Heading 1 Char"/> +<w:basedOn w:val="DefaultParagraphFont"/> +<w:link w:val="Heading1"/> +<w:uiPriority w:val="9"/> +<w:rsid w:val="00E315A3"/> +<w:rPr> +<w:rFonts w:ascii="Tahoma" w:hAnsi="Tahoma" w:cs="Tahoma"/> +<w:b/> +<w:bCs/> +<w:color w:val="345A8A" w:themeColor="accent1" w:themeShade="B5"/> +<w:sz w:val="32"/> +<w:szCs w:val="32"/> +</w:rPr> +</w:style> +<w:style w:type="character" w:customStyle="1" w:styleId="Heading2Char"> +<w:name w:val="Heading 2 Char"/> +<w:basedOn w:val="DefaultParagraphFont"/> +<w:link w:val="Heading2"/> +<w:uiPriority w:val="9"/> +<w:rsid w:val="00E315A3"/> +<w:rPr> +<w:rFonts w:ascii="Tahoma" w:hAnsi="Tahoma" w:cs="Tahoma"/> +<w:b/> +<w:bCs/> +<w:color w:val="4F81BD" w:themeColor="accent1"/> +<w:sz w:val="26"/> +<w:szCs w:val="26"/> +</w:rPr> +</w:style> +<w:style w:type="paragraph" w:styleId="ListBullet"> +<w:name w:val="List Bullet"/> +<w:basedOn w:val="Normal"/> +<w:rsid w:val="00784D58"/> +<w:pPr> +<w:numPr> +<w:numId w:val="8"/> +</w:numPr> +<w:contextualSpacing/> +</w:pPr> +</w:style> +<w:style w:type="paragraph" w:styleId="ListNumber"> +<w:name w:val="List Number"/> +<w:basedOn w:val="Normal"/> +<w:rsid w:val="00784D58"/> +<w:pPr> +<w:numPr> +<w:numId w:val="13"/> +</w:numPr> +<w:contextualSpacing/> +</w:pPr> +</w:style> +<w:style w:type="paragraph" w:styleId="BodyText"> +<w:name w:val="Body Text"/> +<w:basedOn w:val="Normal"/> +<w:link w:val="BodyTextChar"/> +<w:rsid w:val="00BC48D5"/> +<w:pPr> +<w:spacing w:after="120"/> +</w:pPr> +</w:style> +<w:style w:type="character" w:customStyle="1" w:styleId="BodyTextChar"> +<w:name w:val="Body Text Char"/> +<w:basedOn w:val="DefaultParagraphFont"/> +<w:link w:val="BodyText"/> +<w:rsid w:val="00BC48D5"/> +</w:style> +<w:style w:type="paragraph" w:styleId="Caption"> +<w:name w:val="caption"/> +<w:basedOn w:val="Normal"/> +<w:next w:val="Normal"/> +<w:rsid w:val="00D61392"/> +<w:pPr> +<w:spacing w:after="60"/> +</w:pPr> +<w:rPr> +<w:b/> +<w:bCs/> +<w:color w:val="4F81BD" w:themeColor="accent1"/> +<w:sz w:val="18"/> +<w:szCs w:val="18"/> +</w:rPr> +</w:style> +<w:style w:type="paragraph" w:customStyle="1" w:styleId="Image"> +<w:name w:val="Image"/> +<w:basedOn w:val="Normal"/> +<w:qFormat/> +<w:rsid w:val="00C06113"/> +<w:pPr> +<w:spacing w:after="0"/> +<w:jc w:val="center"/> +</w:pPr> +</w:style> +</w:styles> \ No newline at end of file diff --git a/wetb/utils/report_generator/docx_document/docx-template_clean/word/styles_old.xml b/wetb/utils/report_generator/docx_document/docx-template_clean/word/styles_old.xml new file mode 100644 index 0000000000000000000000000000000000000000..b2e824ce7c4439b3e0087b8c865260785c9b9c13 --- /dev/null +++ b/wetb/utils/report_generator/docx_document/docx-template_clean/word/styles_old.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<w:styles xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"><w:docDefaults><w:rPrDefault><w:rPr><w:rFonts w:asciiTheme="minorHAnsi" w:eastAsiaTheme="minorHAnsi" w:hAnsiTheme="minorHAnsi" w:cstheme="minorBidi"/><w:sz w:val="24"/><w:szCs w:val="24"/><w:lang w:val="en-US" w:eastAsia="en-US" w:bidi="ar-SA"/></w:rPr></w:rPrDefault><w:pPrDefault><w:pPr><w:spacing w:after="200"/></w:pPr></w:pPrDefault></w:docDefaults><w:latentStyles w:defLockedState="0" w:defUIPriority="0" w:defSemiHidden="0" w:defUnhideWhenUsed="0" w:defQFormat="0" w:count="276"/><w:style w:type="paragraph" w:default="1" w:styleId="Normal"><w:name w:val="Normal"/><w:qFormat/><w:rsid w:val="000D33D5"/></w:style><w:style w:type="paragraph" w:styleId="Heading1"><w:name w:val="heading 1"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:link w:val="Heading1Char"/><w:uiPriority w:val="9"/><w:qFormat/><w:rsid w:val="00E315A3"/><w:pPr><w:keepNext/><w:keepLines/><w:spacing w:before="480" w:after="0"/><w:outlineLvl w:val="0"/></w:pPr><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:b/><w:bCs/><w:color w:val="345A8A" w:themeColor="accent1" w:themeShade="B5"/><w:sz w:val="32"/><w:szCs w:val="32"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading2"><w:name w:val="heading 2"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:link w:val="Heading2Char"/><w:uiPriority w:val="9"/><w:unhideWhenUsed/><w:qFormat/><w:rsid w:val="00E315A3"/><w:pPr><w:keepNext/><w:keepLines/><w:spacing w:before="200" w:after="0"/><w:outlineLvl w:val="1"/></w:pPr><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:b/><w:bCs/><w:color w:val="4F81BD" w:themeColor="accent1"/><w:sz w:val="26"/><w:szCs w:val="26"/></w:rPr></w:style><w:style w:type="character" w:default="1" w:styleId="DefaultParagraphFont"><w:name w:val="Default Paragraph Font"/><w:semiHidden/><w:unhideWhenUsed/></w:style><w:style w:type="table" w:default="1" w:styleId="TableNormal"><w:name w:val="Normal Table"/><w:semiHidden/><w:unhideWhenUsed/><w:qFormat/><w:tblPr><w:tblInd w:w="0" w:type="dxa"/><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPr></w:style><w:style w:type="numbering" w:default="1" w:styleId="NoList"><w:name w:val="No List"/><w:semiHidden/><w:unhideWhenUsed/></w:style><w:style w:type="table" w:styleId="ColorfulGrid-Accent1"><w:name w:val="Colorful Grid Accent 1"/><w:basedOn w:val="TableNormal"/><w:uiPriority w:val="73"/><w:rsid w:val="008D6863"/><w:pPr><w:spacing w:after="0"/></w:pPr><w:rPr><w:color w:val="000000" w:themeColor="text1"/><w:sz w:val="22"/><w:szCs w:val="22"/></w:rPr><w:tblPr><w:tblStyleRowBandSize w:val="1"/><w:tblStyleColBandSize w:val="1"/><w:tblInd w:w="0" w:type="dxa"/><w:tblBorders><w:insideH w:val="single" w:sz="4" w:space="0" w:color="FFFFFF" w:themeColor="background1"/></w:tblBorders><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPr><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="DBE5F1" w:themeFill="accent1" w:themeFillTint="33"/></w:tcPr><w:tblStylePr w:type="firstRow"><w:rPr><w:b/><w:bCs/></w:rPr><w:tblPr/><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="B8CCE4" w:themeFill="accent1" w:themeFillTint="66"/></w:tcPr></w:tblStylePr><w:tblStylePr w:type="lastRow"><w:rPr><w:b/><w:bCs/><w:color w:val="000000" w:themeColor="text1"/></w:rPr><w:tblPr/><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="B8CCE4" w:themeFill="accent1" w:themeFillTint="66"/></w:tcPr></w:tblStylePr><w:tblStylePr w:type="firstCol"><w:rPr><w:color w:val="FFFFFF" w:themeColor="background1"/></w:rPr><w:tblPr/><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="365F91" w:themeFill="accent1" w:themeFillShade="BF"/></w:tcPr></w:tblStylePr><w:tblStylePr w:type="lastCol"><w:rPr><w:color w:val="FFFFFF" w:themeColor="background1"/></w:rPr><w:tblPr/><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="365F91" w:themeFill="accent1" w:themeFillShade="BF"/></w:tcPr></w:tblStylePr><w:tblStylePr w:type="band1Vert"><w:tblPr/><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="A7BFDE" w:themeFill="accent1" w:themeFillTint="7F"/></w:tcPr></w:tblStylePr><w:tblStylePr w:type="band1Horz"><w:tblPr/><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="A7BFDE" w:themeFill="accent1" w:themeFillTint="7F"/></w:tcPr></w:tblStylePr></w:style><w:style w:type="character" w:customStyle="1" w:styleId="Heading1Char"><w:name w:val="Heading 1 Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="Heading1"/><w:uiPriority w:val="9"/><w:rsid w:val="00E315A3"/><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:b/><w:bCs/><w:color w:val="345A8A" w:themeColor="accent1" w:themeShade="B5"/><w:sz w:val="32"/><w:szCs w:val="32"/></w:rPr></w:style><w:style w:type="character" w:customStyle="1" w:styleId="Heading2Char"><w:name w:val="Heading 2 Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="Heading2"/><w:uiPriority w:val="9"/><w:rsid w:val="00E315A3"/><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:b/><w:bCs/><w:color w:val="4F81BD" w:themeColor="accent1"/><w:sz w:val="26"/><w:szCs w:val="26"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListBullet"><w:name w:val="List Bullet"/><w:basedOn w:val="Normal"/><w:rsid w:val="00784D58"/><w:pPr><w:numPr><w:numId w:val="8"/></w:numPr><w:contextualSpacing/></w:pPr></w:style><w:style w:type="paragraph" w:styleId="ListNumber"><w:name w:val="List Number"/><w:basedOn w:val="Normal"/><w:rsid w:val="00784D58"/><w:pPr><w:numPr><w:numId w:val="13"/></w:numPr><w:contextualSpacing/></w:pPr></w:style><w:style w:type="paragraph" w:styleId="BodyText"><w:name w:val="Body Text"/><w:basedOn w:val="Normal"/><w:link w:val="BodyTextChar"/><w:rsid w:val="00BC48D5"/><w:pPr><w:spacing w:after="120"/></w:pPr></w:style><w:style w:type="character" w:customStyle="1" w:styleId="BodyTextChar"><w:name w:val="Body Text Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="BodyText"/><w:rsid w:val="00BC48D5"/></w:style><w:style w:type="paragraph" w:styleId="Caption"><w:name w:val="caption"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00D61392"/><w:rPr><w:b/><w:bCs/><w:color w:val="4F81BD" w:themeColor="accent1"/><w:sz w:val="18"/><w:szCs w:val="18"/></w:rPr></w:style><w:style w:type="paragraph" w:customStyle="1" w:styleId="Image"><w:name w:val="Image"/><w:basedOn w:val="Normal"/><w:qFormat/><w:rsid w:val="00C06113"/><w:pPr><w:spacing w:after="0"/><w:jc w:val="center"/></w:pPr></w:style></w:styles> \ No newline at end of file diff --git a/wetb/utils/report_generator/docx_document/docx-template_clean/word/styles_old2.xml b/wetb/utils/report_generator/docx_document/docx-template_clean/word/styles_old2.xml new file mode 100644 index 0000000000000000000000000000000000000000..a778aee26ef853e4111d328da1dd63b402793282 --- /dev/null +++ b/wetb/utils/report_generator/docx_document/docx-template_clean/word/styles_old2.xml @@ -0,0 +1,272 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<w:styles xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> +<w:docDefaults> +<w:rPrDefault> +<w:rPr> +<w:rFonts w:asciiTheme="minorHAnsi" w:eastAsiaTheme="minorHAnsi" w:hAnsiTheme="minorHAnsi" w:cstheme="minorBidi"/> +<w:sz w:val="24"/> +<w:szCs w:val="24"/> +<w:lang w:val="en-US" w:eastAsia="en-US" w:bidi="ar-SA"/> +</w:rPr> +</w:rPrDefault> +<w:pPrDefault> +<w:pPr> +<w:spacing w:after="200"/> +</w:pPr> +</w:pPrDefault> +</w:docDefaults> +<w:latentStyles w:defLockedState="0" w:defUIPriority="0" w:defSemiHidden="0" w:defUnhideWhenUsed="0" w:defQFormat="0" w:count="276"/> +<w:style w:type="paragraph" w:default="1" w:styleId="Normal"> +<w:name w:val="Normal"/> +<w:qFormat/> +<w:rsid w:val="000D33D5"/> +<w:rFonts w:ascii="Tahoma" w:hAnsi="Tahoma" w:cs="Tahoma"/> +</w:style> +<w:style w:type="paragraph" w:styleId="Heading1"> +<w:name w:val="heading 1"/> +<w:basedOn w:val="Normal"/> +<w:next w:val="Normal"/> +<w:link w:val="Heading1Char"/> +<w:uiPriority w:val="9"/> +<w:qFormat/> +<w:rsid w:val="00E315A3"/> +<w:pPr> +<w:keepNext/> +<w:keepLines/> +<w:spacing w:before="480" w:after="0"/> +<w:outlineLvl w:val="0"/> +</w:pPr> +<w:rPr> +<w:rFonts w:ascii="Tahoma" w:hAnsi="Tahoma" w:cs="Tahoma"/> +<w:b/> +<w:bCs/> +<w:color w:val="345A8A" w:themeColor="accent1" w:themeShade="B5"/> +<w:sz w:val="32"/> +<w:szCs w:val="32"/> +</w:rPr> +</w:style> +<w:style w:type="paragraph" w:styleId="Heading2"> +<w:name w:val="heading 2"/> +<w:basedOn w:val="Normal"/> +<w:next w:val="Normal"/> +<w:link w:val="Heading2Char"/> +<w:uiPriority w:val="9"/> +<w:unhideWhenUsed/> +<w:qFormat/> +<w:rsid w:val="00E315A3"/> +<w:pPr> +<w:keepNext/> +<w:keepLines/> +<w:spacing w:before="200" w:after="0"/> +<w:outlineLvl w:val="1"/> +</w:pPr> +<w:rPr> +<w:rFonts w:ascii="Tahoma" w:hAnsi="Tahoma" w:cs="Tahoma"/> +<w:b/> +<w:bCs/> +<w:color w:val="4F81BD" w:themeColor="accent1"/> +<w:sz w:val="26"/> +<w:szCs w:val="26"/> +</w:rPr> +</w:style> +<w:style w:type="character" w:default="1" w:styleId="DefaultParagraphFont"> +<w:name w:val="Default Paragraph Font"/> +<w:semiHidden/> +<w:unhideWhenUsed/> +</w:style> +<w:style w:type="table" w:default="1" w:styleId="TableNormal"> +<w:name w:val="Normal Table"/> +<w:semiHidden/> +<w:unhideWhenUsed/> +<w:qFormat/> +<w:tblPr> +<w:tblInd w:w="0" w:type="dxa"/> +<w:tblCellMar> +<w:top w:w="0" w:type="dxa"/> +<w:left w:w="108" w:type="dxa"/> +<w:bottom w:w="0" w:type="dxa"/> +<w:right w:w="108" w:type="dxa"/> +</w:tblCellMar> +</w:tblPr> +</w:style> +<w:style w:type="numbering" w:default="1" w:styleId="NoList"> +<w:name w:val="No List"/> +<w:semiHidden/> +<w:unhideWhenUsed/> +</w:style> +<w:style w:type="table" w:styleId="ColorfulGrid-Accent1"> +<w:name w:val="Colorful Grid Accent 1"/> +<w:basedOn w:val="TableNormal"/> +<w:uiPriority w:val="73"/> +<w:rsid w:val="008D6863"/> +<w:pPr> +<w:spacing w:after="0"/> +</w:pPr> +<w:rPr> +<w:color w:val="000000" w:themeColor="text1"/> +<w:sz w:val="22"/> +<w:szCs w:val="22"/> +</w:rPr> +<w:tblPr> +<w:tblStyleRowBandSize w:val="1"/> +<w:tblStyleColBandSize w:val="1"/> +<w:tblInd w:w="0" w:type="dxa"/> +<w:tblBorders> +<w:insideH w:val="single" w:sz="4" w:space="0" w:color="FFFFFF" w:themeColor="background1"/> +</w:tblBorders> +<w:tblCellMar> +<w:top w:w="0" w:type="dxa"/> +<w:left w:w="108" w:type="dxa"/> +<w:bottom w:w="0" w:type="dxa"/> +<w:right w:w="108" w:type="dxa"/> +</w:tblCellMar> +</w:tblPr> +<w:tcPr> +<w:shd w:val="clear" w:color="auto" w:fill="DBE5F1" w:themeFill="accent1" w:themeFillTint="33"/> +</w:tcPr> +<w:tblStylePr w:type="firstRow"> +<w:rPr> +<w:b/> +<w:bCs/> +</w:rPr> +<w:tblPr/> +<w:tcPr> +<w:shd w:val="clear" w:color="auto" w:fill="B8CCE4" w:themeFill="accent1" w:themeFillTint="66"/> +</w:tcPr> +</w:tblStylePr> +<w:tblStylePr w:type="lastRow"> +<w:rPr> +<w:b/> +<w:bCs/> +<w:color w:val="000000" w:themeColor="text1"/> +</w:rPr> +<w:tblPr/> +<w:tcPr> +<w:shd w:val="clear" w:color="auto" w:fill="B8CCE4" w:themeFill="accent1" w:themeFillTint="66"/> +</w:tcPr> +</w:tblStylePr> +<w:tblStylePr w:type="firstCol"> +<w:rPr> +<w:color w:val="FFFFFF" w:themeColor="background1"/> +</w:rPr> +<w:tblPr/> +<w:tcPr> +<w:shd w:val="clear" w:color="auto" w:fill="365F91" w:themeFill="accent1" w:themeFillShade="BF"/> +</w:tcPr> +</w:tblStylePr> +<w:tblStylePr w:type="lastCol"> +<w:rPr> +<w:color w:val="FFFFFF" w:themeColor="background1"/> +</w:rPr> +<w:tblPr/> +<w:tcPr> +<w:shd w:val="clear" w:color="auto" w:fill="365F91" w:themeFill="accent1" w:themeFillShade="BF"/> +</w:tcPr> +</w:tblStylePr> +<w:tblStylePr w:type="band1Vert"> +<w:tblPr/> +<w:tcPr> +<w:shd w:val="clear" w:color="auto" w:fill="A7BFDE" w:themeFill="accent1" w:themeFillTint="7F"/> +</w:tcPr> +</w:tblStylePr> +<w:tblStylePr w:type="band1Horz"> +<w:tblPr/> +<w:tcPr> +<w:shd w:val="clear" w:color="auto" w:fill="A7BFDE" w:themeFill="accent1" w:themeFillTint="7F"/> +</w:tcPr> +</w:tblStylePr> +</w:style> +<w:style w:type="character" w:customStyle="1" w:styleId="Heading1Char"> +<w:name w:val="Heading 1 Char"/> +<w:basedOn w:val="DefaultParagraphFont"/> +<w:link w:val="Heading1"/> +<w:uiPriority w:val="9"/> +<w:rsid w:val="00E315A3"/> +<w:rPr> +<w:rFonts w:ascii="Tahoma" w:hAnsi="Tahoma" w:cs="Tahoma"/> +<w:b/> +<w:bCs/> +<w:color w:val="345A8A" w:themeColor="accent1" w:themeShade="B5"/> +<w:sz w:val="32"/> +<w:szCs w:val="32"/> +</w:rPr> +</w:style> +<w:style w:type="character" w:customStyle="1" w:styleId="Heading2Char"> +<w:name w:val="Heading 2 Char"/> +<w:basedOn w:val="DefaultParagraphFont"/> +<w:link w:val="Heading2"/> +<w:uiPriority w:val="9"/> +<w:rsid w:val="00E315A3"/> +<w:rPr> +<w:rFonts w:ascii="Tahoma" w:hAnsi="Tahoma" w:cs="Tahoma"/> +<w:b/> +<w:bCs/> +<w:color w:val="4F81BD" w:themeColor="accent1"/> +<w:sz w:val="26"/> +<w:szCs w:val="26"/> +</w:rPr> +</w:style> +<w:style w:type="paragraph" w:styleId="ListBullet"> +<w:name w:val="List Bullet"/> +<w:basedOn w:val="Normal"/> +<w:rsid w:val="00784D58"/> +<w:pPr> +<w:numPr> +<w:numId w:val="8"/> +</w:numPr> +<w:contextualSpacing/> +</w:pPr> +</w:style> +<w:style w:type="paragraph" w:styleId="ListNumber"> +<w:name w:val="List Number"/> +<w:basedOn w:val="Normal"/> +<w:rsid w:val="00784D58"/> +<w:pPr> +<w:numPr> +<w:numId w:val="13"/> +</w:numPr> +<w:contextualSpacing/> +</w:pPr> +</w:style> +<w:style w:type="paragraph" w:styleId="BodyText"> +<w:name w:val="Body Text"/> +<w:basedOn w:val="Normal"/> +<w:link w:val="BodyTextChar"/> +<w:rsid w:val="00BC48D5"/> +<w:pPr> +<w:spacing w:after="120"/> +</w:pPr> +</w:style> +<w:style w:type="character" w:customStyle="1" w:styleId="BodyTextChar"> +<w:name w:val="Body Text Char"/> +<w:basedOn w:val="DefaultParagraphFont"/> +<w:link w:val="BodyText"/> +<w:rsid w:val="00BC48D5"/> +</w:style> +<w:style w:type="paragraph" w:styleId="Caption"> +<w:name w:val="caption"/> +<w:basedOn w:val="Normal"/> +<w:next w:val="Normal"/> +<w:rsid w:val="00D61392"/> +<w:pPr> +<w:spacing w:after="60"/> +</w:pPr> +<w:rPr> +<w:b/> +<w:bCs/> +<w:color w:val="4F81BD" w:themeColor="accent1"/> +<w:sz w:val="18"/> +<w:szCs w:val="18"/> +</w:rPr> +</w:style> +<w:style w:type="paragraph" w:customStyle="1" w:styleId="Image"> +<w:name w:val="Image"/> +<w:basedOn w:val="Normal"/> +<w:qFormat/> +<w:rsid w:val="00C06113"/> +<w:pPr> +<w:spacing w:after="0"/> +<w:jc w:val="center"/> +</w:pPr> +</w:style> +</w:styles> \ No newline at end of file diff --git a/wetb/utils/report_generator/docx_document/docx-template_clean/word/theme/theme1.xml b/wetb/utils/report_generator/docx_document/docx-template_clean/word/theme/theme1.xml new file mode 100644 index 0000000000000000000000000000000000000000..de62be957503a542a3da002a5cb1502c0058449b --- /dev/null +++ b/wetb/utils/report_generator/docx_document/docx-template_clean/word/theme/theme1.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office Theme"><a:themeElements><a:clrScheme name="Office"><a:dk1><a:sysClr val="windowText" lastClr="000000"/></a:dk1><a:lt1><a:sysClr val="window" lastClr="FFFFFF"/></a:lt1><a:dk2><a:srgbClr val="1F497D"/></a:dk2><a:lt2><a:srgbClr val="EEECE1"/></a:lt2><a:accent1><a:srgbClr val="4F81BD"/></a:accent1><a:accent2><a:srgbClr val="C0504D"/></a:accent2><a:accent3><a:srgbClr val="9BBB59"/></a:accent3><a:accent4><a:srgbClr val="8064A2"/></a:accent4><a:accent5><a:srgbClr val="4BACC6"/></a:accent5><a:accent6><a:srgbClr val="F79646"/></a:accent6><a:hlink><a:srgbClr val="0000FF"/></a:hlink><a:folHlink><a:srgbClr val="800080"/></a:folHlink></a:clrScheme><a:fontScheme name="Office"><a:majorFont><a:latin typeface="Calibri"/><a:ea typeface=""/><a:cs typeface=""/><a:font script="Jpan" typeface="ï¼ï¼³ ゴシック"/><a:font script="Hang" typeface="ë§‘ì€ ê³ ë”•"/><a:font script="Hans" typeface="宋体"/><a:font script="Hant" typeface="新細明體"/><a:font script="Arab" typeface="Times New Roman"/><a:font script="Hebr" typeface="Times New Roman"/><a:font script="Thai" typeface="Angsana New"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="MoolBoran"/><a:font script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Times New Roman"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:majorFont><a:minorFont><a:latin typeface="Cambria"/><a:ea typeface=""/><a:cs typeface=""/><a:font script="Jpan" typeface="ï¼ï¼³ 明æœ"/><a:font script="Hang" typeface="ë§‘ì€ ê³ ë”•"/><a:font script="Hans" typeface="宋体"/><a:font script="Hant" typeface="新細明體"/><a:font script="Arab" typeface="Arial"/><a:font script="Hebr" typeface="Arial"/><a:font script="Thai" typeface="Cordia New"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="DaunPenh"/><a:font script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Arial"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:minorFont></a:fontScheme><a:fmtScheme name="Office"><a:fillStyleLst><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="50000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="35000"><a:schemeClr val="phClr"><a:tint val="37000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="15000"/><a:satMod val="350000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="1"/></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="100000"/><a:shade val="100000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="50000"/><a:shade val="100000"/><a:satMod val="350000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="0"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w="9525" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"><a:shade val="95000"/><a:satMod val="105000"/></a:schemeClr></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="25400" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="38100" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln></a:lnStyleLst><a:effectStyleLst><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="20000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="38000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst><a:scene3d><a:camera prst="orthographicFront"><a:rot lat="0" lon="0" rev="0"/></a:camera><a:lightRig rig="threePt" dir="t"><a:rot lat="0" lon="0" rev="1200000"/></a:lightRig></a:scene3d><a:sp3d><a:bevelT w="63500" h="25400"/></a:sp3d></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="40000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="40000"><a:schemeClr val="phClr"><a:tint val="45000"/><a:shade val="99000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="20000"/><a:satMod val="255000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" t="-80000" r="50000" b="180000"/></a:path></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="80000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="30000"/><a:satMod val="200000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" t="50000" r="50000" b="50000"/></a:path></a:gradFill></a:bgFillStyleLst></a:fmtScheme></a:themeElements><a:objectDefaults><a:spDef><a:spPr/><a:bodyPr/><a:lstStyle/><a:style><a:lnRef idx="1"><a:schemeClr val="accent1"/></a:lnRef><a:fillRef idx="3"><a:schemeClr val="accent1"/></a:fillRef><a:effectRef idx="2"><a:schemeClr val="accent1"/></a:effectRef><a:fontRef idx="minor"><a:schemeClr val="lt1"/></a:fontRef></a:style></a:spDef><a:lnDef><a:spPr/><a:bodyPr/><a:lstStyle/><a:style><a:lnRef idx="2"><a:schemeClr val="accent1"/></a:lnRef><a:fillRef idx="0"><a:schemeClr val="accent1"/></a:fillRef><a:effectRef idx="1"><a:schemeClr val="accent1"/></a:effectRef><a:fontRef idx="minor"><a:schemeClr val="tx1"/></a:fontRef></a:style></a:lnDef></a:objectDefaults><a:extraClrSchemeLst/></a:theme> \ No newline at end of file diff --git a/wetb/utils/report_generator/docx_document/docx.py b/wetb/utils/report_generator/docx_document/docx.py new file mode 100644 index 0000000000000000000000000000000000000000..721b1df1bf470bf980235a3162bcc6d7e991bf8b --- /dev/null +++ b/wetb/utils/report_generator/docx_document/docx.py @@ -0,0 +1,1194 @@ +#!/usr/bin/env python2.6 +# -*- coding: utf-8 -*- +""" +Open and modify Microsoft Word 2007 docx files (called 'OpenXML' and +'Office OpenXML' by Microsoft) + +Part of Python's docx module - http://github.com/mikemaccana/python-docx +See LICENSE for licensing information. +""" + +import os +import re +import time +import shutil +import zipfile + +from lxml import etree +from os.path import abspath, basename, join + +from PIL import Image +from mmpe.io import make_dirs + +try: + from PIL.ExifTags import TAGS + from PIL import WmfImagePlugin, PdfImagePlugin, PngImagePlugin, JpegImagePlugin, EpsImagePlugin +except ImportError: + TAGS = {} + +#from exceptions import PendingDeprecationWarning +from warnings import warn + +import logging +pp = lambda t : etree.tostring(t, pretty_print=True) + +log = logging.getLogger(__name__) + +# Record template directory's location which is just 'template' for a docx +# developer or 'site-packages/docx-template' if you have installed docx +template_dir = join(os.path.dirname(__file__.replace("library.zip", '')), 'docx-template') # installed +if not os.path.isdir(template_dir): + template_dir = join(os.path.dirname(__file__.replace("library.zip", '')), 'template') # dev + +# All Word prefixes / namespace matches used in document.xml & core.xml. +# LXML doesn't actually use prefixes (just the real namespace) , but these +# make it easier to copy Word output more easily. +nsprefixes = { + 'mo': 'http://schemas.microsoft.com/office/mac/office/2008/main', + 'o': 'urn:schemas-microsoft-com:office:office', + 've': 'http://schemas.openxmlformats.org/markup-compatibility/2006', + # Text Content + 'w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main', + 'w10': 'urn:schemas-microsoft-com:office:word', + 'wne': 'http://schemas.microsoft.com/office/word/2006/wordml', + 'xml': 'xml', + # Drawing + 'a': 'http://schemas.openxmlformats.org/drawingml/2006/main', + 'm': 'http://schemas.openxmlformats.org/officeDocument/2006/math', + 'mv': 'urn:schemas-microsoft-com:mac:vml', + 'pic': 'http://schemas.openxmlformats.org/drawingml/2006/picture', + 'v': 'urn:schemas-microsoft-com:vml', + 'wp': ('http://schemas.openxmlformats.org/drawingml/2006/wordprocessing' + 'Drawing'), + # Properties (core and extended) + 'cp': ('http://schemas.openxmlformats.org/package/2006/metadata/core-pr' + 'operties'), + 'dc': 'http://purl.org/dc/elements/1.1/', + 'ep': ('http://schemas.openxmlformats.org/officeDocument/2006/extended-' + 'properties'), + 'xsi': 'http://www.w3.org/2001/XMLSchema-instance', + # Content Types + 'ct': 'http://schemas.openxmlformats.org/package/2006/content-types', + # Package Relationships + 'r': ('http://schemas.openxmlformats.org/officeDocument/2006/relationsh' + 'ips'), + 'pr': 'http://schemas.openxmlformats.org/package/2006/relationships', + # Dublin Core document properties + 'dcmitype': 'http://purl.org/dc/dcmitype/', + 'dcterms': 'http://purl.org/dc/terms/'} + + +def opendocx(file): + '''Open a docx file, return a document XML tree''' + mydoc = zipfile.ZipFile(file) + xmlcontent = mydoc.read('word/document.xml') + document = etree.fromstring(xmlcontent) + return document + + +def newdocument(page_margins={'top':2, 'bottom':2, 'left':3, 'right':2}): + document = makeelement('document') + body = makeelement('body') + document.append(body) + #sectPr = makeelement('sectPr') + #pgMar = makeelement('pgMar', attributes={k:str(v * 566.89) for (k, v) in page_margins.items()}) + + #sectPr.append(pgMar) + #body.append(sectPr) + body.append(section_layout(portrait=True)) + return document + +def section_layout(page_margins={'top':2, 'bottom':2, 'left':3, 'right':2}, portrait=True): + sectPr = makeelement('sectPr') + if portrait: + pgsz = makeelement('pgSz', attributes={'w':"12240", 'h':"15840"}) + else: + pgsz = makeelement('pgSz', attributes={'w':"15840", 'h':"12240", 'orient':"landscape"}) + sectPr.append(pgsz) + pgMar = makeelement('pgMar', attributes={k:str(v * 566.89) for (k, v) in page_margins.items()}) + sectPr.append(pgMar) + return sectPr + + +def makeelement(tagname, tagtext=None, nsprefix='w', attributes=None, + attrnsprefix=None): + '''Create an element & return it''' + # Deal with list of nsprefix by making namespacemap + namespacemap = None + if isinstance(nsprefix, list): + namespacemap = {} + for prefix in nsprefix: + namespacemap[prefix] = nsprefixes[prefix] + # FIXME: rest of code below expects a single prefix + nsprefix = nsprefix[0] + if nsprefix: + namespace = '{' + nsprefixes[nsprefix] + '}' + else: + # For when namespace = None + namespace = '' + newelement = etree.Element(namespace + tagname, nsmap=namespacemap) + # Add attributes with namespaces + if attributes: + # If they haven't bothered setting attribute namespace, use an empty + # string (equivalent of no namespace) + if not attrnsprefix: + # Quick hack: it seems every element that has a 'w' nsprefix for + # its tag uses the same prefix for it's attributes + if nsprefix == 'w': + attributenamespace = namespace + else: + attributenamespace = '' + else: + attributenamespace = '{' + nsprefixes[attrnsprefix] + '}' + + for tagattribute in attributes: + newelement.set(attributenamespace + tagattribute, + attributes[tagattribute]) + if tagtext: + newelement.text = tagtext + return newelement + + +def pagebreak(type='page', page_margins={'top':2, 'bottom':2, 'left':3, 'right':2}, portrait=True): + '''Insert a break, default 'page'. + See http://openxmldeveloper.org/forums/thread/4075.aspx + Return our page break element.''' + # Need to enumerate different types of page breaks. + validtypes = ['page', 'section'] + if type not in validtypes: + tmpl = 'Page break style "%s" not implemented. Valid styles: %s.' + raise ValueError(tmpl % (type, validtypes)) + pagebreak = makeelement('p') + if type == 'page': + run = makeelement('r') + br = makeelement('br', attributes={'type': type}) + run.append(br) + pagebreak.append(run) + elif type == 'section': + pPr = makeelement('pPr') +# sectPr = makeelement('sectPr') +# if orient == 'portrait': +# pgSz = makeelement('pgSz', attributes={'w': '12240', 'h': '15840'}) +# elif orient == 'landscape': +# pgSz = makeelement('pgSz', attributes={'h': '12240', 'w': '15840', +# 'orient': 'landscape'}) +# sectPr.append(pgSz) + sectPr = section_layout(page_margins, portrait) + pPr.append(sectPr) + pagebreak.append(pPr) + return pagebreak + + +def paragraph(paratext, style='BodyText', breakbefore=False, jc='left', spacing={'before':0, 'after':6}, font_size=10): + """ + Return a new paragraph element containing *paratext*. The paragraph's + default style is 'Body Text', but a new style may be set using the + *style* parameter. + + @param string jc: Paragraph alignment, possible values: + left, center, right, both (justified), ... + see http://www.schemacentral.com/sc/ooxml/t-w_ST_Jc.html + for a full list + + If *paratext* is a list, add a run for each (text, char_format_str) + 2-tuple in the list. char_format_str is a string containing one or more + of the characters 'b', 'i', or 'u', meaning bold, italic, and underline + respectively. For example: + + paratext = [ + ('some bold text', 'b'), + ('some normal text', ''), + ('some italic underlined text', 'iu') + ] + """ + # Make our elements + paragraph = makeelement('p') + + if not isinstance(paratext, list): + paratext = [(paratext, '')] + text_tuples = [] + for pt in paratext: + text, char_styles_str = (pt if isinstance(pt, (list, tuple)) + else (pt, '')) + text_elm = makeelement('t', tagtext=text) + if len(text.strip()) < len(text): + text_elm.set('{http://www.w3.org/XML/1998/namespace}space', + 'preserve') + text_tuples.append([text_elm, char_styles_str]) + pPr = makeelement('pPr') + pStyle = makeelement('pStyle', attributes={'val': style}) + pJc = makeelement('jc', attributes={'val': jc}) + pPr.append(pStyle) + pPr.append(pJc) + + spacing = makeelement('spacing', attributes={'before':str(spacing.get('before') * 20), 'after':str(spacing.get('after') * 20)}) + pPr.append(spacing) + + + + + # Add the text to the run, and the run to the paragraph + paragraph.append(pPr) + for text_elm, char_styles_str in text_tuples: + run = makeelement('r') + rPr = makeelement('rPr') + sz = makeelement('sz', attributes={'val':str(font_size * 2)}) + rPr.append(sz) + # Apply styles + if 'b' in char_styles_str: + b = makeelement('b') + rPr.append(b) + if 'i' in char_styles_str: + i = makeelement('i') + rPr.append(i) + if 'u' in char_styles_str: + u = makeelement('u', attributes={'val': 'single'}) + rPr.append(u) + run.append(rPr) + # Insert lastRenderedPageBreak for assistive technologies like + # document narrators to know when a page break occurred. + if breakbefore: + lastRenderedPageBreak = makeelement('lastRenderedPageBreak') + run.append(lastRenderedPageBreak) + run.append(text_elm) + paragraph.append(run) + # Return the combined paragraph + return paragraph + + +def contenttypes(): + types = etree.fromstring( + '<Types xmlns="http://schemas.openxmlformats.org/package/2006/conten' + 't-types"></Types>') + parts = { + '/word/theme/theme1.xml': 'application/vnd.openxmlformats-officedocu' + 'ment.theme+xml', + '/word/fontTable.xml': 'application/vnd.openxmlformats-officedocu' + 'ment.wordprocessingml.fontTable+xml', + '/docProps/core.xml': 'application/vnd.openxmlformats-package.co' + 're-properties+xml', + '/docProps/app.xml': 'application/vnd.openxmlformats-officedocu' + 'ment.extended-properties+xml', + '/word/document.xml': 'application/vnd.openxmlformats-officedocu' + 'ment.wordprocessingml.document.main+xml', + '/word/settings.xml': 'application/vnd.openxmlformats-officedocu' + 'ment.wordprocessingml.settings+xml', + '/word/numbering.xml': 'application/vnd.openxmlformats-officedocu' + 'ment.wordprocessingml.numbering+xml', + '/word/styles.xml': 'application/vnd.openxmlformats-officedocu' + 'ment.wordprocessingml.styles+xml', + '/word/webSettings.xml': 'application/vnd.openxmlformats-officedocu' + 'ment.wordprocessingml.webSettings+xml'} + for part in parts: + types.append(makeelement('Override', nsprefix=None, + attributes={'PartName': part, + 'ContentType': parts[part]})) + # Add support for filetypes + filetypes = { + 'gif': 'image/gif', + 'jpeg': 'image/jpeg', + 'jpg': 'image/jpeg', + 'png': 'image/png', + 'emf': 'image/x-emf', + 'rels': 'application/vnd.openxmlformats-package.relationships+xml', + 'xml': 'application/xml' + } + for extension in filetypes: + attrs = { + 'Extension': extension, + 'ContentType': filetypes[extension] + } + default_elm = makeelement('Default', nsprefix=None, attributes=attrs) + types.append(default_elm) + return types + + +def heading(headingtext, headinglevel, lang='en'): + '''Make a new heading, return the heading element''' + lmap = {'en': 'Heading', 'it': 'Titolo'} + # Make our elements + paragraph = makeelement('p') + pr = makeelement('pPr') + pStyle = makeelement( + 'pStyle', attributes={'val': lmap[lang] + str(headinglevel)}) + run = makeelement('r') + text = makeelement('t', tagtext=headingtext) + # Add the text the run, and the run to the paragraph + pr.append(pStyle) + run.append(text) + paragraph.append(pr) + paragraph.append(run) + # Return the combined paragraph + return paragraph + + +def table(contents, heading=True, colw=None, cwunit='dxa', tblw=0, tblmargin=.19, + twunit='auto', borders={"all":{"color":'auto', 'val':'single', 'sz':'4'}}, column_style={}): + """ + Return a table element based on specified parameters + + @param list contents: A list of lists describing contents. Every item in + the list can be a string or a valid XML element + itself. It can also be a list. In that case all the + listed elements will be merged into the cell. + @param bool heading: Tells whether first line should be treated as + heading or not + @param list colw: list of integer column widths specified in wunitS. + @param str cwunit: Unit used for column width: + 'pct' : fiftieths of a percent + 'dxa' : twentieths of a point + 'nil' : no width + 'auto' : automagically determined + @param int tblw: Table width + @param str twunit: Unit used for table width. Same possible values as + cwunit. + @param dict borders: Dictionary defining table border. Supported keys + are: 'top', 'left', 'bottom', 'right', + 'insideH', 'insideV', 'all'. + When specified, the 'all' key has precedence over + others. Each key must define a dict of border + attributes: + color : The color of the border, in hex or + 'auto' + space : The space, measured in points + sz : The size of the border, in eighths of + a point + val : The style of the border, see + http://www.schemacentral.com/sc/ooxml/t-w_ST_Border.htm + @param list column_style: Specify the style for each colum, list of dicts. + supported keys: + 'align' : specify the alignment, see paragraph + documentation. + @return lxml.etree: Generated XML etree element + """ + table = makeelement('tbl') + columns = len(contents[0]) + # Table properties + tableprops = makeelement('tblPr') + tablestyle = makeelement('tblStyle', attributes={'val': ''}) + tableprops.append(tablestyle) + tableprops.append(makeelement('jc', attributes={'val':'center'})) + tablewidth = makeelement( + 'tblW', attributes={'w': str(tblw), 'type': str(twunit)}) + tableprops.append(tablewidth) + tablemargin = makeelement('tblCellMar') + if isinstance(tblmargin, (int, float)): + tblmargin = {l:tblmargin for l in ['top', 'left', 'bottom', 'right']} + for l in ['top', 'left', 'bottom', 'right']: + margin = makeelement(l, attributes={'w':str(tblmargin.get(l, 0) * 568), 'tppe':str(twunit)}) + tablemargin.append(margin) + tableprops.append(tablemargin) + if len(borders.keys()): + tableborders = makeelement('tblBorders') + for b in ['top', 'left', 'bottom', 'right', 'insideH', 'insideV']: + if b in borders.keys() or 'all' in borders.keys(): + k = 'all' if 'all' in borders.keys() else b + attrs = {} + for a in borders[k].keys(): + attrs[a] = str(borders[k][a]) + borderelem = makeelement(b, attributes=attrs) + tableborders.append(borderelem) + tableprops.append(tableborders) + tablelook = makeelement('tblLook', attributes={'val': '0400'}) + tableprops.append(tablelook) + table.append(tableprops) + # Table Grid + tablegrid = makeelement('tblGrid') + for i in range(columns): + attrs = {'w': str(colw[i]) if colw else '2390'} + tablegrid.append(makeelement('gridCol', attributes=attrs)) + table.append(tablegrid) + # Heading Row + row = makeelement('tr') + rowprops = makeelement('trPr') + cnfStyle = makeelement('cnfStyle', attributes={'val': '000000100000'}) + rowprops.append(cnfStyle) + row.append(rowprops) + if heading: + i = 0 + for heading in contents[0]: + cell = makeelement('tc') + # Cell properties + cellprops = makeelement('tcPr') + if colw: + wattr = {'w': str(colw[i]), 'type': cwunit} + else: + wattr = {'w': '0', 'type': 'auto'} + cellwidth = makeelement('tcW', attributes=wattr) + cellstyle = makeelement('shd', attributes={'val': 'clear', + 'color': 'auto', + 'fill': 'FFFFFF', + 'themeFill': 'text2', + 'themeFillTint': '99'}) + cellprops.append(cellwidth) + cellprops.append(cellstyle) + cell.append(cellprops) + # Paragraph (Content) + if not isinstance(heading, (list, tuple)): + heading = [heading] + for h in heading: + if isinstance(h, etree._Element): + cell.append(h) + else: + c_style = column_style.get(i, column_style.get('all', {})) + cell.append(paragraph(h, + jc=c_style.get('align', 'left'), + spacing=c_style.get('spacing', {'before':0, 'after':0}), + font_size=c_style.get('font_size', 10))) + row.append(cell) + i += 1 + table.append(row) + # Contents Rows + for contentrow in contents[1 if heading else 0:]: + row = makeelement('tr') + i = 0 + for content in contentrow: + cell = makeelement('tc') + # Properties + cellprops = makeelement('tcPr') + if colw: + wattr = {'w': str(colw[i]), 'type': cwunit} + else: + wattr = {'w': '0', 'type': 'auto'} + cellwidth = makeelement('tcW', attributes=wattr) + cellprops.append(cellwidth) + cell.append(cellprops) + # Paragraph (Content) + if not isinstance(content, (list, tuple)): + content = [content] + for c in content: + if isinstance(c, etree._Element): + cell.append(c) + else: + c_style = column_style.get(i, column_style.get('all', {})) + cell.append(paragraph(c, + jc=c_style.get('align', 'left'), + spacing=c_style.get('spacing', {'before':0, 'after':0}), + font_size=c_style.get('font_size', 10))) + #if "<ns0:p>" not in etree.tostring(cell): + # cell.append(paragraph("")) + row.append(cell) + i += 1 + table.append(row) + return table + + +def picture( + relationshiplist, picname, picdescription, pixelwidth=None, + pixelheight=None, nochangeaspect=True, nochangearrowheads=True, + imagefiledict=None): + """ + Take a relationshiplist, picture file name, and return a paragraph + containing the image and an updated relationshiplist + """ +# if imagefiledict is None: +# warn( +# 'Using picture() without imagefiledict parameter will be depreca' +# 'ted in the future.', PendingDeprecationWarning +# ) + + # http://openxmldeveloper.org/articles/462.aspx + # Create an image. Size may be specified, otherwise it will based on the + # pixel size of image. Return a paragraph containing the picture + + # Set relationship ID to that of the image or the first available one + picid = '2' + picpath = abspath(picname) + + if imagefiledict is not None: + # Keep track of the image files in a separate dictionary so they don't + # need to be copied into the template directory + if picpath not in imagefiledict: + picrelid = 'rId' + str(len(relationshiplist) + 1) + imagefiledict[picpath] = picrelid + + relationshiplist.append([ + 'http://schemas.openxmlformats.org/officeDocument/2006/relat' + 'ionships/image', + 'media/%s_%s' % (picrelid, basename(picpath)) + ]) + else: + picrelid = imagefiledict[picpath] + else: + # Copy files into template directory for backwards compatibility + # Images still accumulate in the template directory this way + picrelid = 'rId' + str(len(relationshiplist) + 1) + + media_dir = join(template_dir, 'word', 'media/') + if not os.path.isdir(media_dir): + make_dirs(media_dir) + + name, ext = os.path.splitext(picname) + unique_picname = name + str(len(os.listdir(media_dir))) + ext + + + relationshiplist.append([ + 'http://schemas.openxmlformats.org/officeDocument/2006/relations' + 'hips/image', 'media/' + os.path.basename(unique_picname) + ]) + + + + shutil.copyfile(picname, join(media_dir, os.path.basename(unique_picname))) + with open(picname, 'rb') as f: + image = Image.open(f) + + # Extract EXIF data, if available + imageExif = {} + try: + exif = image._getexif() + except: + exif = {} + + # Check if the user has specified a size + if not pixelwidth or not pixelheight: + # If not, get info from the picture itself + pixelwidth, pixelheight = image.size[0:2] + + for tag, value in exif.items(): + imageExif[TAGS.get(tag, tag)] = value + + imageOrientation = imageExif.get('Orientation', 1) + imageAngle = { + 1: 0, 2: 0, 3: 180, 4: 0, 5: 90, 6: 90, 7: 270, 8: 270 + }[imageOrientation] + imageFlipH = 'true' if imageOrientation in (2, 5, 7) else 'false' + imageFlipV = 'true' if imageOrientation == 4 else 'false' + + + + # Swap width and height if necessary + if imageOrientation in (5, 6, 7, 8): + pixelwidth, pixelheight = pixelheight, pixelwidth + + # OpenXML measures on-screen objects in English Metric Units + # 1cm = 36000 EMUs + emuperpixel = 12700 + width = str(int(pixelwidth * emuperpixel)) + height = str(int(pixelheight * emuperpixel)) + + # There are 3 main elements inside a picture + # 1. The Blipfill - specifies how the image fills the picture area + # (stretch, tile, etc.) + blipfill = makeelement('blipFill', nsprefix='pic') + blipfill.append(makeelement('blip', nsprefix='a', attrnsprefix='r', + attributes={'embed': picrelid})) + stretch = makeelement('stretch', nsprefix='a') + stretch.append(makeelement('fillRect', nsprefix='a')) + blipfill.append(makeelement('srcRect', nsprefix='a')) + blipfill.append(stretch) + + # 2. The non visual picture properties + nvpicpr = makeelement('nvPicPr', nsprefix='pic') + cnvpr = makeelement( + 'cNvPr', nsprefix='pic', + attributes={'id': '0', 'name': 'Picture 1', 'descr': picdescription} + ) + nvpicpr.append(cnvpr) + cnvpicpr = makeelement('cNvPicPr', nsprefix='pic') + cnvpicpr.append(makeelement( + 'picLocks', nsprefix='a', + attributes={'noChangeAspect': str(int(nochangeaspect)), + 'noChangeArrowheads': str(int(nochangearrowheads))})) + nvpicpr.append(cnvpicpr) + + # 3. The Shape properties + sppr = makeelement('spPr', nsprefix='pic', attributes={'bwMode': 'auto'}) + xfrm = makeelement( + 'xfrm', nsprefix='a', attributes={ + 'rot': str(imageAngle * 60000), 'flipH': imageFlipH, + 'flipV': imageFlipV + } + ) + xfrm.append( + makeelement('off', nsprefix='a', attributes={'x': '0', 'y': '0'}) + ) + xfrm.append( + makeelement( + 'ext', nsprefix='a', attributes={'cx': width, 'cy': height} + ) + ) + prstgeom = makeelement( + 'prstGeom', nsprefix='a', attributes={'prst': 'rect'} + ) + prstgeom.append(makeelement('avLst', nsprefix='a')) + sppr.append(xfrm) + sppr.append(prstgeom) + + # Add our 3 parts to the picture element + pic = makeelement('pic', nsprefix='pic') + pic.append(nvpicpr) + pic.append(blipfill) + pic.append(sppr) + + # Now make the supporting elements + # The following sequence is just: make element, then add its children + graphicdata = makeelement( + 'graphicData', nsprefix='a', + attributes={'uri': ('http://schemas.openxmlformats.org/drawingml/200' + '6/picture')}) + graphicdata.append(pic) + graphic = makeelement('graphic', nsprefix='a') + graphic.append(graphicdata) + + framelocks = makeelement('graphicFrameLocks', nsprefix='a', + attributes={'noChangeAspect': '1'}) + framepr = makeelement('cNvGraphicFramePr', nsprefix='wp') + framepr.append(framelocks) + docpr = makeelement('docPr', nsprefix='wp', + attributes={'id': picid, 'name': 'Picture 1', + 'descr': picdescription}) + effectextent = makeelement('effectExtent', nsprefix='wp', + attributes={'l': '25400', 't': '0', 'r': '0', + 'b': '0'}) + extent = makeelement('extent', nsprefix='wp', + attributes={'cx': width, 'cy': height}) + inline = makeelement('inline', attributes={'distT': "0", 'distB': "0", + 'distL': "0", 'distR': "0"}, + nsprefix='wp') + inline.append(extent) + inline.append(effectextent) + inline.append(docpr) + inline.append(framepr) + inline.append(graphic) + drawing = makeelement('drawing') + drawing.append(inline) + run = makeelement('r') + run.append(drawing) + paragraph = makeelement('p') + pPr = makeelement('pPr') + pstyle = makeelement('pStyle', attributes={'val':'Image'}) + pPr.append(pstyle) + pJc = makeelement('jc', attributes={'val': 'center'}) + pPr.append(pJc) + paragraph.append(pPr) + paragraph.append(run) + + + if imagefiledict is not None: + return relationshiplist, paragraph, imagefiledict + else: + return relationshiplist, paragraph + +def caption(tag, caption_text): + + paragraph = makeelement('p') + pPr = makeelement('pPr') + pstyle = makeelement('pStyle', attributes={'val':'Caption'}) + pPr.append(pstyle) + + + pJc = makeelement('jc', attributes={'val': 'center'}) + pPr.append(pJc) + paragraph.append(pPr) + + run = makeelement('r') + t = makeelement('t', attributes={'space':"preserve"}, tagtext=tag + " ") + run.append(t) + paragraph.append(run) + fldSimple = makeelement('fldSimple', attributes={"instr":" SEQ %s \* ARABIC " % tag}) + run = makeelement('r') + rPr = makeelement('rPr') + noProof = makeelement('noProof') + rPr.append(noProof) + run.append(rPr) + t = makeelement('t', tagtext='1') + run.append(t) + fldSimple.append(run) + paragraph.append(fldSimple) + run = makeelement('r') + t = makeelement('t', attributes={'space':"preserve"}, tagtext=" - " + caption_text) + run.append(t) + paragraph.append(run) + paragraph.append(makeelement('bookmarkStart', attributes={'id':'0', 'name':'_GoBack'})) + paragraph.append(makeelement('bookmarkEnd', attributes={'id':'0'})) + + return paragraph + +def search(document, search): + '''Search a document for a regex, return success / fail result''' + result = False + searchre = re.compile(search) + for element in document.iter(): + if element.tag == '{%s}t' % nsprefixes['w']: # t (text) elements + if element.text: + if searchre.search(element.text): + result = True + return result + + +def replace(document, search, replace): + """ + Replace all occurences of string with a different string, return updated + document + """ + newdocument = document + searchre = re.compile(search) + for element in newdocument.iter(): + if element.tag == '{%s}t' % nsprefixes['w']: # t (text) elements + if element.text: + if searchre.search(element.text): + element.text = re.sub(search, replace, element.text) + return newdocument + + +def clean(document): + """ Perform misc cleaning operations on documents. + Returns cleaned document. + """ + + newdocument = document + + # Clean empty text and r tags + for t in ('t', 'r'): + rmlist = [] + for element in newdocument.iter(): + if element.tag == '{%s}%s' % (nsprefixes['w'], t): + if not element.text and not len(element): + rmlist.append(element) + for element in rmlist: + element.getparent().remove(element) + + return newdocument + + +def findTypeParent(element, tag): + """ Finds fist parent of element of the given type + + @param object element: etree element + @param string the tag parent to search for + + @return object element: the found parent or None when not found + """ + + p = element + while True: + p = p.getparent() + if p.tag == tag: + return p + + # Not found + return None + + +def AdvSearch(document, search, bs=3): + '''Return set of all regex matches + + This is an advanced version of python-docx.search() that takes into + account blocks of <bs> elements at a time. + + What it does: + It searches the entire document body for text blocks. + Since the text to search could be spawned across multiple text blocks, + we need to adopt some sort of algorithm to handle this situation. + The smaller matching group of blocks (up to bs) is then adopted. + If the matching group has more than one block, blocks other than first + are cleared and all the replacement text is put on first block. + + Examples: + original text blocks : [ 'Hel', 'lo,', ' world!' ] + search : 'Hello,' + output blocks : [ 'Hello,' ] + + original text blocks : [ 'Hel', 'lo', ' __', 'name', '__!' ] + search : '(__[a-z]+__)' + output blocks : [ '__name__' ] + + @param instance document: The original document + @param str search: The text to search for (regexp) + append, or a list of etree elements + @param int bs: See above + + @return set All occurences of search string + + ''' + + # Compile the search regexp + searchre = re.compile(search) + + matches = [] + + # Will match against searchels. Searchels is a list that contains last + # n text elements found in the document. 1 < n < bs + searchels = [] + + for element in document.iter(): + if element.tag == '{%s}t' % nsprefixes['w']: # t (text) elements + if element.text: + # Add this element to searchels + searchels.append(element) + if len(searchels) > bs: + # Is searchels is too long, remove first elements + searchels.pop(0) + + # Search all combinations, of searchels, starting from + # smaller up to bigger ones + # l = search lenght + # s = search start + # e = element IDs to merge + found = False + for l in range(1, len(searchels) + 1): + if found: + break + for s in range(len(searchels)): + if found: + break + if s + l <= len(searchels): + e = range(s, s + l) + txtsearch = '' + for k in e: + txtsearch += searchels[k].text + + # Searcs for the text in the whole txtsearch + match = searchre.search(txtsearch) + if match: + matches.append(match.group()) + found = True + return set(matches) + + +def advReplace(document, search, replace, bs=3): + """ + Replace all occurences of string with a different string, return updated + document + + This is a modified version of python-docx.replace() that takes into + account blocks of <bs> elements at a time. The replace element can also + be a string or an xml etree element. + + What it does: + It searches the entire document body for text blocks. + Then scan thos text blocks for replace. + Since the text to search could be spawned across multiple text blocks, + we need to adopt some sort of algorithm to handle this situation. + The smaller matching group of blocks (up to bs) is then adopted. + If the matching group has more than one block, blocks other than first + are cleared and all the replacement text is put on first block. + + Examples: + original text blocks : [ 'Hel', 'lo,', ' world!' ] + search / replace: 'Hello,' / 'Hi!' + output blocks : [ 'Hi!', '', ' world!' ] + + original text blocks : [ 'Hel', 'lo,', ' world!' ] + search / replace: 'Hello, world' / 'Hi!' + output blocks : [ 'Hi!!', '', '' ] + + original text blocks : [ 'Hel', 'lo,', ' world!' ] + search / replace: 'Hel' / 'Hal' + output blocks : [ 'Hal', 'lo,', ' world!' ] + + @param instance document: The original document + @param str search: The text to search for (regexp) + @param mixed replace: The replacement text or lxml.etree element to + append, or a list of etree elements + @param int bs: See above + + @return instance The document with replacement applied + + """ + # Enables debug output + DEBUG = False + + newdocument = document + + # Compile the search regexp + searchre = re.compile(search) + + # Will match against searchels. Searchels is a list that contains last + # n text elements found in the document. 1 < n < bs + searchels = [] + + for element in newdocument.iter(): + if element.tag == '{%s}t' % nsprefixes['w']: # t (text) elements + if element.text: + # Add this element to searchels + searchels.append(element) + if len(searchels) > bs: + # Is searchels is too long, remove first elements + searchels.pop(0) + + # Search all combinations, of searchels, starting from + # smaller up to bigger ones + # l = search lenght + # s = search start + # e = element IDs to merge + found = False + for l in range(1, len(searchels) + 1): + if found: + break + #print "slen:", l + for s in range(len(searchels)): + if found: + break + if s + l <= len(searchels): + e = range(s, s + l) + #print "elems:", e + txtsearch = '' + for k in e: + txtsearch += searchels[k].text + + # Searcs for the text in the whole txtsearch + match = searchre.search(txtsearch) + if match: + found = True + + # I've found something :) + if DEBUG: + log.debug("Found element!") + log.debug("Search regexp: %s", + searchre.pattern) + log.debug("Requested replacement: %s", + replace) + log.debug("Matched text: %s", txtsearch) + log.debug("Matched text (splitted): %s", + [i.text for i in searchels]) + log.debug("Matched at position: %s", + match.start()) + log.debug("matched in elements: %s", e) + if isinstance(replace, etree._Element): + log.debug("Will replace with XML CODE") + elif isinstance(replace(list, tuple)): + log.debug("Will replace with LIST OF" + " ELEMENTS") + else: + log.debug("Will replace with:", + re.sub(search, replace, + txtsearch)) + + curlen = 0 + replaced = False + for i in e: + curlen += len(searchels[i].text) + if curlen > match.start() and not replaced: + # The match occurred in THIS element. + # Puth in the whole replaced text + if isinstance(replace, etree._Element): + # Convert to a list and process + # it later + replace = [replace] + if isinstance(replace, (list, tuple)): + # I'm replacing with a list of + # etree elements + # clear the text in the tag and + # append the element after the + # parent paragraph + # (because t elements cannot have + # childs) + p = findTypeParent( + searchels[i], + '{%s}p' % nsprefixes['w']) + searchels[i].text = re.sub( + search, '', txtsearch) + insindex = p.getparent().index(p) + 1 + for r in replace: + p.getparent().insert( + insindex, r) + insindex += 1 + else: + # Replacing with pure text + searchels[i].text = re.sub( + search, replace, txtsearch) + replaced = True + log.debug( + "Replacing in element #: %s", i) + else: + # Clears the other text elements + searchels[i].text = '' + return newdocument + + +def getdocumenttext(document): + '''Return the raw text of a document, as a list of paragraphs.''' + paratextlist = [] + # Compile a list of all paragraph (p) elements + paralist = [] + for element in document.iter(): + # Find p (paragraph) elements + if element.tag == '{' + nsprefixes['w'] + '}p': + paralist.append(element) + # Since a single sentence might be spread over multiple text elements, + # iterate through each paragraph, appending all text (t) children to that + # paragraphs text. + for para in paralist: + paratext = '' + # Loop through each paragraph + for element in para.iter(): + # Find t (text) elements + if element.tag == '{' + nsprefixes['w'] + '}t': + if element.text: + paratext = paratext + element.text + elif element.tag == '{' + nsprefixes['w'] + '}tab': + paratext = paratext + '\t' + # Add our completed paragraph text to the list of paragraph text + if not len(paratext) == 0: + paratextlist.append(paratext) + return paratextlist + + +def coreproperties(title, subject, creator, keywords, lastmodifiedby=None): + """ + Create core properties (common document properties referred to in the + 'Dublin Core' specification). See appproperties() for other stuff. + """ + coreprops = makeelement('coreProperties', nsprefix='cp') + coreprops.append(makeelement('title', tagtext=title, nsprefix='dc')) + coreprops.append(makeelement('subject', tagtext=subject, nsprefix='dc')) + coreprops.append(makeelement('creator', tagtext=creator, nsprefix='dc')) + coreprops.append(makeelement('keywords', tagtext=','.join(keywords), + nsprefix='cp')) + if not lastmodifiedby: + lastmodifiedby = creator + coreprops.append(makeelement('lastModifiedBy', tagtext=lastmodifiedby, + nsprefix='cp')) + coreprops.append(makeelement('revision', tagtext='1', nsprefix='cp')) + coreprops.append( + makeelement('category', tagtext='Examples', nsprefix='cp')) + coreprops.append( + makeelement('description', tagtext='Examples', nsprefix='dc')) + currenttime = time.strftime('%Y-%m-%dT%H:%M:%SZ') + # Document creation and modify times + # Prob here: we have an attribute who name uses one namespace, and that + # attribute's value uses another namespace. + # We're creating the element from a string as a workaround... + for doctime in ['created', 'modified']: + elm_str = ( + '<dcterms:%s xmlns:xsi="http://www.w3.org/2001/XMLSchema-instanc' + 'e" xmlns:dcterms="http://purl.org/dc/terms/" xsi:type="dcterms:' + 'W3CDTF">%s</dcterms:%s>' + ) % (doctime, currenttime, doctime) + coreprops.append(etree.fromstring(elm_str)) + return coreprops + + +def appproperties(): + """ + Create app-specific properties. See docproperties() for more common + document properties. + + """ + appprops = makeelement('Properties', nsprefix='ep') + appprops = etree.fromstring("""<?xml version="1.0" encoding="UTF-8" standalone="yes"?> + <Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"></Properties>""".encode('utf-8')) + props = \ + {'Template': 'Normal.dotm', + 'TotalTime': '6', + 'Pages': '1', + 'Words': '83', + 'Characters': '475', + 'Application': 'Microsoft Word 12.0.0', + 'DocSecurity': '0', + 'Lines': '12', + 'Paragraphs': '8', + 'ScaleCrop': 'false', + 'LinksUpToDate': 'false', + 'CharactersWithSpaces': '583', + 'SharedDoc': 'false', + 'HyperlinksChanged': 'false', + 'AppVersion': '12.0000'} + for prop in props: + appprops.append(makeelement(prop, tagtext=props[prop], nsprefix=None)) + return appprops + + +def websettings(): + '''Generate websettings''' + web = makeelement('webSettings') + web.append(makeelement('allowPNG')) + web.append(makeelement('doNotSaveAsSingleFile')) + return web + + +def relationshiplist(): + relationshiplist = \ + [ #['http://schemas.openxmlformats.org/officeDocument/2006/' + # 'relationships/numbering', 'numbering.xml'], + ['http://schemas.openxmlformats.org/officeDocument/2006/' + 'relationships/styles', 'styles.xml'], + ['http://schemas.openxmlformats.org/officeDocument/2006/' + 'relationships/settings', 'settings.xml'], + ['http://schemas.openxmlformats.org/officeDocument/2006/' + 'relationships/webSettings', 'webSettings.xml'], + ['http://schemas.openxmlformats.org/officeDocument/2006/' + 'relationships/fontTable', 'fontTable.xml'], + ['http://schemas.openxmlformats.org/officeDocument/2006/' + 'relationships/theme', 'theme/theme1.xml']] + return relationshiplist + + +def wordrelationships(relationshiplist): + '''Generate a Word relationships file''' + # Default list of relationships + # FIXME: using string hack instead of making element + #relationships = makeelement('Relationships', nsprefix='pr') + relationships = etree.fromstring( + '<Relationships xmlns="http://schemas.openxmlformats.org/package/2006' + '/relationships"></Relationships>') + count = 0 + for relationship in relationshiplist: + # Relationship IDs (rId) start at 1. + rel_elm = makeelement('Relationship', nsprefix=None, + attributes={'Id': 'rId' + str(count + 1), + 'Type': relationship[0], + 'Target': relationship[1]} + ) + relationships.append(rel_elm) + count += 1 + return relationships + + +def savedocx( + document, coreprops, appprops, contenttypes, websettings, + wordrelationships, output, imagefiledict=None): + """ + Save a modified document + """ +# if imagefiledict is None: +# warn( +# 'Using savedocx() without imagefiledict parameter will be deprec' +# 'ated in the future.', PendingDeprecationWarning +# ) + + assert os.path.isdir(template_dir) + docxfile = zipfile.ZipFile( + output, mode='w', compression=zipfile.ZIP_DEFLATED) + + # Move to the template data path + prev_dir = os.path.abspath('.') # save previous working dir + os.chdir(template_dir) + + # Serialize our trees into out zip file + treesandfiles = {document: 'word/document.xml', + coreprops: 'docProps/core.xml', + appprops: 'docProps/app.xml', + contenttypes: '[Content_Types].xml', + websettings: 'word/webSettings.xml', + wordrelationships: 'word/_rels/document.xml.rels'} + + for tree in treesandfiles: + log.info('Saving: %s' % treesandfiles[tree]) + treestring = etree.tostring(tree, pretty_print=True).replace(b"ns0:space", b"xml:space") + docxfile.writestr(treesandfiles[tree], treestring) + + # Add & compress images, if applicable + if imagefiledict is not None: + for imagepath, picrelid in imagefiledict.items(): + archivename = 'word/media/%s_%s' % (picrelid, basename(imagepath)) + log.info('Saving: %s', archivename) + docxfile.write(imagepath, archivename) + + # Add & compress support files + files_to_ignore = ['.DS_Store'] # nuisance from some os's + for dirpath, dirnames, filenames in os.walk('.'): + for filename in filenames: + if filename in files_to_ignore: + continue + templatefile = join(dirpath, filename) + archivename = templatefile[2:] + log.info('Saving: %s', archivename) + docxfile.write(templatefile, archivename) + + log.info('Saved new file to: %r', output) + docxfile.close() + os.chdir(prev_dir) # restore previous working dir + return diff --git a/wetb/utils/report_generator/docx_document/docx_document.py b/wetb/utils/report_generator/docx_document/docx_document.py new file mode 100644 index 0000000000000000000000000000000000000000..6576d995990a66a5b6ec235bedf2dfebb5edc345 --- /dev/null +++ b/wetb/utils/report_generator/docx_document/docx_document.py @@ -0,0 +1,464 @@ +#!/usr/bin/env python + +""" +This file makes a .docx (Word 2007) file from scratch, showing off most of the +features of python-docx. + +If you need to make documents from scratch, you can use this file as a basis +for your work. + +Part of Python's docx module - http://github.com/mikemaccana/python-docx +See LICENSE for licensing information. +""" + +import os +import re +import shutil + +from mmpe.docx_document.docx import picture, table, caption, pagebreak +from mmpe.docx_document import docx +from lxml import etree + +from mmpe.functions.process_exec import pexec +from contextlib import contextmanager +from mmpe.functions.deep_coding import to_str +from mmpe.io.make_dirs import make_dirs + + +re_bullet_lst = re.compile("[+,\-,*] (.*)") +re_number_lst = re.compile("[\d]+\. (.*)") +inkscape_path = os.path.relpath(os.path.join(os.path.dirname(__file__.replace("library.zip", '')), "inkscape/inkscape.exe")) +pp = lambda t : etree.tostring(t, pretty_print=True) + +def vector_graphics_support(): + return os.path.isfile(inkscape_path) + +def prefered_graphic_format(vector=False): + if vector and vector_graphics_support(): + return "pdf" + else: + return "png" + +class ConversionError(Exception): + pass + + +def DocxDocument(doc, title='', subject='', creator='', keywords=[], page_margins={'top':2, 'bottom':2, 'left':3, 'right':2}, delete_closed=False): + if isinstance(doc, str): + doc = DocxDocumentClass(doc, title, subject, creator, keywords, page_margins, delete_closed) + doc.open_on_exit_lst.append(True) + else: + doc.open_on_exit_lst.append(False) + return doc + +class DocxDocumentClass(object): + open_on_exit_lst = [False] + def __init__(self, filename, title='', subject='', creator='', keywords=[], page_margins={'top':2, 'bottom':2, 'left':3, 'right':2}, delete_closed=False): + if "%" in filename: + self.filename = None + for i in range(100): + f = filename % i + template_dir = os.path.join(os.path.dirname(f), "docx_template_" + os.path.splitext(os.path.basename(f))[0]) + if os.path.isfile(f) or os.path.isdir(template_dir): + if delete_closed: + try: + os.remove(f) + if self.filename is None: + self.filename = f + except: + pass + else: + if self.filename is None: + self.filename = f + else: + self.filename = filename + try: + make_dirs(self.filename) + with open(self.filename, 'w'): + pass + except PermissionError as e: + raise Warning(str(e)) + + self.template_dir = os.path.join(os.path.dirname(self.filename), "docx_template_" + os.path.splitext(os.path.basename(self.filename))[0]) + if os.path.isdir(self.template_dir): + shutil.rmtree(self.template_dir) + shutil.copytree(os.path.join(os.path.dirname(__file__.replace("library.zip", '')), 'docx-template_clean'), self.template_dir) + docx.template_dir = self.template_dir + + self.title = title + self.subject = subject + self.creator = creator + self.keywords = keywords + + # Default set of relationshipships - the minimum components of a document + self.relationships = docx.relationshiplist() + self.imagefiledict = {} + + + # Make a new document tree - this is the main part of a Word document + self.document = docx.newdocument(page_margins=page_margins) + + # This xpath location is where most interesting content lives + self.body = self.document.xpath('/w:document/w:body', namespaces=docx.nsprefixes)[0] + self.h = self.h1 = self.append_heading + self.h2 = lambda s : self.append_heading(s, 2) + self.h3 = lambda s : self.append_heading(s, 3) + self.p = self.append_paragraph + self.n = lambda s : self.append_paragraph([(s, 'ns')]) + self.i = lambda s : self.append_paragraph([(s, 'i')]) + self.b = lambda s : self.append_paragraph([(s, 'b')]) + self.new_page = lambda : self.body.append(pagebreak()) + self.table = docx.table + self.paragraph = docx.paragraph + self.caption = docx.caption + self.heading = docx.heading + + def write_access(self): + try: + with open(self.filename, 'a+'): + pass + return True + except IOError: + return False + + + def close(self): + if os.path.isdir(self.template_dir): + shutil.rmtree(self.template_dir) + + + + def search(self, string): + return docx.search(self.body, string) + +# def replace(self, find_string, replace_string): +# replace(self.body, find_string, replace_string) + + + def append_heading(self, string, level=1): + self.body.append(docx.heading(string, level)) + + def append_paragraph(self, string, style='BodyText', breakbefore=False, jc='left', spacing={'before':0, 'after':6}, font_size=12): + self.body.append(docx.paragraph(string, style, breakbefore, jc, spacing, font_size)) + + def append_list(self, item_list, style): + for item in item_list: + self.append_paragraph(item, style) + + def append_numberlist(self, item_list): + self.append_list(item_list, 'ListNumber') + + def append_bulletlist(self, item_list): + self.append_list(item_list, 'ListBullet') + + def append_caption(self, tag, caption_text): + self.body.append(caption("Figure", caption_text)) + + def picture(self, path, title="", pixelwidth=None, pixelheight=None): + global inkscape_path + _, ext = os.path.splitext(path.lower()) + if ext in (".svg", '.svgz', '.eps', '.pdf'): + emf_path = path.replace(ext, '.emf') + args = [inkscape_path, path, '--export-emf=%s' % emf_path] + returncode, stdout, stderr, cmd = pexec(args) + if returncode != 0 or not os.path.exists(emf_path): + inkscape_path = "" + raise ConversionError("%s\n%s" % (stdout, stderr)) + #succeded + path = emf_path + + self.relationships, picpara = picture(self.relationships, path, title, pixelwidth, pixelheight) + return picpara + + + def append_picture(self, path, caption_text="", pixelwidth=None, pixelheight=None): + self.body.append(self.picture(path, caption_text, pixelwidth, pixelheight)) +# if caption_text != "": +# self.body.append(caption("Figure", caption_text)) + + + + def append_table(self, lst_of_lst, header=None, first_column=None, corner="", heading=False, colw=None, cwunit='dxa', + tblw=0, twunit='auto', + tblmargin={'left':.19, 'right':.19}, + borders={"all":{"color":'auto', 'val':'single', 'sz':'4'}}, + column_style={'all':{'font_size':10, 'spacing':{'before':0, 'after':0}}}): + """ + @param list contents: A list of lists describing contents. Every item in + the list can be a string or a valid XML element + itself. It can also be a list. In that case all the + listed elements will be merged into the cell. + @param bool heading: Tells whether first line should be treated as + heading or not + @param list colw: list of integer column widths specified in wunitS. + @param str cwunit: Unit used for column width: + 'pct' : fiftieths of a percent + 'dxa' : twentieths of a point + 'nil' : no width + 'auto' : automagically determined + @param int tblw: Table width + @param str twunit: Unit used for table width. Same possible values as + cwunit. + @param dict borders: Dictionary defining table border. Supported keys + are: 'top', 'left', 'bottom', 'right', + 'insideH', 'insideV', 'all'. + When specified, the 'all' key has precedence over + others. Each key must define a dict of border + attributes: + color : The color of the border, in hex or + 'auto' + space : The space, measured in points + sz : The size of the border, in eighths of + a point + val : The style of the border, see + http://www.schemacentral.com/sc/ooxml/t-w_ST_Border.htm + @param list celstyle: Specify the style for each colum, list of dicts. + supported keys: + 'align' : specify the alignment, see paragraph + documentation.""" + m = len(lst_of_lst) + n = len(lst_of_lst[0]) + if header: + + if first_column: + lst_of_lst = [[corner] + header] + [[fc] + lst for fc, lst in zip(first_column, lst_of_lst)] + else: + lst_of_lst = [header] + [ lst for lst in lst_of_lst] + lst_of_lst = [[(str(v), v)[isinstance(v, (etree._Element, list, tuple))] for v in lst] for lst in lst_of_lst] + + self.body.append(table(lst_of_lst, heading, colw, cwunit, tblw, tblmargin, twunit, borders, column_style)) + + + + def append_markdown(self, s): + number_lst = [] + bullet_lst = [] + + for l in s.split("\n"): + #bullet list + if re_bullet_lst.match(l) is not None: + bullet_lst.append(re_bullet_lst.match(l).groups()[0]) + continue + elif len(bullet_lst) > 0: + self.append_bulletlist(bullet_lst) + bullet_lst = [] + # number list + if re_number_lst.match(l) is not None: + number_lst.append(re_number_lst.match(l).groups()[0]) + continue + elif len(number_lst) > 0: + self.append_numberlist(number_lst) + number_lst = [] + + + + #headings + if l.startswith("#"): + for i in [3, 2, 1]: + if l.startswith("#"*i): + self.append_heading(l[i:], i) + break + + elif (' *' in l and "* " in l) or (" _" in l and "_ " in l): + def styleit(text_lst, style_lst, tag, style): + t_lst = [] + s_lst = [] + for t, s in (zip(text_lst, style_lst)): + while t.count(tag) > 2: #" " + tag in t and tag + " " in t: + before, rest = t.split(tag, 1) + style_text, t = rest.split(tag, 1) + t_lst.append(before);s_lst.append(s) + t_lst.append(style_text);s_lst.append(style) + else: + t_lst.append(t);s_lst.append(s) + return t_lst, s_lst + text_lst, style_lst = [l], ['n'] + text_lst, style_lst = styleit(text_lst, style_lst, "**", 'b') + text_lst, style_lst = styleit(text_lst, style_lst, "__", 'b') + text_lst, style_lst = styleit(text_lst, style_lst, "*", 'i') + text_lst, style_lst = styleit(text_lst, style_lst, "_", 'i') + self.append_paragraph(list(zip(text_lst, style_lst))) + else: + self.n(l) + + def landscape(self, page_margins={'top':2, 'bottom':2, 'left':3, 'right':2}): + self.body.append(pagebreak('section', page_margins, portrait=False)) + + def portrait(self, page_margins={'top':2, 'bottom':2, 'left':3, 'right':2}): + self.body.append(pagebreak('section', page_margins, portrait=True)) + + def save(self, filename=None): + if filename is not None: + self.filename = filename + + coreprops = docx.coreproperties(title=self.title, + subject=self.subject, + creator=self.creator, + keywords=self.keywords) + appprops = docx.appproperties() + contenttypes = docx.contenttypes() + websettings = docx.websettings() + wordrelationships = docx.wordrelationships(self.relationships) + # Save our document + docx.savedocx(self.document, coreprops, appprops, contenttypes, websettings, + wordrelationships, self.filename) + + def open(self): + self.save() + self.close() + import subprocess + subprocess.Popen(os.path.realpath(self.filename), shell=True, cwd=os.getcwd()) + + def __enter__(self): + return self + + def __exit__(self, type, value, traceback): + if self.open_on_exit_lst.pop(): + self.open() + + + +if __name__ == '__main__': + +# doc1 = DocxDocument('test%d.docx') +# doc1.h1("first") +# doc1.open() + with DocxDocument('test%d.docx', delete_closed=True) as doc: + doc.p("hej") + +# doc3 = DocxDocument('test%d.docx') +# doc3.h1("thirda") +# with DocxDocument(doc3) as doc: +# doc.h1("thirdb") + +# doc = DocxDocument("test%d.docx") +# doc.append_table([['1', '2'], ['3', '4']], header=['a', 'b'], first_column=['c', 'd'], corner='table') +# doc.p("") +# doc.append_table([['1', '2'], ['3', '4']], header=['a', 'b'], first_column=['c', 'd']) +# doc.p("") +# doc.append_table([['1', '2'], ['3', '4']], header=['a', 'b']) +# doc.p("") +# doc.append_table([['1', '2'], ['3', '4']], first_column=['a', 'b']) + + #table_xml = doc.table([['A1'], ['B1']], heading=False, column_style={'all':{'font_size':20, 'spacing':{'before':0, 'after':0}}}) +# p = doc.paragraph("Test", font_size=30) +# +# doc.body.append(p) +# +# doc.n("") +# +# # Append two headings and a paragraph +# doc.h("Welcome to Python's docx module") +# doc.h2('Make and edit docx in 200 lines of pure Python') +# doc.n('The module was created when I was looking for a ' +# 'Python support for MS Word .doc files on PyPI and Stackoverflow. ' +# 'Unfortunately, the only solutions I could find used:') +# +# doc.i('For those of us who prefer something simpler') +# doc.b('I made docx.') +# +# +# # Add a numbered list +# points = [ 'COM automation' +# , '.net or Java' +# , 'Automating OpenOffice or MS Office' +# ] +# doc.append_numberlist(points) +# +# doc.append_picture('image1.png', "This is a picture") +# +# doc.append_table([ [doc.picture('image1.png'), 'A2', 'A3'], +# ['B1', 'B2', 'B3'], +# ['C1', 'C2', 'C3']], False) +# +## doc.append_picture('../myplot.pdf', "test", 100, 100) +# doc.append_markdown("""#Welcome to Python's docx module +###Make and edit docx in 200 lines of pure Python +#The module was created when I was looking for a Python support for MS Word .doc files on PyPI and Stackoverflow. Unfortunately, the only solutions I could find used: +#*For those of us who prefer something simpler* **I made docx.** +# +#4. First +#5. Second +#6. Third +# +#- first +#* second +#+ third +#""") + + + #doc.append_heading('Making documents', 2) +# body.append(paragraph('The docx module has the following features:')) +# +# # Add some bullets +# points = ['Paragraphs', 'Bullets', 'Numbered lists', +# 'Multiple levels of headings', 'Tables', 'Document Properties'] +# for point in points: +# body.append(paragraph(point, style='ListBullet')) +# +# body.append(paragraph('Tables are just lists of lists, like this:')) +# # Append a table +# tbl_rows = [ ['A1', 'A2', 'A3'] +# , ['B1', 'B2', 'B3'] +# , ['C1', 'C2', 'C3'] +# ] +# body.append(table(tbl_rows)) +# +# body.append(heading('Editing documents', 2)) +# body.append(paragraph('Thanks to the awesomeness of the lxml module, ' +# 'we can:')) +# points = [ 'Search and replace' +# , 'Extract plain text of document' +# , 'Add and delete items anywhere within the document' +# ] +# for point in points: +# body.append(paragraph(point, style='ListBullet')) +# +# # Add an image +# relationships, picpara = picture(relationships, 'image1.png', +# 'This is a test description') +# body.append(picpara) +# +# # Search and replace +# print 'Searching for something in a paragraph ...', +# if search(body, 'the awesomeness'): +# print 'found it!' +# else: +# print 'nope.' +# +# print 'Searching for something in a heading ...', +# if search(body, '200 lines'): +# print 'found it!' +# else: +# print 'nope.' +# +# print 'Replacing ...', +# body = replace(body, 'the awesomeness', 'the goshdarned awesomeness') +# print 'done.' +# +# # Add a pagebreak +# body.append(pagebreak(type='page', orient='portrait')) +# +# body.append(heading('Ideas? Questions? Want to contribute?', 2)) +# body.append(paragraph('Email <python.docx@librelist.com>')) + +# # Create our properties, contenttypes, and other support files +# title = 'Python docx demo' +# subject = 'A practical example of making docx from Python' +# creator = 'Mike MacCana' +# keywords = ['python', 'Office Open XML', 'Word'] + +# coreprops = coreproperties(title=title, subject=subject, creator=creator, +# keywords=keywords) +# appprops = appproperties() +# contenttypes = contenttypes() +# websettings = websettings() +# wordrelationships = wordrelationships(relationships) +# +# # Save our document +# savedocx(document, coreprops, appprops, contenttypes, websettings, +# wordrelationships, 'Welcome to the Python docx module.docx') +# doc.save() +# doc.close() +# doc.open() +# diff --git a/wetb/utils/report_generator/docx_document/example.py b/wetb/utils/report_generator/docx_document/example.py new file mode 100644 index 0000000000000000000000000000000000000000..c8596f44f2cadf90401a305d8ce1c0a185ef0a13 --- /dev/null +++ b/wetb/utils/report_generator/docx_document/example.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python + +""" +This file makes a .docx (Word 2007) file from scratch, showing off most of the +features of python-docx. + +If you need to make documents from scratch, you can use this file as a basis +for your work. + +Part of Python's docx module - http://github.com/mikemaccana/python-docx +See LICENSE for licensing information. +""" + +from mmpe.docx_document.docx import * + +if __name__ == '__main__': + # Default set of relationshipships - the minimum components of a document + relationships = relationshiplist() + + # Make a new document tree - this is the main part of a Word document + document = newdocument() + + # This xpath location is where most interesting content lives + body = document.xpath('/w:document/w:body', namespaces=nsprefixes)[0] + + # Append two headings and a paragraph + body.append(heading("Welcome to Python's docx module", 1)) + body.append(heading('Make and edit docx in 200 lines of pure Python', 2)) + body.append(paragraph('The module was created when I was looking for a ' + 'Python support for MS Word .doc files on PyPI and Stackoverflow. ' + 'Unfortunately, the only solutions I could find used:')) + + # Add a numbered list + points = [ 'COM automation' + , '.net or Java' + , 'Automating OpenOffice or MS Office' + ] + for point in points: + body.append(paragraph(point, style='ListNumber')) + body.append(paragraph([('For those of us who prefer something simpler, I ' + 'made docx.', 'i')])) + body.append(heading('Making documents', 2)) + body.append(paragraph('The docx module has the following features:')) + + # Add some bullets + points = ['Paragraphs', 'Bullets', 'Numbered lists', + 'Multiple levels of headings', 'Tables', 'Document Properties'] + for point in points: + body.append(paragraph(point, style='ListBullet')) + + body.append(paragraph('Tables are just lists of lists, like this:')) + # Append a table + tbl_rows = [ ['A1', 'A2', 'A3'] + , ['B1', 'B2', 'B3'] + , ['C1', 'C2', 'C3'] + ] + body.append(table(tbl_rows)) + + body.append(heading('Editing documents', 2)) + body.append(paragraph('Thanks to the awesomeness of the lxml module, ' + 'we can:')) + points = [ 'Search and replace' + , 'Extract plain text of document' + , 'Add and delete items anywhere within the document' + ] + for point in points: + body.append(paragraph(point, style='ListBullet')) + + # Add an image + relationships, picpara = picture(relationships, 'image1.png', + 'This is a test description') + body.append(picpara) + + # Search and replace + print ('Searching for something in a paragraph ...',) + if search(body, 'the awesomeness'): + print ('found it!') + else: + print ('nope.') + + print ('Searching for something in a heading ...',) + if search(body, '200 lines'): + print ('found it!') + else: + print ('nope.') + + print ('Replacing ...',) + body = replace(body, 'the awesomeness', 'the goshdarned awesomeness') + print ('done.') + + # Add a pagebreak + body.append(pagebreak(type='page', orient='portrait')) + + body.append(heading('Ideas? Questions? Want to contribute?', 2)) + body.append(paragraph('Email <python.docx@librelist.com>')) + + # Create our properties, contenttypes, and other support files + title = 'Python docx demo' + subject = 'A practical example of making docx from Python' + creator = 'Mike MacCana' + keywords = ['python', 'Office Open XML', 'Word'] + + coreprops = coreproperties(title=title, subject=subject, creator=creator, + keywords=keywords) + appprops = appproperties() + contenttypes = contenttypes() + websettings = websettings() + wordrelationships = wordrelationships(relationships) + + # Save our document + savedocx(document, coreprops, appprops, contenttypes, websettings, + wordrelationships, 'Welcome to the Python docx module.docx')