当前位置: 首页 > news >正文

markdown文件转pdf

步骤:md转html转pdf
pom引入
 <!--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代码

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为HTMLMutableDataSet 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并转换为XHTMLDocument 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);// 写法2Resource 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 转化为 pdfHtmlConverter.convertToPdf(xhtmlDoc.html(), outputStream, converterProperties);System.out.println("PDF创建成功!");} catch (IOException e) {System.err.println("文件读取/写入错误: " + e.getMessage());e.printStackTrace();}}}
字体文件(见资源文件,可下载)

放在resources文件夹下即可

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 了解AsyncRotationController
  • 【C语言】C语言-身份证管理系统(源码+注释)【独一无二】
  • mybatis日志记录方案
  • 解决vue多层弹框时存在遮挡问题
  • 新质生产力赛道核心解读,机械制造何以“向智向新”
  • 深入理解Spring Cloud中的服务注册
  • Docker Desktop如何换镜像源?
  • jdevelope安装
  • MinIO:开源对象存储解决方案的领先者
  • FlyDeliver践行社会责任,推动绿色物流发展
  • vue前端面试
  • 数据建设实践之大数据平台(四)
  • 搜索引擎算法工程师,在query理解方面,都有哪些方面的工作
  • 水库大坝安全监测险情应对措施
  • vscode使用ssh连接远程服务器
  • 4个实用的微服务测试策略
  • Android Volley源码解析
  • css属性的继承、初识值、计算值、当前值、应用值
  • java第三方包学习之lombok
  • Java读取Properties文件的六种方法
  • JS学习笔记——闭包
  • Mybatis初体验
  • Node 版本管理
  • Rancher如何对接Ceph-RBD块存储
  • tab.js分享及浏览器兼容性问题汇总
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • win10下安装mysql5.7
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 观察者模式实现非直接耦合
  • 排序算法之--选择排序
  • 配置 PM2 实现代码自动发布
  • 前端面试题总结
  • 使用Swoole加速Laravel(正式环境中)
  • 微信小程序:实现悬浮返回和分享按钮
  • 一个JAVA程序员成长之路分享
  • 找一份好的前端工作,起点很重要
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • $GOPATH/go.mod exists but should not goland
  • (+4)2.2UML建模图
  • (1)(1.9) MSP (version 4.2)
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (web自动化测试+python)1
  • (二)换源+apt-get基础配置+搜狗拼音
  • (四)库存超卖案例实战——优化redis分布式锁
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .net framework4与其client profile版本的区别
  • .net 按比例显示图片的缩略图
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .net反编译的九款神器
  • .NET设计模式(2):单件模式(Singleton Pattern)