Skip to content

Markdown and PDF Conversion ​

Starting in 12.0, Foxit PDF SDK supports bidirectional conversion between Markdown and PDF: Md2PDF::ConvertFromMarkdown (Markdown → PDF) and PDF2Md::ConvertToMarkdown (PDF → Markdown). Before use, load the Foxit PDF Conversion SDK dynamic library and ensure you have the corresponding module license.

For complete runnable samples, see examples/simple_demo/md2pdf and examples/simple_demo/pdf2md in the product package. See the API Reference for class and method details.

System requirements ​

  • Platforms: Windows, Linux (Mac / Android headers are not currently exposed)
  • Languages: C, C++, Java, C#, Python, Node.js, Go
  • License: Markdown → PDF requires the Md2PDF module; PDF → Markdown requires the PDF2Md module
  • Dependencies: Foxit PDF Conversion SDK dynamic library (for example, fpdfconversionsdk_win64.dll on Windows, libfpdfconversionsdk.so on Linux)

Markdown to PDF ​

Typical flow: Library::Initialize → Md2PDF::Initialize(library_path) → configure Md2PDFSettingData → ConvertFromMarkdown → Md2PDF::Release.

Common Md2PDFSettingData fields include page width/height, margins, body font size (base_font_size), custom font path, style JSON path, and whether to embed fonts. When unset, defaults apply (approximately Letter paper size, 72 pt margins, and so on).

c++
using namespace foxit::addon::conversion::md2pdf;

// Assume Library::Initialize has already been called; library_path points to the Conversion SDK dynamic library.
Md2PDF::Initialize(library_path);

Md2PDFSettingData setting_data;
bool ok = Md2PDF::ConvertFromMarkdown(src_md_path, L"", saved_pdf_path, setting_data);

Md2PDF::Release();
C
FSDK_Md2PDF_Initialize(library_path);

FSMd2PDFSettingData setting_data;
setting_data.page_width = 612.0f;
setting_data.page_height = 792.0f;
setting_data.margin_top = 72.0f;
setting_data.margin_bottom = 72.0f;
setting_data.margin_left = 72.0f;
setting_data.margin_right = 72.0f;
setting_data.base_font_size = 10.0f;
setting_data.custom_font_path.str = L"";
setting_data.custom_font_path.len = 0;
setting_data.style_config_path.str = L"";
setting_data.style_config_path.len = 0;
setting_data.is_embed_font = FALSE;

FS_BOOL return_value = FALSE;
FSDK_Md2PDF_ConvertFromMarkdown(src_md_path, L"", saved_pdf_path, setting_data, &return_value);

FSDK_Md2PDF_Release();
java
Md2PDF.initialize(library_path);

Md2PDFSettingData settingData = new Md2PDFSettingData();
boolean ok = Md2PDF.convertFromMarkdown(srcMdPath, "", savedPdfPath, settingData);

Md2PDF.release();
py
Md2PDF.Initialize(library_path)

setting_data = Md2PDFSettingData()
setting_data.page_width = 612.0
setting_data.page_height = 792.0
setting_data.margin_top = 72.0
setting_data.margin_bottom = 72.0
setting_data.margin_left = 72.0
setting_data.margin_right = 72.0
setting_data.base_font_size = 10.0
setting_data.custom_font_path = ""
setting_data.style_config_path = ""
setting_data.is_embed_font = False

ok = Md2PDF.ConvertFromMarkdown(src_md_path, "", saved_pdf_path, setting_data)

Md2PDF.Release()
js
const FSDK = require("@foxitsoftware/foxit-pdf-sdk-node");

FSDK.Md2PDF.Initialize(library_path);

let setting_data = new FSDK.Md2PDFSettingData();
setting_data.page_width = 612.0;
setting_data.page_height = 792.0;
setting_data.margin_top = 72.0;
setting_data.margin_bottom = 72.0;
setting_data.margin_left = 72.0;
setting_data.margin_right = 72.0;
setting_data.base_font_size = 10.0;
setting_data.custom_font_path = "";
setting_data.style_config_path = "";
setting_data.is_embed_font = false;

let ok = FSDK.Md2PDF.ConvertFromMarkdown(src_md_path, "", saved_pdf_path, setting_data);

FSDK.Md2PDF.Release();
csharp
Md2PDF.Initialize(library_path);

Md2PDFSettingData setting_data = new Md2PDFSettingData();
setting_data.page_width = 612.0f;
setting_data.page_height = 792.0f;
setting_data.margin_top = 72.0f;
setting_data.margin_bottom = 72.0f;
setting_data.margin_left = 72.0f;
setting_data.margin_right = 72.0f;
setting_data.base_font_size = 10.0f;
setting_data.custom_font_path = "";
setting_data.style_config_path = "";
setting_data.is_embed_font = false;

