Java PDF 报表开发:JHeatmap 二维矩阵 + 紫色渐变抬头的报告模板解剖

简介: 本文详解jquick-pdf热力图在信用评级报告中的实战应用:用颜色深浅直观呈现“月度×业务线”二维经营数据,替代冗长表格;涵盖紫色主题模板设计、SVG图表嵌入、JHeatmap三元组数据配置及双轴设置,附170行模板与完整Java源码(Apache-2.0)。

jquick-pdf 热力图实战:月度×业务线的二维经营数据怎么放进 PDF 信用评级报告

摘要(meta description):月度数据按业务线拆开看,行式表格要翻半天,热力图用颜色深浅把二维矩阵一次铺开,哪条线哪个月冲高一眼定位。本文以 jquick-pdf 热力图为例,从模板第一行解剖到最后一行:渐变抬头内嵌三张元信息小卡、两列信息表、紫底财务表、图例双栏排布,每段讲清删改后的渲染变化;JHeatmap 的 Object 三元组、JCategoryAxis 双轴配置作注脚挂在图表区。附完整 Java 源码与 170 行模板(jquick-pdfx 4.7.0+,Apache-2.0)。

标签:jquick-pdf、Java PDF、报表开发、热力图

二维交叉数据,热力图比表格省一半版面

评级报告里最占版面的就是"月度×业务线"这类二维数据:四条业务线乘六个月,表格要二十四格,行式排列翻着看还容易串行。热力图把同一份数据画成颜色矩阵,值大的格子深、值小的格子浅,哪条业务线哪个月冲高、哪块区域整片偏淡,一眼定位。jquick-pdf 的热力图渲染成 SVG 灌进 ${svg} 占位符,本篇素材是官方 Demo JQuickCreditReport10HeatmapTest,输出 D:\test\creditreport\10_heatmap.pdf。

整页紫色主题:渐变深紫抬头里直接嵌了三张元信息小卡,财务表压紫底表头,图表区居中放 24 格热力矩阵,说明图例拆成左右两栏收在图下。(效果预览图 alt:jquick-pdf 热力图信用评级报告 PDF,紫色渐变主题抬头,六个月四条业务线的营收热力矩阵居中展示)

官网示例:

真实渲染效果预览

以下为上述代码 + 模板真实运行生成的 PDF 首屏预览(由 jquick-pdf 渲染输出,非示意图):

image.png

从模板第一行开始拆

credit_report_10_heatmap.txt 全文 170 行,七个区块。

渐变抬头:色带里嵌元信息小卡

<div style="background:linear-gradient(135deg, #311B92 0%, #673AB7 100%); borderRadius:8px; paddings:16px; marginBottom:18px">
  <h1 style="fontSize:21; color:white; textAlignment:center; bold:true; marginBottom:12px">'企业信用评级报告'</h1>
  <div style="display:flex; justifyContent:space-around">
    <div style="width:180px; textAlignment:center">
      <div style="fontSize:8; color:#d1c4e9; textAlignment:center; marginBottom:3px">'报告编号'</div>
      <div style="fontSize:10; color:white; textAlignment:center">'CR-2023-08975'</div>
    </div>
    <!-- 评估日期 / 评估机构,两张同构小卡 -->
  </div>
</div>

抬头从单行文字升级成两层结构:上层 21 号白字大标题,下层 justifyContent:space-around 均分三张 180px 元信息卡,标签 8 号浅紫、值 10 号纯白。元信息进色带的好处是省一个区块——报告编号、日期、机构三行不再单独占版心,报告正文从抬头下面直接开始。纵向间距也配比过:h1 的 marginBottom:12px 把大标题和元信息卡隔开,卡内标签到值只留 3px——组间松、组内紧,色带高度刚好包住两层不显空。把 h1 的 12px 改成 6px 重跑,色带矮一截,但元信息卡立刻显出贴着标题的局促。space-around 和 space-between 的差别在这里看得见:三张卡两侧也留了半份空隙,不是顶着色带两端排。

