首页 > 编程语言 >java生成图片和pdf

java生成图片和pdf

时间:2024-04-16 10:34:33浏览次数:19  
标签:java image flying 生成 new pdf font saucer

Flying Saucer 方案

Flying Saucer 开源协议的的坑

flying-saucer-core - Core library and Java2D rendering 开源协议LGPL
flying-saucer-pdf - PDF output using OpenPDF (ex. iText 2.x) 开元协议 MPL-2.0/LGPL
flying-saucer-pdf-itext5 - PDF output using iText 5.x (iText 5 is EOL) 开源协议是AGPL不要使用
flying-saucer-pdf-openpdf - not supported anymore (replaced by flying-saucer-pdf) 

能用的就只有flying-saucer-core和flying-saucer-pdf 两个组件

实现

<dependency>
    <groupId>org.xhtmlrenderer</groupId>
    <artifactId>flying-saucer-core</artifactId>
    <version>9.1.22</version>
</dependency>

遗留问题:字体一直生效不了,生成的图片字体显示差点意思,没有结合flying-saucer-pdf组件

// 心率报告模板
        String htmlString = "<!DOCTYPE html>\n" +
                "<html lang=\"zh-CN\">\n" +
                "  <head>\n" +
                "    <meta charset=\"UTF-8\" />\n" +
                "    <title>检测报告</title>\n" +
                "    <style>\n" +
                "@font-face {" +
                "    font-family: 'STCAIYUN';" +
                "    src: url('C:\\Windows\\Fonts\\STCAIYUN.TTF');" + // Replace with the path to your custom font file
                "}" +
                "      body {\n" +
                "        font-family: \"STCAIYUN\", sans-serif;\n" +
                "        margin: 0;\n" +
                "        padding: 0;\n" +
                "        font-size: 14px;\n" +
                "        color: #333;\n" +
                "      }\n" +
                "      .report {\n" +
                "        width: 80%%;\n" +
                "        margin: 20px auto;\n" +
                "        background-color: #fff;\n" +
                "        padding: 20px;\n" +
                "      }\n" +
                "      .report h1 {\n" +
                "        text-align: center;\n" +
                "        font-size: 20px;\n" +
                "        margin-bottom: 10px;\n" +
                "      }\n" +
                "      table {\n" +
                "        width: 100%%;\n" +
                "        border-collapse: collapse;\n" +
                "        margin-bottom: 15px;\n" +
                "      }\n" +
                "      th,\n" +
                "      td {\n" +
                "        padding: 8px 10px;\n" +
                "        text-align: left;\n" +
                "      }\n" +
                "      tr:nth-child(odd) {\n" +
                "        background-color: transparent;\n" +
                "      }\n" +
                "      .status-bad {\n" +
                "        color: #e54d4d;\n" +
                "      }\n" +
                "      .status-good {\n" +
                "        color: #26b281;\n" +
                "      }\n" +
                "      .t1 {\n" +
                "        border-bottom: 1px solid #ddd;\n" +
                "      }\n" +
                "    </style>\n" +
                "  </head>\n" +
                "  <body>\n" +
                "    <div class=\"report\">\n" +
                "      <h1>检测报告</h1>\n" +
                "      <table class=\"t1\">\n" +
                "        <tr>\n" +
                "          <th>年龄</th>\n" +
                "          <td>%s岁</td>\n" +
                "        </tr>\n" +
                "        <tr>\n" +
                "          <th>身高</th>\n" +
                "          <td>%scm</td>\n" +
                "        </tr>\n" +
                "        <tr>\n" +
                "          <th>体重</th>\n" +
                "          <td>%skg</td>\n" +
                "        </tr>\n" +
                "        <tr>\n" +
                "          <th>日常运动强度</th>\n" +
                "          <td>%s</td>\n" +
                "        </tr>\n" +
                "        <tr>\n" +
                "          <th>生活习惯</th>\n" +
                "          <td>%s</td>\n" +
                "        </tr>\n" +
                "        <tr>\n" +
                "          <th>患有疾病</th>\n" +
                "          <td>%s</td>\n" +
                "        </tr>\n" +
                "      </table>\n" +
                "      <table>\n" +
                "        <tr>\n" +
                "          <th>检测项目</th>\n" +
                "          <th>结果值</th>\n" +
                "          <th>状态</th>\n" +
                "        </tr>\n" +
                "        <tr>\n" +
                "          <td>心率</td>\n" +
                "          <td>%sbpm</td>\n" +
                "          <td>%s</td>\n" +
                "        </tr>\n" +
                "        <tr>\n" +
                "          <td>血氧饱和度</td>\n" +
                "          <td>%s</td>\n" +
                "          <td>%s</td>\n" +
                "        </tr>\n" +
                "        <tr>\n" +
                "          <td>呼吸频率</td>\n" +
                "          <td>%s次/分钟</td>\n" +
                "          <td>%s</td>\n" +
                "        </tr>\n" +
                "        <tr>\n" +
                "          <td>微循环</td>\n" +
                "          <td>%s</td>\n" +
                "          <td>%s</td>\n" +
                "        </tr>\n" +
                "        <tr>\n" +
                "          <td>心率变异性</td>\n" +
                "          <td>%s</td>\n" +
                "          <td>%s</td>\n" +
                "        </tr>\n" +
                "        <tr>\n" +
                "          <td>不规则心律</td>\n" +
                "          <td>%s次/分钟</td>\n" +
                "          <td>%s</td>\n" +
                "        </tr>\n" +
                "        <tr>\n" +
                "          <td>疲劳指数</td>\n" +
                "          <td>%s</td>\n" +
                "          <td>%s</td>\n" +
                "        </tr>\n" +
                "      </table>\n" +
                "    </div>\n" +
                "  </body>\n" +
                "</html>\n";
        //处理数据
        ArrayList<String> fieldValues = new ArrayList<>();
        // 获取 HeartRateReport 类的所有字段
        Field[] fields = HeartRateReport.class.getDeclaredFields();
        for (Field field : fields) {
            if ("channelId".equals(field.getName())||"archiveId".equals(field.getName())) {
                continue;
            }
            // 设置字段可访问
            field.setAccessible(true);
            // 获取字段值并添加到集合中
            Object value = field.get(heartRateReport);
            fieldValues.add(String.valueOf(value));
        }
        String text =String.format(htmlString,fieldValues.toArray());
        //String text = MessageFormat.format(htmlString, fieldValues);
        // 创建 DocumentBuilder 对象
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        // 使用 DocumentBuilder 将 HTML 字符串解析为 org.w3c.dom.Document 对象
        InputSource is = new InputSource();
        is.setCharacterStream(new StringReader(text));
        Document doc = builder.parse(is);
        Java2DRenderer java2DRenderer = new Java2DRenderer(doc, 800, 600);

        BufferedImage image = java2DRenderer.getImage();
        File outputFile = new File("C:\\\\Users\\\\mjyang6\\\\Desktop\\\\a2.png");
        FSImageWriter imageWriter = new FSImageWriter();
        imageWriter.setWriteCompressionQuality(1.0f);
        imageWriter.write(image, "C:\\\\Users\\\\mjyang6\\\\Desktop\\\\a2.png");
        //ImageIO.write(image, "png", outputFile);
        /*// 加载本地字体文件
        Font customFont = Font.createFont(Font.TRUETYPE_FONT, new File("C:\\Windows\\Fonts\\simhei.ttf"));
        // 调整字体大小和样式
        customFont = customFont.deriveFont(Font.PLAIN, 10);

        Java2DRenderer java2DRenderer = new Java2DRenderer(doc, 800, 600);
        BufferedImage image = java2DRenderer.getImage();
        Graphics2D graphics = image.createGraphics();
        graphics.setFont(customFont);
        ImageIO.write(image, "png", new File("C:\\\\Users\\\\mjyang6\\\\Desktop\\\\a3.png"));
        graphics.dispose();*/