bool ok = Md2PDF.ConvertFromMarkdown(src_md_path, "", saved_pdf_path, setting_data);

Md2PDF.Release();
go
fsdk.Md2PDFInitialize(libraryPath)

settingData := fsdk.NewMd2PDFSettingData()
settingData.SetPage_width(612)
settingData.SetPage_height(792)
settingData.SetMargin_top(72)
settingData.SetMargin_bottom(72)
settingData.SetMargin_left(72)
settingData.SetMargin_right(72)
settingData.SetBase_font_size(10)
settingData.SetCustom_font_path("")
settingData.SetStyle_config_path("")
settingData.SetIs_embed_font(false)

ok := fsdk.Md2PDFConvertFromMarkdown(srcMdPath, "", savedPdfPath, settingData)

fsdk.Md2PDFRelease()

PDF to Markdown ​

Typical flow: Library::Initialize → PDF2Md::Initialize(library_path) → configure PDF2MdSettingData → ConvertToMarkdown → PDF2Md::Release.

ConvertToMarkdown can specify an image export subdirectory name (directory name only, without path separators). When empty, the default is <md_basename>_images next to the output Markdown file.

Common PDF2MdSettingData fields:

  • table_format: export tables as Markdown pipe tables (e_TableFormatMarkdown) or HTML tables (e_TableFormatHTML)
  • include_header_footer: whether to include headers and footers
  • enable_italic / enable_bold: whether to preserve italic / bold markup
  • skip_ocr_pages: whether to skip scanned pages that contain only paths/images (when false, such pages may raise errors)
c++
using namespace foxit::addon::conversion::pdf2md;

PDF2Md::Initialize(library_path);

PDF2MdSettingData setting_data;
bool ok = PDF2Md::ConvertToMarkdown(src_pdf_path, NULL, saved_md_path, NULL, setting_data);

PDF2Md::Release();
C
FSDK_PDF2Md_Initialize(library_path);

FSPDF2MdSettingData setting_data;
setting_data.table_format = e_FSTableFormatMarkdown;
setting_data.include_header_footer = FALSE;
setting_data.enable_italic = TRUE;
setting_data.enable_bold = TRUE;
setting_data.skip_ocr_pages = FALSE;

FS_BOOL return_value = FALSE;
FSDK_PDF2Md_ConvertToMarkdown(src_pdf_path, L"", saved_md_path, L"images", setting_data, &return_value);

FSDK_PDF2Md_Release();
java
PDF2Md.initialize(library_path);

PDF2MdSettingData settingData = new PDF2MdSettingData();
boolean ok = PDF2Md.convertToMarkdown(srcPdfPath, null, savedMdPath, null, settingData);

PDF2Md.release();
py
PDF2Md.Initialize(library_path)

setting_data = PDF2MdSettingData()
setting_data.table_format = PDF2MdSettingData.e_TableFormatMarkdown
setting_data.include_header_footer = False
setting_data.enable_italic = True
setting_data.enable_bold = True
setting_data.skip_ocr_pages = False

ok = PDF2Md.ConvertToMarkdown(src_pdf_path, "", saved_md_path, "images", setting_data)

PDF2Md.Release()
js
const FSDK = require("@foxitsoftware/foxit-pdf-sdk-node");

FSDK.PDF2Md.Initialize(library_path);

let setting_data = new FSDK.PDF2MdSettingData();
setting_data.table_format = FSDK.PDF2MdSettingData.e_TableFormatMarkdown;
setting_data.include_header_footer = false;
setting_data.enable_italic = true;
setting_data.enable_bold = true;
setting_data.skip_ocr_pages = false;

let ok = FSDK.PDF2Md.ConvertToMarkdown(src_pdf_path, "", saved_md_path, "images", setting_data);

FSDK.PDF2Md.Release();
csharp
PDF2Md.Initialize(library_path);

PDF2MdSettingData setting_data = new PDF2MdSettingData();
setting_data.table_format = PDF2MdSettingData.TableFormat.e_TableFormatMarkdown;
setting_data.include_header_footer = false;
setting_data.enable_italic = true;
setting_data.enable_bold = true;
setting_data.skip_ocr_pages = false;

bool ok = PDF2Md.ConvertToMarkdown(src_pdf_path, "", saved_md_path, "images", setting_data);

PDF2Md.Release();
go
fsdk.PDF2MdInitialize(libraryPath)

settingData := fsdk.NewPDF2MdSettingData()
settingData.SetTable_format(fsdk.PDF2MdSettingDataE_TableFormatMarkdown)
settingData.SetInclude_header_footer(false)
settingData.SetEnable_italic(true)
settingData.SetEnable_bold(true)
settingData.SetSkip_ocr_pages(false)

ok := fsdk.PDF2MdConvertToMarkdown(srcPdfPath, "", savedMdPath, "images", settingData)

fsdk.PDF2MdRelease()