paddings:16px 又出现了,还是 paddings 的拼写。上一条经验照用:跑一次看色带内文字贴不贴边,贴边改 padding。渐变底上加 borderRadius:8px,直角色带变圆角色带,这行删掉抬头就回到方块形态——半径数值越大弧越明显,超过 12px 左右深色带的圆角会开始吃内文字空间。

信息表与财务表:紫底体系的两个变体

<th style="backgroundColor:#512DA8; color:white; bold:true; padding:6px; textAlignment:left; width:160px">'统一信用代码'</th>

信息表沿用两列结构,首行 th 换成 #512DA8 中紫实底,其余行垫 #ede7f6 浅紫,160px 加 440px 的宽度分配照旧。深紫首行压在浅紫标签列上面,信息表的视觉入口被抬到第一行,评审视线先落在"统一信用代码"这条最关键的锚定信息上,其余五条顺着浅紫列往下走。财务表则是标准六列:紫底白字表头、borderBottom:1px solid #ede7f6 浅紫行线,净利润和净资产两行整行垫 #f6f4fb 做斑马纹——浅紫系里垫白偏紫的第三档色,斑马纹的对比故意压得很低,只在凑近看时才起作用,整页的紫不会被打断。增长率列上 color:#512DA8; bold:true,紫主题里"重要列自己带主题色"的写法不变。

要留意的是浅紫斑马纹 #f6f4fb 和行线 #ede7f6 色差极小,灰度打印后两档基本融合,斑马纹失效但表格不塌——线框和行线还在。这是低对比斑马纹比深色斑马纹适合打印场景的原因。

图表区:居中矩阵加双栏图例

<h2 style="fontSize:13; color:#311B92; bold:true; textAlignment:center; marginBottom:10px">'月度经营热力图'</h2>
<div style="textAlignment:center">
  <svg style="width:450px;height:400px">${svg}</svg>
</div>
<div style="marginTop:10px">
  <h3 style="fontSize:12; color:#311B92; bold:true; textAlignment:center; marginBottom:8px">'评级指标说明'</h3>
  <div style="display:flex; justifyContent:space-between">
    <div style="width:290px">
      <div style="fontSize:10; marginBottom:6px">
        <span style="color:#512DA8; bold:true">'● 财务状况(90分): '</span>
        '营收稳定增长'
      </div>
      <!-- 经营能力95分 -->
    </div>
    <div style="width:290px">
      <!-- 偿债能力85分 / 发展潜力92分 -->
    </div>
  </div>
</div>

热力图 svg 写死 450×400 居中独占,不带侧面板——矩阵图横向跨度大,压进半宽栏里格子会被挤扁,独占整行是对的。图例创新在排布:四条说明拆成左右两个 290px 容器,每条竖排两条,形成一个 2×2 的紧凑块,比四条横排省一半纵向空间;290×2 加中间空隙恰好 600,双栏铺满版心不留死边。marginTop:10px 把图例块和图隔开,删掉它图例会贴着矩阵下沿。

色点还是绿红橙混搭的四色,与热力图的颜色映射没有对应关系,只做条目分隔。热力图真正的"图例"是颜色深浅和数值的映射规则,模板里没有文字说明这层映射——严谨的报告可以在图下补一行"颜色越深营收越高",这行模板里没有,复用时看业务需要加。

数据侧再说一句:Demo 里 24 条三元组是手写常量,真实项目里这批数必然由数据层拼接——行下标、列下标全部程序生成,SQL 出来的结果集按 y 分组循环展开即可。手写 24 条只是演示数据量,行列涨到 8×12 时手写就是灾难,拼接逻辑从第一天就按通用写,模板和图表配置不用动。

Java 侧的热力图配置作注脚挂在这:

