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文件夹下即可

相关推荐
AI大模型顾潇23 分钟前
[特殊字符] 本地大模型编程实战(29):用大语言模型LLM查询图数据库NEO4J(2)
前端·数据库·人工智能·语言模型·自然语言处理·prompt·neo4j
九月TTS1 小时前
TTS-Web-Vue系列:Vue3实现内嵌iframe文档显示功能
前端·javascript·vue.js
爱编程的小学究1 小时前
【node】如何把包发布到npm上
前端·npm·node.js
weixin_473894771 小时前
前端服务器部署分类总结
前端·网络·性能优化
LuckyLay2 小时前
React百日学习计划-Grok3
前端·学习·react.js
澄江静如练_2 小时前
小程序 存存上下滑动的页面
前端·javascript·vue.js
互联网搬砖老肖2 小时前
Web 架构之会话保持深度解析
前端·架构
菜鸟una2 小时前
【taro3 + vue3 + webpack4】在微信小程序中的请求封装及使用
前端·vue.js·微信小程序·小程序·typescript·taro
hao_04132 小时前
elpis-core: 基于 Koa 实现 web 服务引擎架构设计解析
前端
狂野小青年3 小时前
npm 报错 gyp verb `which` failed Error: not found: python2 解决方案
前端·npm·node.js