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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/42793.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字化电池直击安全耐用痛点,绿源有望用技术赢得市场口碑

电动两轮车行业&#xff0c;正面临着长期的市场重构。从新国标的正式实行&#xff0c;到消费者对电动车需求的变化&#xff0c;局势变了。有的品牌开始更在意表面的包装&#xff0c;也有的品牌紧盯着安全和质量&#xff0c;做深层的创新。 其中&#xff0c;绿源作为电动两轮车…

力扣爆刷第160天之TOP100五连刷66-70(回溯、旋转图像、技巧题)

力扣爆刷第160天之TOP100五连刷66-70&#xff08;回溯、旋转图像、技巧题&#xff09; 文章目录 力扣爆刷第160天之TOP100五连刷66-70&#xff08;回溯、旋转图像、技巧题&#xff09;一、110. 平衡二叉树二、39. 组合总和三、543. 二叉树的直径四、470. 用 Rand7() 实现 Rand1…

免费可商用的Navicat Premium Lite要不要用?小心收到律丝函!

作者公众号&#xff1a;霸王龙的日常 专注数据库&#xff0c;分享实用的项目实战经验。 上周五写了一篇关于Navicat Premium Lite的文章&#xff0c;有网友去官网下载&#xff0c;反馈当前官网Navicat Premium Lite简介和我之前文章中的介绍的有出入。 我赶紧打开网站看了下Na…

MySQL性能优化 一、系统配置优化

数据库优化纬度有四个&#xff1a; 硬件升级、系统配置、表结构设计、SQL语句及索引。 优化选择&#xff1a; 优化成本&#xff1a;硬件升级 > 系统配置 > 表结构设计 > SQL语句及索引优化效果&#xff1a;硬件升级 < 系统配置 < 标结果设计 < SQL语句及索…

深圳网站设计一般流程是怎样的

深圳作为中国的IT产业中心&#xff0c;拥有众多优秀的网站设计公司以及专业的网站设计团队。对于一个深圳的网站设计项目&#xff0c;一般的流程是按照以下步骤进行的&#xff1a; 1. 确立需求&#xff1a;首先&#xff0c;网站设计公司需要和客户充分沟通&#xff0c;了解客户…

在信创环境中信创沙箱扮演一个什么样的角色?

在信创领域中&#xff0c;沙箱技术扮演着举足轻重的角色&#xff0c;其不仅为信息安全提供了强有力的保障&#xff0c;更为数据防泄密提供了有效手段。随着信息技术的飞速发展&#xff0c;数据安全已成为国家、企业乃至个人关注的重点。信创沙箱技术作为其中的佼佼者&#xff0…

深度网络现代实践 - 深度前馈网络之反向传播和其他的微分算法篇-续

序言 反向传播&#xff08;Backpropagation&#xff0c;简称backprop&#xff09;是神经网络训练过程中最关键的技术之一&#xff0c;尤其在多层神经网络中广泛应用。它是一种与优化方法&#xff08;如梯度下降法&#xff09;结合使用的算法&#xff0c;用于计算网络中各参数的…

瑞萨RA6M3开发实践-UART实践-亲测有效 || 过程中遇到的问题

目录 写在前面 一、开发环境 二、编译下载 三、遇到的错误及解决方法 四、开启串口uart4的打印结果 写在前面 在看这编之前要是不太懂可参考HMI-Board (rt-thread.org)&#xff0c;本文章为在此基础上进行相应开发。 一、开发环境 rtthread studio版本2.2.6&#xff0c;…

python singledispatch 根据传入参数的类型自动选择相应的实现

functools 模块中的 singledispatch 装饰器允许你定义一个函数&#xff0c;并根据传入参数的类型自动选择相应的实现。这在处理不同类型的输入时非常有用。 singledispatch 装饰器提供了一种在 Python 中实现函数重载的方式。虽然 Python 本身不支持传统的函数重载&#xff08…

基于Sentence Transformer微调向量模型

Sentence Transformer库升级到了V3&#xff0c;其中对模型训练部分做了优化&#xff0c;使得模型训练和微调更加简单了&#xff0c;跟着官方教程走了一遍&#xff0c;顺利完成向量模型的微调&#xff0c;以下是对官方教程的精炼和总结。 一 所需组件 使用Sentence Transforme…

原生Ajax技术的执行流程,用火山写作创作的,总感觉差点意思。