JOption option = new JOption();
option.title("月度经营热力图", "各业务线月度营收(万元)");
option.xAxis(new JCategoryAxis().data("1月", "2月", "3月", "4月", "5月", "6月"));
option.yAxis(new JCategoryAxis().data("软件产品", "技术服务", "云服务", "其他业务"));
JHeatmap heatmap = new JHeatmap();
heatmap.data(
        new Object[]{
   0, 0, 860}, new Object[]{
   0, 1, 1020}, new Object[]{
   0, 2, 1180},
        new Object[]{
   0, 3, 1340}, new Object[]{
   0, 4, 1520}, new Object[]{
   0, 5, 1680},
        new Object[]{
   1, 0, 520}, new Object[]{
   1, 1, 640}, new Object[]{
   1, 2, 780},
        new Object[]{
   1, 3, 890}, new Object[]{
   1, 4, 1010}, new Object[]{
   1, 5, 1160},
        new Object[]{
   2, 0, 380}, new Object[]{
   2, 1, 460}, new Object[]{
   2, 2, 540},
        new Object[]{
   2, 3, 620}, new Object[]{
   2, 4, 710}, new Object[]{
   2, 5, 820},
        new Object[]{
   3, 0, 260}, new Object[]{
   3, 1, 310}, new Object[]{
   3, 2, 360},
        new Object[]{
   3, 3, 420}, new Object[]{
   3, 4, 470}, new Object[]{
   3, 5, 540}
);
option.series(heatmap);

String svg = JChartRendererFactory.renderChart(JChartType.HEATMAP, option);

五个落点:每条数据是 {x, y, value} 三元组,x 是列下标、y 是行下标,都从 0 起——第一行业务线的 1 月是 {0,0,860},下标越界的格子直接丢数据不报错,行列数变了先数三元组;x 轴放时间、y 轴放业务线是刻意安排,时间从左到右递增符合阅读惯性,反着放矩阵每行都要从右往左读;title 的双参数形式把主副标题一起传了,图表内会再渲染一遍标题,而模板 h2 也写了"月度经营热力图"——双层标题语义重复,复用时二选一;数据按业务线分段排布(每行六条连排),纯为人工可读性,顺序不影响渲染,乱序传也能画对;枚举名是 JChartType.HEATMAP 全大写,和 Funnel、Guage 的驼峰式不是一个命名风格,写代码时别顺手驼峰了。

浅紫渐变结论块与页脚

<div style="marginBottom:18px; background:linear-gradient(135deg, #ede7f6 0%, #d1c4e9 100%); borderRadius:10px; padding:16px; borderLeft:4px solid #673AB7">

结论区的渐变放在浅紫区间,深紫只出现在 4px 左边线上——抬头浓、结论淡,页面重心压在上半部,读到结论区情绪收住。borderRadius:10px 是全篇最大圆角,浅色大圆角块和深色方角带形成一软一硬的收尾对照。深色字压浅紫渐变对比度安全,这份模板里结论区没有白字,改渐变时保持浅端即可。页脚 <lineSeparator> 用 #512DA8 中紫,和表头同色,首尾呼应;两行 9 号灰字收尾。

复现清单

1. 新建 Maven 工程引入附录坐标(jquick-pdfx 4.7.0+);
2. 模板文件放到 src/test/resources/report/credit_report_10_heatmap.txt;
3. 拷贝附录 Java 类,确认 JQuickConstant.path 指向本地输出目录;
4. 运行 report10Heatmap(),打开输出的 10_heatmap.pdf;
5. 对照检查:抬头渐变与圆角、元信息三卡排布、热力矩阵行列数与三元组数量一致(24 格);
6. 图表空白时先查两处:setFlexLayout(true) 是否已开、bind 的键与 ${svg} 是否一致。

动手改两行验证

1. 把抬头 space-around 改成 space-between 重跑,观察三张元信息卡
   从"两侧留半份空隙"变成"顶到色带两端"的差异;
2. 把 yAxis 数据顺序倒过来重跑,观察矩阵行序颠倒后
   "从上往下按营收规模排列"的阅读直觉如何被打破。

热力图在评级报告里的适用边界

