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