感谢大家的阅读,希望大家在文章中能有所收获,带(*)的是基础文章,有基础的小伙伴可以跳过
该博客能够解决的问题
我觉得程序员最缺的就是时间,一个博客有没有用,能解决什么问题应该提前说明,所以我把本文章能解决的问题都列了出来,大家看下有没有合适自己的。
- 两种x-easypdf版本导出的方法
- dromara/x-easypdf模板设置自定义字体失败,版本(2.12.2)
- 化学符号导出是一个#,例如氧气本来应该是O₂,导出是O#
- 本地导出可以为什么服务器上导出失败了、或者干脆就是乱码了
两种x-easypdf版本的使用(*)
在写博客之前,其实我认为x-easypdf并不复杂,官网有教程也有例子直接使用就好,唯一需要注意的是x-easypdf有两个版本
dromara/x-easypdf版本
这个版本的生成方式我很喜欢,首先用模板生成代码真的很少,完全可复用,不同的情况用不用的模板即可(但是无法自定义字体是让我最头痛的,后面也会写出解决思路)(模板文件在附件中,可自行获取)
@org.junit.jupiter.api.Test
public void outPdf() {
// 定义pdf输出路径
String outputPath = "/Users/hz/Downloads/Freemarker.pdf";
// 设置模板路径
XEasyPdfTemplateHandler.DataSource.Freemarker.setTemplatePath("pdf/");
// 定义数据map
// Populate your data
OrderDetails orderDetails = new OrderDetails();
setData(orderDetails);
// 转换pdf
XEasyPdfTemplateHandler.Template.build().setConfigPath("pdf/PdfConfig.xml").setDataSource(
// 构建数据源
XEasyPdfTemplateHandler.DataSource.Freemarker.build()
// 设置模板名称(模板路径下的文件名称)
.setTemplateName("PdfOutConfigDemo.fo")
// 设置模板数据
.setTemplateData(BeanUtil.beanToMap(orderDetails, false, true))
).transform(outputPath);
}
简洁滴很啊,模板内部也是可以设置字体的,可以自行查阅
ittoyxk/x-easypdf版本
给出代码大家就知道了 很麻烦(来自官网2.0.1版本)
public class XpdfTest {
public static void main(String[] args) throws IOException {
final String fontPath = "C:\\Windows\\Fonts\\STSONG.TTF";
final String outputPath = "C:\\Users\\xsx\\Desktop\\pdf\\text.pdf";
// 创建pdf
XEasyPdfUtil.create(
outputPath
// 构建页面
,XEasyPdfHandler.Page.build(
// 构建文本
XEasyPdfHandler.Text.build(
"Hello World(这是一个DEMO)"
).setStyle(XEasyPdfTextStyle.CENTER).setFontSize(20F).setMargin(10F)
// 构建文本
,XEasyPdfHandler.Text.build(
" 这里是正文(这是一个基于PDFBOX开源工具,专注于PDF文件导出功能," +
"以组件形式进行拼接,简单、方便,上手及其容易," +
"目前有TEXT(文本)、LINE(分割线)等组件,后续还会补充更多组件,满足各种需求)。"
).setStyle(XEasyPdfTextStyle.LEFT).setFontSize(14F).setMargin(10F)
// 构建文本
,XEasyPdfHandler.Text.build(
"-- by xsx"
).setStyle(XEasyPdfTextStyle.RIGHT).setFontSize(12F).setMarginTop(10F).setMarginRight(10F)
// 构建文本
,XEasyPdfHandler.Text.build(
"2020.03.12"
).setStyle(XEasyPdfTextStyle.RIGHT).setFontSize(12F).setMarginTop(10F).setMarginRight(10F)
// 构建实线分割线
,XEasyPdfHandler.SplitLine.SolidLine.build().setMarginTop(10F)
// 构建虚线分割线
,XEasyPdfHandler.SplitLine.DottedLine.build().setLineLength(10F).setMarginTop(10F).setLineWidth(10F)
// 构建实线分割线
,XEasyPdfHandler.SplitLine.SolidLine.build().setMarginTop(10F)
// 构建文本
,XEasyPdfHandler.Text.build( "完结").setStyle(XEasyPdfTextStyle.CENTER)
).setFontPath(fontPath)
);
}
}
也就是说每一个元素我们都要去布局,一行一行去写,这个代码量是比较大的,特别是元素多起来的时候
dromara/x-easypdf模板设置自定义字体失败(未解决,代码不支持需要改源码,但是模板哪里是可以设置的)
这种通过模板导出的方式谁能不爱呢,我使用的版本(2.12.2),代码根据各种方式设置都是不行的,我们需要修改字体文件的方式替换字体实现(如果是解决化学符号问题,资源里面有文件【merge.ttf】,模版设置为仿宋即可),下面是错误示范这样是不行的别学,源码不支持
@org.junit.jupiter.api.Test
public void outPdf() {
// 定义pdf输出路径
String outputPath = "/Users/hz/Downloads/Freemarker.pdf";
// 设置模板路径
XEasyPdfTemplateHandler.DataSource.Freemarker.setTemplatePath("pdf/");
// 定义数据map
// Populate your data
OrderDetails orderDetails = new OrderDetails();
setData(orderDetails);
// 转换pdf
XEasyPdfDocument transform = XEasyPdfTemplateHandler.Template.build().setConfigPath("pdf/PdfConfig.xml").setDataSource(
// 构建数据源
XEasyPdfTemplateHandler.DataSource.Freemarker.build()
// 设置模板名称(模板路径下的文件名称)
.setTemplateName("PdfOutConfigDemo.fo")
// 设置模板数据
.setTemplateData(BeanUtil.beanToMap(orderDetails, false, true))
).transform();
transform.setFontPath("C:\\a.ttf");
transform.save(outputPath);
}
化学符号导出是一个#
这个问题其实也很简单,如果说是字体中没有这个符号这个字就是#号,特别是化学符号中文基本都是不支持的,例如:微软雅黑、仿宋、宋体、思源等等,都是不行的,化学符号支持比较好的是segoeuisl.ttf,但是这个不支持中文。所以我们需要将中文这两种字体合并一下,仿宋和 segoeuisl.ttf 的合并文件在资源包【merge.ttf】中了,有需要的可以自取
这里也可以自己创造字体(同时支持中文和特殊字符),觉得仿宋不好看的也可以自己合成,我将合适的文章在下方,我认为下方博主在这个问题上已经讲的很详细了,我也亲自在windows电脑试了下,合并和导出都是可以的,亲门可以放心使用。
这是我认为比较好的文章大家借阅一下,写的真的好
解决思路:https://blog.csdn.net/m0_56055726/article/details/127681943
字体合并文章:https://blog.csdn.net/qq_31351705/article/details/126633721
字体下载:http://www.downza.cn/
本地导出可以为什么服务器上导出失败了、或者干脆就是乱码了
首先看下的启动方式:
- mvn clean package
- 上传jar包到服务器中
- java -jar huasuan-order.jar --server.port=8084 --spring.jpa.show-sql=false
我是windows服务器,这样的方式是通过CMD方式打包的,终端是GBK的编码,然后项目总体是UTF-8,怎么能不乱吗呢?
解决方式:java -Dfile.encoding=utf-8 -jar huasuan-order.jar --server.port=8084但是这样终端打出来的日志是乱码的,不过能变相解决问题吧~
到这里博客就完了,写到这里也是陆陆续续写下来的,中前很多事情耽搁了,但是还是坚持下来了,也是解决问题过程中是在花费成本太高了让人念念不忘啊,也正因为淋过雨所以想给大家撑把伞。求点个赞吧!!!!!!!