热力图吃"双维度交叉"的数据:月度×业务线、区域×产品、评分项×季度。单维序列、纯占比数据套热力图都是浪费——一格一色的意义在于让二维交叉的密度模式可见。灰度打印是它的弱项:颜色深浅转灰后相邻档位难分,黑白输出场景要么减少色阶档位、要么在格内直接标数值。格子数量也有上限,行列乘积超过四五十格后单格面积过小,颜色差异挤在一起反而看不出模式,那时候该回表格。复用时还有个工程收益:{x,y,value} 三元组结构天然适合从报表引擎直出,模板、图表配置、数据拼装三层互不牵连,换一批业务数据只动数据源,模板一个字不用改。模板骨架——渐变抬头嵌元信息卡、两列信息表、紫底财务表、居中矩阵、双栏图例、浅紫结论——换掉 #311B92/#512DA8/#ede7f6 三个主色即可整体换装。

完整源码附录

依赖版本 4.7.0+。本项目基于 Apache-2.0 协议开源,使用时请保留源码文件头部原有的 License 与版权声明。

Maven 依赖

<dependency>
    <groupId>io.github.paohaijiao</groupId>
    <artifactId>jquick-pdfx</artifactId>
    <version>4.7.0</version>
    <scope>test</scope>
</dependency>

Gradle 依赖

testImplementation 'io.github.paohaijiao:jquick-pdfx:4.7.0'

Java 测试类(JQuickCreditReport10HeatmapTest.java)

/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * Copyright (c) [2025-2099] Martin (goudingcheng@gmail.com)
 */
package com.github.paohaijiao.biz.report;

import com.github.paohaijiao.JOption;
import com.github.paohaijiao.axis.JCategoryAxis;
import com.github.paohaijiao.config.JPdfConfig;
import com.github.paohaijiao.demo.constant.JQuickConstant;
import com.github.paohaijiao.enums.JChartType;
import com.github.paohaijiao.executor.JQuickPdfFactory;
import com.github.paohaijiao.factory.JChartRendererFactory;
import com.github.paohaijiao.series.JHeatmap;
import org.junit.Test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 统一信用报告 —— 风格 10:热力图(深紫)
 *
 * <p>以 {@code report/credit_report_10_heatmap.txt} 为模板,把热力图渲染成 SVG 后
 * 绑定到模板中的 {@code ${svg}} 占位符,输出到 {@code D:\test\creditreport\10_heatmap.pdf}。</p>
 *
 * @author Martin
 * @version 1.0.0
 */
public class JQuickCreditReport10HeatmapTest {
   

    public static final String path = JQuickConstant.path;

    @Test
    public void report10Heatmap() throws IOException {
   
        JOption option = new JOption();
        option.title("月度经营热力图", "各业务线月度营收(万元)");
        option.xAxis(new JCategoryAxis().data("1月", "2月", "3月", "4月", "5月", "6月"));
        option.yAxis(new JCategoryAxis().data("软件产品", "技术服务", "云服务", "其他业务"));
        JHeatmap heatmap = new JHeatmap();
        heatmap.data(
                new Object[]{
   0, 0, 860}, new Object[]{
   0, 1, 1020}, new Object[]{
   0, 2, 1180},
                new Object[]{
   0, 3, 1340}, new Object[]{
   0, 4, 1520}, new Object[]{
   0, 5, 1680},
                new Object[]{
   1, 0, 520}, new Object[]{
   1, 1, 640}, new Object[]{
   1, 2, 780},
                new Object[]{
   1, 3, 890}, new Object[]{
   1, 4, 1010}, new Object[]{
   1, 5, 1160},
                new Object[]{
   2, 0, 380}, new Object[]{
   2, 1, 460}, new Object[]{
   2, 2, 540},
                new Object[]{
   2, 3, 620}, new Object[]{
   2, 4, 710}, new Object[]{
   2, 5, 820},
                new Object[]{
   3, 0, 260}, new Object[]{
   3, 1, 310}, new Object[]{
   3, 2, 360},
                new Object[]{
   3, 3, 420}, new Object[]{
   3, 4, 470}, new Object[]{
   3, 5, 540}
        );
        option.series(heatmap);

        String svg = JChartRendererFactory.renderChart(JChartType.HEATMAP, option);

        File dir = new File(path + "creditreport");
        if (!dir.exists()) {
   
            dir.mkdirs();
        }
        FileOutputStream fileOutputStream = new FileOutputStream(path + "creditreport/10_heatmap.pdf");
        JPdfConfig config = new JPdfConfig();
        // 开启 flex 行布局:图表与其右侧的指标说明面板在宽度允许时并排,而不是换行堆叠。
        config.getLayoutConfig().setFlexLayout(true);
        JQuickPdfFactory factory = new JQuickPdfFactory(config);
        factory.bind("svg", svg);
        byte[] bytes = factory.executeResource("report/credit_report_10_heatmap.txt");
        fileOutputStream.write(bytes);
        fileOutputStream.close();
    }
}

