感谢大家的阅读,希望大家在文章中能有所收获,带(*)的是基础文章,有基础的小伙伴可以跳过
该博客能够解决的问题
我觉得程序员最缺的就是时间,一个博客有没有用,能解决什么问题应该提前说明,所以我把本文章能解决的问题都列了出来,大家看下有没有合适自己的。
- 两种x-easypdf版本导出的方法
- dromara/x-easypdf模板设置自定义字体失败,版本(2.12.2)
- 化学符号导出是一个#,例如氧气本来应该是O₂,导出是O#
- 本地导出可以为什么服务器上导出失败了、或者干脆就是乱码了
两种x-easypdf版本的使用(*)
在写博客之前,其实我认为x-easypdf并不复杂,官网有教程也有例子直接使用就好,唯一需要注意的是x-easypdf有两个版本
- dromara/x-easypdf(poi式拼接版本)
- ittoyxk/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_/article/details/
本地导出可以为什么服务器上导出失败了、或者干脆就是乱码了
首先看下的启动方式:
- 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但是这样终端打出来的日志是乱码的,不过能变相解决问题吧~
到这里博客就完了,写到这里也是陆陆续续写下来的,中前很多事情耽搁了,但是还是坚持下来了,也是解决问题过程中是在花费成本太高了让人念念不忘啊,也正因为淋过雨所以想给大家撑把伞。求点个赞吧!!!!!!!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/59958.html