java 导出Pdf 使用x-easypdf(化学符号导出失败或者是#号的问题)

感谢大家的阅读,希望大家在文章中能有所收获,带(*)的是基础文章,有基础的小伙伴可以跳过

该博客能够解决的问题

        我觉得程序员最缺的就是时间,一个博客有没有用,能解决什么问题应该提前说明,所以我把本文章能解决的问题都列了出来,大家看下有没有合适自己的。

  • 两种x-easypdf版本导出的方法
  • dromara/x-easypdf模板设置自定义字体失败,版本(2.12.2
  • 化学符号导出是一个#,例如氧气本来应该是O₂,导出是O#
  • 本地导出可以为什么服务器上导出失败了、或者干脆就是乱码了

两种x-easypdf版本的使用(*)

        在写博客之前,其实我认为x-easypdf并不复杂,官网有教程也有例子直接使用就好,唯一需要注意的是x-easypdf有两个版本

  1. dromara/x-easypdf(poi式拼接版本)
  2. 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_56055726/article/details/127681943

字体合并文章:https://blog.csdn.net/qq_31351705/article/details/126633721
字体下载:http://www.downza.cn/

本地导出可以为什么服务器上导出失败了、或者干脆就是乱码了

        首先看下的启动方式:

  1. mvn clean package
  2. 上传jar包到服务器中
  3. 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

但是这样终端打出来的日志是乱码的,不过能变相解决问题吧~

到这里博客就完了,写到这里也是陆陆续续写下来的,中前很多事情耽搁了,但是还是坚持下来了,也是解决问题过程中是在花费成本太高了让人念念不忘啊,也正因为淋过雨所以想给大家撑把伞。求点个赞吧!!!!!!!

  • 24
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值