markdown文件转pdf

步骤:md转html转pdf
pom引入
java 复制代码
 <!--markdown 转pdf-->
        <dependency>
            <groupId>com.vladsch.flexmark</groupId>
            <artifactId>flexmark-all</artifactId>
            <version>0.64.8</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>html2pdf</artifactId>
            <version>5.0.4</version>
        </dependency>
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.9.2</version>
        </dependency>
java代码
java 复制代码
import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.HtmlConverter;
import com.itextpdf.html2pdf.resolver.font.DefaultFontProvider;
import com.itextpdf.io.font.PdfEncodings;
import com.itextpdf.layout.font.FontInfo;
import com.itextpdf.layout.font.FontProvider;
import com.vladsch.flexmark.html.HtmlRenderer;
import com.vladsch.flexmark.parser.Parser;
import com.vladsch.flexmark.util.ast.Node;
import com.vladsch.flexmark.util.data.MutableDataSet;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Document.OutputSettings;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;

public class MarkdownToPdf {

    public static void main(String[] args) {
        String markdownFile = "D:\\markdown\\test.md";
        String pdfFile = "D:\\markdown\\test_" + System.currentTimeMillis() + ".pdf";
        toPdf(markdownFile, pdfFile);
    }

    private static void toPdf(String markdownFile, String pdfFile) {

        try {
            // 读取Markdown文件
            String markdown = new String(Files.readAllBytes(Paths.get(markdownFile)), StandardCharsets.UTF_8);

            // 转换Markdown为HTML
            MutableDataSet options = new MutableDataSet();
            Parser parser = Parser.builder(options).build();
            HtmlRenderer renderer = HtmlRenderer.builder(options).build();
            Node document = parser.parse(markdown);
            String html = renderer.render(document);

            // 使用JSoup解析HTML并转换为XHTML
            Document xhtmlDoc = Jsoup.parse(html);
            xhtmlDoc.outputSettings(new OutputSettings().syntax(OutputSettings.Syntax.xml));

            // 调整图片大小,不然图片高度显示不全
            xhtmlDoc.select("img").forEach(img -> {
                // 设置图片宽度和高度自适应
                img.attr("style", "max-width: 100%; height: auto;");
            });

            // 定义默认字体
            ConverterProperties converterProperties = new ConverterProperties();
            FontProvider fontProvider = new DefaultFontProvider(true, false, false);

            // 写法1
            // 宋体
            // URL url = new MarkdownToPdf().getClass().getClassLoader().getResource("font/SimSun.ttf");
            // 无衬线
            // URL url = new MarkdownToPdf().getClass().getClassLoader().getResource("font/NotoSansCJKsc-Regular.otf");
            // 有衬线
            // URL url = new MarkdownToPdf().getClass().getClassLoader().getResource("font/NotoSerifCJKsc-Regular.otf");
            // URL url = new MarkdownToPdf().getClass().getClassLoader().getResource("font/NotoSerifCJKsc-Light.otf");
            // fontProvider.addFont(url.getPath(), PdfEncodings.IDENTITY_H);

            // 写法2
            Resource resource = new ClassPathResource("font/SimSun.ttf");
            fontProvider.addFont(resource.getInputStream().readAllBytes(), PdfEncodings.IDENTITY_H);
            converterProperties.setFontProvider(fontProvider);
            File file = new File(pdfFile);
            FileOutputStream outputStream;
            try {
                outputStream = new FileOutputStream(file);
            } catch (FileNotFoundException e) {
                throw new RuntimeException(e);
            }
            // Html 转化为 pdf
            HtmlConverter.convertToPdf(xhtmlDoc.html(), outputStream, converterProperties);
            System.out.println("PDF创建成功!");

        } catch (IOException e) {
            System.err.println("文件读取/写入错误: " + e.getMessage());
            e.printStackTrace();
        }
    }

}
字体文件(见资源文件,可下载)

放在resources文件夹下即可

相关推荐
专注API从业者4 小时前
Python + 淘宝 API 开发:自动化采集商品数据的完整流程
大数据·运维·前端·数据挖掘·自动化
烛阴5 小时前
TypeScript高手密技:解密类型断言、非空断言与 `const` 断言
前端·javascript·typescript
样子20185 小时前
Uniapp 之renderjs解决swiper+多个video卡顿问题
前端·javascript·css·uni-app·html
Nicholas685 小时前
flutterAppBar之SystemUiOverlayStyle源码解析(一)
前端
黑客飓风6 小时前
JavaScript 性能优化实战大纲
前端·javascript·性能优化
emojiwoo7 小时前
【前端基础知识系列六】React 项目基本框架及常见文件夹作用总结(图文版)
前端·react.js·前端框架
张人玉8 小时前
XML 序列化与操作详解笔记
xml·前端·笔记
杨荧8 小时前
基于Python的宠物服务管理系统 Python+Django+Vue.js
大数据·前端·vue.js·爬虫·python·信息可视化
YeeWang8 小时前
🎉 Eficy 让你的 Cherry Studio 直接生成可预览的 React 页面
前端·javascript
gnip8 小时前
Jenkins部署前端项目实战方案
前端·javascript·架构