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()