Skip to content

Markdown 与 PDF 互转 ​

从 12.0 版本开始,福昕 PDF SDK 支持 Markdown 与 PDF 双向转换:Md2PDF::ConvertFromMarkdown(Markdown → PDF)与 PDF2Md::ConvertToMarkdown(PDF → Markdown)。使用前需加载福昕 PDF Conversion SDK 动态库,并具备对应模块授权。

完整可运行示例见产品包 examples/simple_demo/md2pdf 与 examples/simple_demo/pdf2md。类与方法细节见 API 文档。

系统要求 ​

  • 平台:Windows、Linux(当前头文件未开放 Mac / Android)
  • 开发语言:C、C++、Java、C#、Python、Node.js、Go
  • 授权许可:Markdown → PDF 需包含 Md2PDF 模块;PDF → Markdown 需包含 PDF2Md 模块
  • 依赖库:福昕 PDF Conversion SDK 动态库(如 Windows 上的 fpdfconversionsdk_win64.dll、Linux 上的 libfpdfconversionsdk.so)

Markdown 转 PDF ​

典型流程:Library::Initialize → Md2PDF::Initialize(library_path) → 配置 Md2PDFSettingData → ConvertFromMarkdown → Md2PDF::Release。

Md2PDFSettingData 常用字段:页宽高、页边距、正文字号(base_font_size)、自定义字体路径、样式 JSON 路径、是否嵌入字体。未设置时使用默认值(约 Letter 纸张、72 pt 边距等)。

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

// 假设已 Library::Initialize;library_path 指向 Conversion SDK 动态库。
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("@fuxinsoft/fuxin-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 转 Markdown ​

典型流程:Library::Initialize → PDF2Md::Initialize(library_path) → 配置 PDF2MdSettingData → ConvertToMarkdown → PDF2Md::Release。

ConvertToMarkdown 可指定导出图片子目录名(纯目录名、不含路径分隔符);为空时默认在输出 Markdown 旁生成 <md_basename>_images。

PDF2MdSettingData 常用字段:

  • table_format:表格输出为 Markdown 管道表(e_TableFormatMarkdown)或 HTML 表(e_TableFormatHTML)
  • include_header_footer:是否包含页眉页脚
  • enable_italic / enable_bold:是否保留斜体 / 粗体标记
  • skip_ocr_pages:是否跳过仅含路径/图像的扫描页(为 false 时此类页可能报错)
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("@fuxinsoft/fuxin-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()