-
springboot集成itextpdf动态生成pdf并展示
背景
接上文SpringBoot集成markdown实现文档管理,对于表格的支持markdown不是特别友好,同时内部文档管理需要增加表格式api接口文档的功能,所以决定采用结合数据库存储与动态生成pdf借助目录结构展示的方式
表结构设计
目录表
DROP TABLE IF EXISTS `knowledge_interfacecatalog`;
CREATE TABLE `knowledge_interfacecatalog` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`UnitGuid` varchar(50) DEFAULT NULL,
`AddDate` datetime DEFAULT NULL,
`CataName` varchar(100) DEFAULT NULL,
`ParentCataGuid` varchar(50) DEFAULT NULL,
`SortNum` int(11) DEFAULT NULL,
`DocGuid` varchar(50) DEFAULT NULL,
KEY `ID` (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4;
接口内容表
DROP TABLE IF EXISTS `knowledge_interfaceinfo`;
CREATE TABLE `knowledge_interfaceinfo` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`UnitGuid` varchar(50) DEFAULT NULL,
`AddDate` datetime DEFAULT NULL,
`InterfaceName` varchar(100) DEFAULT NULL,
`Description` varchar(500) DEFAULT NULL,
`Remark` varchar(500) DEFAULT NULL,
`ParamJson` varchar(2000) DEFAULT NULL,
`ResponseJson` varchar(2000) DEFAULT NULL,
`InterfaceAddress` varchar(500) DEFAULT NULL,
`SortNum` int(11) DEFAULT NULL,
`CataGuid` varchar(50) DEFAULT NULL,
`DocGuid` varchar(50) DEFAULT NULL,
KEY `ID` (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8mb4;
录入界面
PDF生成
引用
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.4.3</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
创建PDF
Document document = new Document(PageSize.A2);
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filePath));
document.addTitle(doc.getDocName());
document.addAuthor("xxxxx");
document.addCreationDate();
document.addLanguage("中文");
document.open();
设置自定义字体
File fontFile = new File("font/msyh.ttf");
BaseFont bf = BaseFont.createFont(fontFile.getAbsolutePath(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font fontChinese5 = new Font(bf,14);
添加章节与段落
//目录的字体
Font cataFont = new Font(bf, 24, Font.NORMAL, BaseColor.BLACK);
// 接口的字体
Font interFont = new Font(bf, 20, Font.NORMAL, BaseColor.BLACK);
for(int i=1;i<=10;i++){
Chapter chapter = new Chapter(new Paragraph("目录", cataFont),i);
for(int j=1;j<=5;j++){
Section section = chapter.addSection(new Paragraph("接口", interFont));
}
document.add(chapter);
}
document.close();
添加表格
PdfPTable table = new PdfPTable(3);//生成一个3列的表格
//表格垂直居中
table.setHorizontalAlignment(Element.ALIGN_CENTER);
table.setTotalWidth(800f);
float[] widths = new float[] { 150f,325f,325f };
table.setWidths(widths);
PdfPCell cell;
cell = new PdfPCell(new Paragraph("接口地址",fontChinese5));
table.addCell(cell);
cell = new PdfPCell(new Paragraph(interfaceInfoDO.getInterfaceAddress(),fontChinese5));
cell.setColspan(2);
table.addCell(cell);
制表符替换
在pdf生成过程中\t制表符无效导致样式变动,需要进行编码替换replace("\t","\u00a0\u00a0\u00a0\u00a0")
PDF展示
这里选择的是pdf.js进行展示,引用相关文件,地址栏出入file代表url地址即可,因为用于接口文档展示,所以我需要默认进入就是目录模式,所以需要对页面进行相关js处理
<script type="text/javascript">
var interval = setInterval('loadPdf()', 1000);
function loadPdf() {
if (PDFViewerApplication.pdfDocument == null) {
console.info('Loading...');
} else {
clearInterval(interval);
console.info('Load Success...');
var sidebarToggle = $("#sidebarToggle");
var viewOutline = $("#viewOutline");
if(!sidebarToggle.hasClass("toggled")){
sidebarToggle.click();
}
if(!viewOutline.hasClass("toggled")){
viewOutline.click();
}
}
}
</script>
展示效果
出处:https://www.cnblogs.com/yanpeng19940119/p/15257535.html
最新更新
python爬虫及其可视化
使用python爬取豆瓣电影短评评论内容
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比