启动原生Ajax操作可遵循以下步骤&#xff1a; 首先&#xff0c;我们需要构建一个XMLHttpRequest对象以实现与服务器的有效互动。这个过程往往是借助于调用XMLHttpRequest对象的构造函数得以实现。 接下来&#xff0c;我们有必要对请求细节进行设定&#xff0c;包括明确请求方法…

叹为观止|四款让人赞不绝口的优质软件,越用越上瘾

不说闲话直接上狠货&#xff0c;下面神仙软件&#xff0c;都值得使用。 Smart Defrag 说起电脑运行慢或者抽风&#xff0c;磁盘碎片就是让电脑变得又卡又不稳定的元凶之一。 不过Smart Defrag就算是新手小白也能操作&#xff0c;它里面藏着一个超强的碎片整理引擎&#xff0…

一.2.(5)共射、共集、共基三种基本放大电路的静态及动态分析;

共什么的问题&#xff1a;共什么取决于输入输出&#xff0c;共剩下的那一极 1.基本共射放大电路 见前面章节&#xff0c;不做累述 2.基本共集放大电路 列KVL方程&#xff0c;求解 AU1&#xff0c;所以又叫射极跟随器 Ib是流入基极的电流&#xff0c;Ii是从输入交流信号源流出的…

SpringBoot源码阅读(1)——环境搭建

SpringBoot官网 官网 https://spring.io/projects/spring-boot 代码仓库 github&#xff1a;https://github.com/spring-projects/spring-boot gitee: https://gitee.com/mirrors/spring-boot 下载代码 git clone https://gitee.com/mirrors/spring-boot.git下载的代码中有些…

(广东省检测鉴定协会)常用金属材料检测模拟题

一、单选题 1.钢筋实测抗拉强度与实测屈服强度之比不小于( )? A.1.25 B.1.3 C.1.35 D.1.1 参考答案:A 2.钢筋实测屈服强度与标准规定的屈服强度特征值之比不大于( )。 A.1.05 B.1.25 C.1.3 D.1.35 参考答案:C 3.HRB400E钢筋最大力总延伸率要求应不小于( ) A.7…

CnosDB:深入理解时序数据修复函数

CnosDB是一个专注于时序数据处理的数据库。CnosDB针对时序数据的特点设计并实现了三个强大的数据修复函数&#xff1a; timestamp_repair – 对时间戳列进行有效修复&#xff0c;支持插入、删除、不变等操作。value_repair – 对值列进行智能修复&#xff0c;根据时间戳间隔和…

【源代码】srm供应商管理系统,招标管理系统,在线询价管理系统

前言&#xff1a; 随着互联网和数字技术的不断发展&#xff0c;企业采购管理逐渐走向数字化和智能化。数字化采购平台作为企业采购管理的新模式&#xff0c;能够提高采购效率、降低采购成本、优化供应商合作效率&#xff0c;已成为企业实现效益提升的关键手段。系统获取平台私…

干冰运输与存储中的温度监测:确保药品安全与合规性

在制药行业&#xff0c;干冰对于运输和储存对温度敏感的药品&#xff0c;如原料药API、疫苗、冻干物质和人体组织样本等至关重要。虹科ELPRO LIBERO系列干冰温度记录仪&#xff0c;能够为您提供专业的解决方案&#xff0c;定期监测和记录干冰运输和存储过程中的温度&#xff0c…

基于Java+SpringMvc+Vue技术的就医管理系统设计与实现系统(源码+LW+部署讲解)

目录 界面展示 第六章 部分代码实现 6.1 Spring boot 配置代码 6.2 用户管理及登录登出代码 6.3 Md5 加密算法代码 6.4 部分数据库代码 六、论文参考&#xff1a; 七、其他案例&#xff1a; 系统介绍&#xff1a; 就医管理系统&#xff0c;也称为医院管理系统&#…

14-21 剑和远方1 - AI历史及简单神经网络的工作原理

初始 “我们需要走得更深”这句台词出自电影《盗梦空间》。这是在讨论深入梦境更深层次时说的&#xff0c;暗示需要探索梦境的更深层次。虽然这似乎是不可能的&#xff0c;但它传达的理念是&#xff0c;要创造一个新的世界&#xff0c;就必须冒险进入更深的层次。 电影《盗梦空…