PDFBox方案

适应性的问题比较难搞,效果可以,但是不好满足根据模板生成pdf的要求,未具体实现

标签:java,image,flying,生成,new,pdf,font,saucer
From: https://www.cnblogs.com/edger007/p/18136105

相关文章

  • 生成小程序二维码
    publicfunctiongetCode(){$access_token=$this->getAccessToken();$width=430;//二维码宽度$page='pages/index/index';//小程序路径(pages/index/index)$scene='?type=1&user_id='.$this->auth......
  • Java从单体架构到微服务架构
     Java从单体架构到微服务架构一,单体架构单体架构是一种传统的架构,也被称为单体应用架构,在单体架构中一个应用程序通常会被作为一个单一整体的单元进行运行,它通常由用户交互层,业务逻辑层和数据管理层组成,并且公用同一个数据库 在这种架构中,整个应用程序的代码和功能都集......
  • 【进阶篇】Java 实际开发中积累的几个小技巧(二)
    目录前言六、自定义注解6.1定义注解6.2切面实现6.3业务使用七、抽象类和接口7.1隔离业务层与ORM层7.2隔离子系统的业务实现7.3选择对比文章小结前言笔者目前从事一线Java开发今年是第3个年头了,从0-1的SaaS、PaaS的项目做过,基于多租户的标准化开发项目也做过,项目的PM......
  • JAVA各种系统架构图及其简介
    JAVA各种系统架构图及其简介1.spring架构图 Spring是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。Spring框架的功能可以用在任何J2EE服务器中,大多数......
  • Java架构核心基础知识硬核整理,赶快收藏起来吧
    Java架构核心基础知识硬核整理,赶快收藏起来吧Java架构核心基础lecture:波哥一、数据结构和算法1.数据结构  数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者......
  • JAVA各种系统架构图,终于有人把Java程序员必学知识点全整理出来了
    JAVA各种系统架构图,终于有人把Java程序员必学知识点全整理出来了1.spring架构图Spring是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。Spring框架的功能......
  • Java分布式架构:应用+特点+架构模式
    Java分布式架构是一个复杂的主题,它涉及到许多不同的概念和技术。在本文中,我们将介绍Java分布式架构的应用、特点和架构模式,以便更好地了解该主题。应用:Java分布式架构可以应用于许多不同的场景,例如:电子商务网站:电子商务网站需要处理大量的交易和订单,而Java分布式......
  • day11_我的Java学习笔记 (static_静态成员变量+静态成员方法_工具类、代码块_静态代码
    0.面向对象进阶1.static静态关键字1.1static是什么,static修饰成员变量的用法Java成员变量成员方法Python类(对象)属性类(对象)方法static修饰成员变量的应用:在线人数统计1.2static修饰成员变量的内存原理1.3static修饰成员方法的基本......
  • day10_01_我的Java学习笔记 (JavaSE进阶课程预备)
    JavaSE进阶课程预备1.JavaSE加强课程简介2.IDEA开发模式统一工程,相当于一个小区的院子;模块,是小区的哪一栋;包,是这栋楼的那一单元类,是这个单元的哪一层楼;对象,是这层楼具体的某一户房间。eg:滢水山庄二区--工程9栋--模块4单元--包8楼--类......
  • day10_02_我的Java学习笔记 (JavaSE加强课程介绍、先建空工程--再建模块--然后建包--
    JavaSE基础加强课程介绍1.JavaSE加强课程简介2.IDEA开发模式统一工程,相当于一个小区的院子;模块,是小区的哪一栋;包,是这栋楼的那一单元类,是这个单元的哪一层楼;对象,是这层楼具体的某一户房间。eg:溪山美地二区--工程9栋--模块4单元--包8楼--......