Retrieval-augmented generation (RAG) systems need documents in a clean, structured text format for chunking and embedding. Markdown is ideal — it preserves document structure (headings, lists, tables) while being easy to parse.
flowchart LR
A["PDF / DOCX / XLSX"]
B["GroupDocs.Markdown"]
C["Markdown"]
D["Text Chunking"]
E["Vector Embeddings"]
F["LLM Query"]
A --> B --> C --> D --> E --> F
Basic conversion for RAG
importcom.groupdocs.markdown.*;importjava.util.regex.Pattern;publicclassRagBasic{// Matches a newline followed by a level-1 or level-2 heading marker
privatestaticfinalPatternHEADING=Pattern.compile("\\n#{1,2} ");publicstaticvoidmain(String[]args){// Convert document to Markdown — skip images for text-only RAG
DocumentConvertOptionsoptions=newDocumentConvertOptions();options.setImageExportStrategy(newSkipImagesStrategy());options.setFlavor(MarkdownFlavor.COMMON_MARK);Stringmarkdown=MarkdownConverter.toMarkdown("professional-services.pdf",options);// Split into chunks by headings
String[]chunks=HEADING.split(markdown);for(Stringchunk:chunks){if(chunk.isEmpty()){continue;}// Send each chunk to your embedding model
Stringpreview=chunk.substring(0,Math.min(80,chunk.length()));System.out.println("Chunk ("+chunk.length()+" chars): "+preview+"...");}}}
professional-services.pdf is a sample file used in this example. Click here to download it.
Chunk (8065 chars):
**Professional Services**
A catalog of engagements offered by Meridian Outd...
importcom.groupdocs.markdown.*;importjava.io.File;importjava.io.IOException;importjava.nio.charset.StandardCharsets;importjava.nio.file.Files;importjava.nio.file.Paths;publicclassRagBatch{publicstaticvoidmain(String[]args)throwsIOException{DocumentConvertOptionsoptions=newDocumentConvertOptions();options.setImageExportStrategy(newSkipImagesStrategy());File[]files=newFile("documents").listFiles((dir,name)->name.toLowerCase().endsWith(".pdf"));if(files==null){files=newFile[0];}for(Filefile:files){try{Stringmarkdown=MarkdownConverter.toMarkdown(file.getPath(),options);StringoutputPath=changeExtension(file.getPath(),".md");Files.write(Paths.get(outputPath),markdown.getBytes(StandardCharsets.UTF_8));System.out.println("Converted: "+file.getPath());}catch(GroupDocsMarkdownExceptione){System.out.println("Skipped "+file.getPath()+": "+e.getMessage());}}}/** Java has no Path.ChangeExtension equivalent. */privatestaticStringchangeExtension(Stringpath,StringnewExtension){intdot=path.lastIndexOf('.');return(dot<0?path:path.substring(0,dot))+newExtension;}}