模板文件(report/credit_report_10_heatmap.txt)

<pdf>
<body>
  <div style="background:linear-gradient(135deg, #311B92 0%, #673AB7 100%); borderRadius:8px; paddings:16px; marginBottom:18px">
    <h1 style="fontSize:21; color:white; textAlignment:center; bold:true; marginBottom:12px">'企业信用评级报告'</h1>
    <div style="display:flex; justifyContent:space-around">
      <div style="width:180px; textAlignment:center">
        <div style="fontSize:8; color:#d1c4e9; textAlignment:center; marginBottom:3px">'报告编号'</div>
        <div style="fontSize:10; color:white; textAlignment:center">'CR-2023-08975'</div>
      </div>
      <div style="width:180px; textAlignment:center">
        <div style="fontSize:8; color:#d1c4e9; textAlignment:center; marginBottom:3px">'评估日期'</div>
        <div style="fontSize:10; color:white; textAlignment:center">'2023年11月15日'</div>
      </div>
      <div style="width:180px; textAlignment:center">
        <div style="fontSize:8; color:#d1c4e9; textAlignment:center; marginBottom:3px">'评估机构'</div>
        <div style="fontSize:10; color:white; textAlignment:center">'四川省企业信用评估中心'</div>
      </div>
    </div>
  </div>

  <div style="marginBottom:18px">
    <h2 style="fontSize:14; color:#311B92; bold:true; marginBottom:10px">'四川省泡海椒科技有限公司'</h2>
    <table style="width:600px; fontSize:10">
      <tr>
        <th style="backgroundColor:#512DA8; color:white; bold:true; padding:6px; textAlignment:left; width:160px">'统一信用代码'</th>
        <td style="padding:6px; textAlignment:left; width:440px">'91110108MA01XX1234'</td>
      </tr>
      <tr>
        <th style="backgroundColor:#ede7f6; color:#311B92; bold:true; padding:6px; textAlignment:left">'成立日期'</th>
        <td style="padding:6px; textAlignment:left">'2018年5月20日'</td>
      </tr>
      <tr>
        <th style="backgroundColor:#ede7f6; color:#311B92; bold:true; padding:6px; textAlignment:left">'注册资本'</th>
        <td style="padding:6px; textAlignment:left">'1000万元人民币'</td>
      </tr>
      <tr>
        <th style="backgroundColor:#ede7f6; color:#311B92; bold:true; padding:6px; textAlignment:left">'法定代表人'</th>
        <td style="padding:6px; textAlignment:left">'泡海椒'</td>
      </tr>
      <tr>
        <th style="backgroundColor:#ede7f6; color:#311B92; bold:true; padding:6px; textAlignment:left">'所属行业'</th>
        <td style="padding:6px; textAlignment:left">'软件和信息技术服务业'</td>
      </tr>
      <tr>
        <th style="backgroundColor:#ede7f6; color:#311B92; bold:true; padding:6px; textAlignment:left">'企业规模'</th>
        <td style="padding:6px; textAlignment:left">'中型(150-200人)'</td>
      </tr>
    </table>
  </div>

  <div style="marginBottom:18px">
    <h2 style="fontSize:13; color:#311B92; bold:true; marginBottom:10px">'历年财务数据(单位:万元)'</h2>
    <table style="width:600px; fontSize:10">
      <tr>
        <th style="backgroundColor:#512DA8; color:white; bold:true; padding:6px; textAlignment:left">'财务指标'</th>
        <th style="backgroundColor:#512DA8; color:white; bold:true; padding:6px; textAlignment:right">'2020年'</th>
        <th style="backgroundColor:#512DA8; color:white; bold:true; padding:6px; textAlignment:right">'2021年'</th>
        <th style="backgroundColor:#512DA8; color:white; bold:true; padding:6px; textAlignment:right">'2022年'</th>
        <th style="backgroundColor:#512DA8; color:white; bold:true; padding:6px; textAlignment:right">'2023年'</th>
        <th style="backgroundColor:#512DA8; color:white; bold:true; padding:6px; textAlignment:right">'增长率'</th>
      </tr>
      <tr>
        <td style="padding:6px; textAlignment:left; borderBottom:1px solid #ede7f6; bold:true">'营业收入'</td>
        <td style="padding:6px; textAlignment:right; borderBottom:1px solid #ede7f6">'8,560'</td>
        <td style="padding:6px; textAlignment:right; borderBottom:1px solid #ede7f6">'12,340'</td>
        <td style="padding:6px; textAlignment:right; borderBottom:1px solid #ede7f6">'18,920'</td>
        <td style="padding:6px; textAlignment:right; borderBottom:1px solid #ede7f6">'25,680'</td>
        <td style="padding:6px; textAlignment:right; borderBottom:1px solid #ede7f6; color:#512DA8; bold:true">'+44.2%'</td>
      </tr>
      <tr>
        <td style="padding:6px; textAlignment:left; borderBottom:1px solid #ede7f6; bold:true; backgroundColor:#f6f4fb">'净利润'</td>
        <td style="padding:6px; textAlignment:right; borderBottom:1px solid #ede7f6; backgroundColor:#f6f4fb">'1,240'</td>
        <td style="padding:6px; textAlignment:right; borderBottom:1px solid #ede7f6; backgroundColor:#f6f4fb">'2,150'</td>
        <td style="padding:6px; textAlignment:right; borderBottom:1px solid #ede7f6; backgroundColor:#f6f4fb">'3,890'</td>
        <td style="padding:6px; textAlignment:right; borderBottom:1px solid #ede7f6; backgroundColor:#f6f4fb">'5,420'</td>
        <td style="padding:6px; textAlignment:right; borderBottom:1px solid #ede7f6; backgroundColor:#f6f4fb; color:#512DA8; bold:true">'+63.8%'</td>
      </tr>
      <tr>
        <td style="padding:6px; textAlignment:left; borderBottom:1px solid #ede7f6; bold:true">'总资产'</td>
        <td style="padding:6px; textAlignment:right; borderBottom:1px solid #ede7f6">'15,800'</td>
        <td style="padding:6px; textAlignment:right; borderBottom:1px solid #ede7f6">'22,450'</td>
        <td style="padding:6px; textAlignment:right; borderBottom:1px solid #ede7f6">'31,200'</td>
        <td style="padding:6px; textAlignment:right; borderBottom:1px solid #ede7f6">'42,800'</td>
        <td style="padding:6px; textAlignment:right; borderBottom:1px solid #ede7f6; color:#512DA8; bold:true">'+39.5%'</td>
      </tr>
      <tr>
        <td style="padding:6px; textAlignment:left; borderBottom:1px solid #ede7f6; bold:true; backgroundColor:#f6f4fb">'净资产'</td>
        <td style="padding:6px; textAlignment:right; borderBottom:1px solid #ede7f6; backgroundColor:#f6f4fb">'9,200'</td>
        <td style="padding:6px; textAlignment:right; borderBottom:1px solid #ede7f6; backgroundColor:#f6f4fb">'13,800'</td>
        <td style="padding:6px; textAlignment:right; borderBottom:1px solid #ede7f6; backgroundColor:#f6f4fb">'19,500'</td>
        <td style="padding:6px; textAlignment:right; borderBottom:1px solid #ede7f6; backgroundColor:#f6f4fb">'26,400'</td>
        <td style="padding:6px; textAlignment:right; borderBottom:1px solid #ede7f6; backgroundColor:#f6f4fb; color:#512DA8; bold:true">'+42.1%'</td>
      </tr>
      <tr>
        <td style="padding:6px; textAlignment:left; borderBottom:1px solid #ede7f6; bold:true">'毛利率'</td>
        <td style="padding:6px; textAlignment:right; borderBottom:1px solid #ede7f6">'42.5%'</td>
        <td style="padding:6px; textAlignment:right; borderBottom:1px solid #ede7f6">'45.8%'</td>
        <td style="padding:6px; textAlignment:right; borderBottom:1px solid #ede7f6">'48.2%'</td>
        <td style="padding:6px; textAlignment:right; borderBottom:1px solid #ede7f6">'51.6%'</td>
        <td style="padding:6px; textAlignment:right; borderBottom:1px solid #ede7f6; color:#512DA8; bold:true">'+9.1%'</td>
      </tr>
    </table>
  </div>

  <div style="marginBottom:18px">
    <h2 style="fontSize:13; color:#311B92; bold:true; marginBottom:10px">'关键经营指标'</h2>
    <div style="display:flex; justifyContent:space-between">
      <div style="width:190px; padding:10px; border:1px solid #673AB7; borderRadius:6px; fontSize:10">
        '营收增长率:连续三年保持40%以上增长,2023年达到25,680万元。'
        '利润率提升:净利率从14.5%提升至21.1%,盈利能力显著增强。'
      </div>
      <div style="width:190px; padding:10px; border:1px solid #673AB7; borderRadius:6px; fontSize:10">
        '研发投入:研发费用年均增长38.9%,占营收比例达13.3%。'
        '人才结构:技术研发人员占比42%,硕士以上学历占35%。'
      </div>
      <div style="width:190px; padding:10px; border:1px solid #673AB7; borderRadius:6px; fontSize:10">
        '客户质量:服务15家上市公司,客户续约率92%,大客户满意度4.8/5.0。'
        '资产质量:资产负债率维持在38%左右,流动比率2.8,偿债能力良好。'
      </div>
    </div>
  </div>

  <div style="marginBottom:18px">
    <h2 style="fontSize:13; color:#311B92; bold:true; textAlignment:center; marginBottom:10px">'月度经营热力图'</h2>
    <div style="textAlignment:center">
      <svg style="width:450px;height:400px">${svg}</svg>
    </div>
    <div style="marginTop:10px">
      <h3 style="fontSize:12; color:#311B92; bold:true; textAlignment:center; marginBottom:8px">'评级指标说明'</h3>
      <div style="display:flex; justifyContent:space-between">
        <div style="width:290px">
          <div style="fontSize:10; marginBottom:6px">
            <span style="color:#512DA8; bold:true">'● 财务状况(90分): '</span>
            '营收稳定增长'
          </div>
          <div style="fontSize:10; marginBottom:6px">
            <span style="color:#2ecc71; bold:true">'● 经营能力(95分): '</span>
            '客户留存率高'
          </div>
        </div>
        <div style="width:290px">
          <div style="fontSize:10; marginBottom:6px">
            <span style="color:#e74c3c; bold:true">'● 偿债能力(85分): '</span>
            '负债率合理'
          </div>
          <div style="fontSize:10; marginBottom:6px">
            <span style="color:#f39c12; bold:true">'● 发展潜力(92分): '</span>
            '研发投入增加'
          </div>
        </div>
      </div>
    </div>
  </div>

  <div style="marginBottom:18px; background:linear-gradient(135deg, #ede7f6 0%, #d1c4e9 100%); borderRadius:10px; padding:16px; borderLeft:4px solid #673AB7">
    <h2 style="fontSize:13; color:#311B92; bold:true; marginBottom:8px">'综合评价'</h2>
    <p style="fontSize:11; textAlignment:left; marginBottom:8px">
      '四川省泡海椒科技有限公司作为国家级高新技术企业和专精特新"小巨人"企业,在云计算和大数据领域表现出色。'
      '公司财务状况健康,经营能力突出,技术创新能力强,具备良好的发展潜力。信用评级为AAA级,展望稳定。'
    </p>
    <p style="fontSize:8; color:#512DA8; textAlignment:right">'认证通过'</p>
  </div>

  <div style="textAlignment:center; marginTop:20px">
    <lineSeparator style="strokeColor:#512DA8"></lineSeparator>
    <p style="fontSize:9; color:#6c757d; textAlignment:center; marginTop:8px">'本报告依据公开信息和专业评估模型生成,仅供参考 | 报告生成时间: 2025年09月06日'</p>
    <p style="fontSize:9; color:#6c757d; textAlignment:center">'© 2023 企业信用评估中心 版权所有 | 认证编号: CE-2023-001'</p>
  </div>
