Loading .gitignore +1 −0 Original line number Diff line number Diff line Loading @@ -4,3 +4,4 @@ */.python-version .python-version toMkdocs/__pycache__ .idea/ generateBaseline/postprocessing.py +28 −72 Original line number Diff line number Diff line Loading @@ -10,7 +10,6 @@ import shutil from typing import Union import argparse import subprocess #import win32com.client #pip install pywin32 from docx import Document #pip install python-docx from docx.oxml import OxmlElement Loading Loading @@ -67,9 +66,7 @@ def clean_and_set_text(cell, new_text): # Füge neuen Absatz mit dem bereinigten Text hinzu cell.add_paragraph(new_text) def postprocess_table_content(config): docx_path = config.get("output_docx") output_path = config.get("output_docx") def postprocess_table_content(docx_path, output_path): doc = Document(docx_path) for table in doc.tables: for row in table.rows: Loading @@ -81,38 +78,13 @@ def postprocess_table_content(config): rotate_cell_text(cell) doc.save(output_path) def turn_table_contents_cli(): parser = argparse.ArgumentParser(description="Searches for cells beginning with [rotate] and turns the content 90 degree counterclockwise") parser.add_argument("docx_input", help="Path to input DOCX file") parser.add_argument("docx_output", help="Path to output DOCX file") args = parser.parse_args() def update_word_fields(config_path: Union[dict, str]): if os.path.isfile(config_path): docx_path = config_path else: docx_path = config_path.get("output_docx") # Prüfen, ob Datei existiert relativer_pfad = Path(docx_path) docx_absolute_path = relativer_pfad.resolve() if not os.path.isfile(docx_absolute_path): print(f'File not found: {docx_absolute_path}') # Word starten word = win32com.client.Dispatch("Word.Application") word.Visible = False # unsichtbar im Hintergrund try: # Dokument öffnen doc = word.Documents.Open(str(docx_absolute_path)) # Alle Felder im Dokument aktualisieren for field in doc.Fields: field.Update() # Dokument speichern doc.Save() # Schließen doc.Close() print(f'Fields in {docx_absolute_path} updated and saved') finally: word.Quit() postprocess_table_content(args.docx_input, args.docx_output) def refresh_docx_fields(input_path: str, image: str = "docx-field-refresh") -> str: """ Loading Loading @@ -300,8 +272,10 @@ def update_toc(docx_input, docx_output): with zipfile.ZipFile(docx_input, 'r') as zin: xml_data = zin.read("word/document.xml") #update toc level xml_data = update_toc_level(xml_data) #update format of toc header xml_data = format_toc_header(xml_data) # create temp file Loading @@ -327,47 +301,29 @@ def update_toc(docx_input, docx_output): if os.path.exists(tmp_path): os.remove(tmp_path) #def update_toc_level(config): # docx_path = config.get("output_docx") # word = win32com.client.Dispatch("Word.Application") # word.Visible = False # # doc = word.Documents.Open(docx_path) # # # Wenn kein TOC vorhanden ist, kannst du eins hinzufügen: # if doc.TablesOfContents.Count == 0: # # Inhaltsverzeichnis am Anfang des Dokuments einfügen # doc.TablesOfContents.Add( # Range=doc.Range(0, 0), # UseHeadingStyles=True, # UpperHeadingLevel=1, # LowerHeadingLevel=9, # 👉 bis Heading 9 # UseHyperlinks=True, # HidePageNumbersInWeb=False, # UseOutlineLevels=True # ) # # Vorhandenes TOC anpassen # toc = doc.TablesOfContents(1) # #Formating heading -> ToDo: last line not working so skipped for the moment # #toc_range = toc.Range # #heading_para = toc_range.Paragraphs(1) # #heading_para.Style = doc.Styles("Heading 1") # #set level range from 1-9 # toc.UpperHeadingLevel = 1 # toc.LowerHeadingLevel = 9 # toc.Update() # doc.SaveAs(docx_path) # doc.Close() # word.Quit() def update_toc_cli(): docx_input, docx_output = parse_input() update_toc(docx_input, docx_output) def parse_input(): parser = argparse.ArgumentParser(description="Update a DOCX table of contents.") parser.add_argument("docx_input", help="Path to input DOCX file") parser.add_argument("docx_output", help="Path to output DOCX file") parser.add_argument('docx_input', '-i', '--input', metavar='INPUT_FILE', required=True, type=str, default=None, help='Path to input DOCX file') parser.add_argument('docx_output', '-o', '--output', metavar='OUTPUT_FILE', required=False, type=str, default=None, help='Path to output DOCX file') args = parser.parse_args() update_toc(args.docx_input, args.docx_output) return args.docx_input, args.docx_output def table_widths_adjustment(config): Loading generateBaseline/setup.py +1 −1 Original line number Diff line number Diff line Loading @@ -16,7 +16,7 @@ setup( 'svg2png=svg2png:main', "update_references=postprocessing:update_word_fields", "update_formats=postprocessing:apply_standard_style_to_unformatted_paragraphs", "turn_table_contents=postprocessing:postprocess_table_content", "turn_table_contents=postprocessing:turn_table_contents_cli", "table_width_adjustment=postprocessing:table_widths_adjustment", "check_multipage_tables=postprocessing:insert_page_break_before_long_tables", #"apply_etsi_styling: postprocessing:postprocess_etsi_styles", Loading Loading
.gitignore +1 −0 Original line number Diff line number Diff line Loading @@ -4,3 +4,4 @@ */.python-version .python-version toMkdocs/__pycache__ .idea/
generateBaseline/postprocessing.py +28 −72 Original line number Diff line number Diff line Loading @@ -10,7 +10,6 @@ import shutil from typing import Union import argparse import subprocess #import win32com.client #pip install pywin32 from docx import Document #pip install python-docx from docx.oxml import OxmlElement Loading Loading @@ -67,9 +66,7 @@ def clean_and_set_text(cell, new_text): # Füge neuen Absatz mit dem bereinigten Text hinzu cell.add_paragraph(new_text) def postprocess_table_content(config): docx_path = config.get("output_docx") output_path = config.get("output_docx") def postprocess_table_content(docx_path, output_path): doc = Document(docx_path) for table in doc.tables: for row in table.rows: Loading @@ -81,38 +78,13 @@ def postprocess_table_content(config): rotate_cell_text(cell) doc.save(output_path) def turn_table_contents_cli(): parser = argparse.ArgumentParser(description="Searches for cells beginning with [rotate] and turns the content 90 degree counterclockwise") parser.add_argument("docx_input", help="Path to input DOCX file") parser.add_argument("docx_output", help="Path to output DOCX file") args = parser.parse_args() def update_word_fields(config_path: Union[dict, str]): if os.path.isfile(config_path): docx_path = config_path else: docx_path = config_path.get("output_docx") # Prüfen, ob Datei existiert relativer_pfad = Path(docx_path) docx_absolute_path = relativer_pfad.resolve() if not os.path.isfile(docx_absolute_path): print(f'File not found: {docx_absolute_path}') # Word starten word = win32com.client.Dispatch("Word.Application") word.Visible = False # unsichtbar im Hintergrund try: # Dokument öffnen doc = word.Documents.Open(str(docx_absolute_path)) # Alle Felder im Dokument aktualisieren for field in doc.Fields: field.Update() # Dokument speichern doc.Save() # Schließen doc.Close() print(f'Fields in {docx_absolute_path} updated and saved') finally: word.Quit() postprocess_table_content(args.docx_input, args.docx_output) def refresh_docx_fields(input_path: str, image: str = "docx-field-refresh") -> str: """ Loading Loading @@ -300,8 +272,10 @@ def update_toc(docx_input, docx_output): with zipfile.ZipFile(docx_input, 'r') as zin: xml_data = zin.read("word/document.xml") #update toc level xml_data = update_toc_level(xml_data) #update format of toc header xml_data = format_toc_header(xml_data) # create temp file Loading @@ -327,47 +301,29 @@ def update_toc(docx_input, docx_output): if os.path.exists(tmp_path): os.remove(tmp_path) #def update_toc_level(config): # docx_path = config.get("output_docx") # word = win32com.client.Dispatch("Word.Application") # word.Visible = False # # doc = word.Documents.Open(docx_path) # # # Wenn kein TOC vorhanden ist, kannst du eins hinzufügen: # if doc.TablesOfContents.Count == 0: # # Inhaltsverzeichnis am Anfang des Dokuments einfügen # doc.TablesOfContents.Add( # Range=doc.Range(0, 0), # UseHeadingStyles=True, # UpperHeadingLevel=1, # LowerHeadingLevel=9, # 👉 bis Heading 9 # UseHyperlinks=True, # HidePageNumbersInWeb=False, # UseOutlineLevels=True # ) # # Vorhandenes TOC anpassen # toc = doc.TablesOfContents(1) # #Formating heading -> ToDo: last line not working so skipped for the moment # #toc_range = toc.Range # #heading_para = toc_range.Paragraphs(1) # #heading_para.Style = doc.Styles("Heading 1") # #set level range from 1-9 # toc.UpperHeadingLevel = 1 # toc.LowerHeadingLevel = 9 # toc.Update() # doc.SaveAs(docx_path) # doc.Close() # word.Quit() def update_toc_cli(): docx_input, docx_output = parse_input() update_toc(docx_input, docx_output) def parse_input(): parser = argparse.ArgumentParser(description="Update a DOCX table of contents.") parser.add_argument("docx_input", help="Path to input DOCX file") parser.add_argument("docx_output", help="Path to output DOCX file") parser.add_argument('docx_input', '-i', '--input', metavar='INPUT_FILE', required=True, type=str, default=None, help='Path to input DOCX file') parser.add_argument('docx_output', '-o', '--output', metavar='OUTPUT_FILE', required=False, type=str, default=None, help='Path to output DOCX file') args = parser.parse_args() update_toc(args.docx_input, args.docx_output) return args.docx_input, args.docx_output def table_widths_adjustment(config): Loading
generateBaseline/setup.py +1 −1 Original line number Diff line number Diff line Loading @@ -16,7 +16,7 @@ setup( 'svg2png=svg2png:main', "update_references=postprocessing:update_word_fields", "update_formats=postprocessing:apply_standard_style_to_unformatted_paragraphs", "turn_table_contents=postprocessing:postprocess_table_content", "turn_table_contents=postprocessing:turn_table_contents_cli", "table_width_adjustment=postprocessing:table_widths_adjustment", "check_multipage_tables=postprocessing:insert_page_break_before_long_tables", #"apply_etsi_styling: postprocessing:postprocess_etsi_styles", Loading