Static site generators like Jekyll, Hugo, and Docusaurus expect Markdown files with YAML front matter. GroupDocs.Markdown can automatically generate front matter from document metadata.
Convert with front matter and relative images
fromgroupdocs.markdownimportMarkdownConverter,ConvertOptions,ExportImagesToFileSystemStrategydefstatic_site_convert():"""Convert a DOCX to Markdown with front matter and relative images for static sites."""# Step 1: Configure image export with relative pathsstrategy=ExportImagesToFileSystemStrategy("content/posts/images")strategy.images_relative_path="images"# Step 2: Set conversion options for static site generatorsoptions=ConvertOptions()options.include_front_matter=True# add YAML metadata blockoptions.heading_level_offset=1# reserve H1 for the page titleoptions.image_export_strategy=strategy# Step 3: Convert and save using keyword argument for optionsMarkdownConverter.to_file("annual-report.docx","content/posts/annual-report.md",convert_options=options)# Output file starts with:# ---# title: "Annual Report 2025"# author: "Finance Team"# format: Docx# pages: 24# ---## ## Executive Summary# ...if__name__=="__main__":importosos.makedirs("content/posts/images",exist_ok=True)static_site_convert()
annual-report.docx is sample file used in this example. Click here to download it.
importosfromgroupdocs.markdownimportMarkdownConverter,ConvertOptions,SkipImagesStrategydefbatch_convert_for_hugo():"""Batch-convert all documents in a folder to Markdown with YAML front matter for Hugo/Jekyll."""# Step 1: Define source and output directoriesinput_dir="documents"output_dir="content/posts"os.makedirs(output_dir,exist_ok=True)# Step 2: Configure conversion for static site generatorsoptions=ConvertOptions()options.include_front_matter=True# add YAML metadata blockoptions.heading_level_offset=1# reserve H1 for Hugo page titleoptions.image_export_strategy=SkipImagesStrategy()# text-only content# Step 3: Iterate over all files in the source folderforfilenameinos.listdir(input_dir):file_path=os.path.join(input_dir,filename)# Skip directoriesifnotos.path.isfile(file_path):continue# Build output path with .md extensionoutput_path=os.path.join(output_dir,os.path.splitext(filename)[0]+".md")try:# Step 4: Convert each file with front matter and heading offsetMarkdownConverter.to_file(file_path,output_path,convert_options=options)print(f" OK: {filename} -> {output_path}")exceptExceptionasex:print(f" SKIP: {filename} - {ex}")if__name__=="__main__":batch_convert_for_hugo()