</body>
</pdf>
相关文章
|
6天前
|
JavaScript API iOS开发
DeepSeek Harness下载、安装、配置一篇搞定(2026整理,送常用插件)
DeepSeek Harness(DSH)是DeepSeek于2026年开源的MIT协议AI Agent框架,支持插件化组装模型、工具、沙箱与UI,兼容主流大模型。本文提供免Node.js的桌面端安装包(Win/macOS),含详细图文教程及热门插件推荐。
3040 27
|
1天前
|
云安全 人工智能 安全
|
6天前
|
Linux 开发工具 iOS开发
Codex保姆级教程(下载+安装+登录+使用,含所有版本,2026最新)
Codex是OpenAI推出的开源AI编程智能体,本地运行,可理解整个代码库,支持自然语言指令改代码、执行命令、跑测试、修Bug,兼容Win/macOS/Linux。(239字)
|
7天前
|
iOS开发 Docker MacOS
【2026实测】Docker Desktop下载、安装、汉化、配置教程(附官网安装包)
Docker Desktop 是 Docker 官方推出的桌面容器管理工具,集成引擎、CLI、图形界面与 Kubernetes,支持 Win/macOS/Linux。2026 最新版 4.88.1 强化 ARM 原生运行、镜像加速及资源可视化,附中文汉化与国内镜像配置指南。
1336 5
|
云安全 安全 网络安全
|
7天前
|
安全 算法 定位技术
《高性价比人生指南》完整原版:普通人用最少的资源,过好这一生的底层逻辑~How To Live Better
📖《高性价比人生指南》是一份基于实证、拒绝焦虑的生存手册,倡导以“人生时薪”为视角,重新计算时间、金钱与精力的成本与收益。它不承诺逆袭,只教人算清账:省下的钱若耗掉时间便亏;买体验比买物品更值;睡眠是最高杠杆的健康投资;关系贵在情绪价值而非表面热络;学习重在改变行为而非自我安慰。核心理念:用低成本、高回报的微小行动,换取长期的选择权——不是成为谁,而是掌控自己人生的主动权。
|
20天前
|
人工智能 API 开发工具
DeepSeek Harness 神插件:白嫖 13 家大厂模型
`dsh-our-free-model` 是 DeepSeek Harness 神级插件:零配置、零API Key、零账号,聚合13家大厂免费模型(含DeepSeek V4.1 Flash、Kimi K3等),支持本地网关、用量看板与自动降级,真正实现“白嫖即用”。
3466 53
|
12天前
|
人工智能 JSON Linux
【保姆级】ComfyUI部署教程(下载+安装+配置+工作流,2026最新)
ComfyUI 是一款开源节点式AI生成工具,支持图像、视频、音频及3D内容创作。通过拖拽连线组合模型加载、提示词、采样等节点,构建可复用、易修改的工作流,兼容SD1.5、SDXL、Flux、Qwen Image等主流模型。