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

相关推荐
star010-16 分钟前
【视频+图文详解】HTML基础4-html标签的基本使用
前端·windows·经验分享·网络安全·html·html5
engchina21 分钟前
CSS Display属性完全指南
前端·css
engchina24 分钟前
详解CSS `clear` 属性及其各个选项
前端·css·css3
MatpyMaster1 小时前
基于PyQt5打造的实用工具——PDF文件加图片水印,可调大小位置,可批量处理!
python·pdf
yashunan2 小时前
Web_php_unserialize
android·前端·php
m0_zj2 小时前
17.[前端开发]Day17-形变-动画-vertical-align
前端·css·chrome·html·html5
Edward-tan2 小时前
【玩转全栈】--创建一个自己的vue项目
前端·javascript·vue.js
青年夏日科技工作者3 小时前
虚幻浏览器插件 UE与JS通信
前端·javascript·html
雷神乐乐3 小时前
创建前端项目的方法
前端·javascript·vue.js
prince_zxill3 小时前
JavaScript面向对象编程:Prototype与Class的对比详解
前端·javascript·ecmascript·原型模式