Java 生成区域分布 PDF:从三栏抬头到 2px 合计线的逐块解剖

简介: 本文详解jquick-pdf实现四川区域分布报表的版式设计:21行明细表采用无竖线横线表、三栏抬头、下划线标题、SVG地图按宽缩放、五张浅蓝分析卡片等技巧,并附GeoJSON读取与地图渲染的Java代码实践。

jquick-pdf 区域分布报表实战:一份 21 行明细表的版式解剖与地图嵌入

官网示例:

摘要(meta description):省公共信用信息平台的区域均衡分析材料,主体是一张 21 行的市州明细表,配一张四川省行政区划底图和五段分析结论。这类报表的成败在版式:表怎么画才不散、地图给多宽才不糊、分析区用什么形式才不像附录。本文以模板文件为主线逐块解剖,Java 侧的 GeoJSON 读取与地图渲染放在末尾作注脚(jquick-pdfx 4.7.0+,Apache-2.0)。

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

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

在这里插入图片描述

翻开模板,第一眼是抬头那三栏

这份模板我先看的不是图,是抬头。80 多行里开场只有 16 行,但信息层次排得很清楚:

<div style="borderBottom:2px solid #1F4E79; paddingBottom:8px; marginBottom:10px; keepTogether:true">
  <div style="display:flex; justifyContent:space-between">
    <div style="width:150px">…省公共信用信息平台…</div>
    <div style="width:250px; textAlignment:center">…区域业务受理量分布…</div>
    <div style="width:150px; textAlignment:right">…2025年1月15日…</div>
  </div>
</div>

三栏定宽:左 150、中 250、右 150,加起来 550,剩下的宽度被 space-between 均分成两道缝。左边的平台名是 10pt 深蓝加粗,中间主标题 16pt 深蓝加粗居中,右边日期 9pt 灰色右对齐。左中右三个位置的眼位分别是"谁出的""叫什么""什么时候",从左往右读一遍,落款信息就齐了。省掉"报送对象""密级"这些格子,抬头只有一行。

抬头底下不是色块,是一根 borderBottom:2px 的深蓝线,paddingBottom:8px 让文字和线之间留出呼吸,marginBottom:10px 把它和正文隔开。整份文档的主色 #1F4E79 就在这一根线上定了调,后面所有的章节标题、卡片左肩线都从它来。(效果预览图 alt:jquick-pdf 生成的四川区域业务分布 PDF,三栏抬头、21 行浅线明细表、深蓝色行政区划地图、五张浅蓝分析卡片)

keepTogether:true 抬头和章节块上都有,作用是防止这一块被分页切开,避免第二页顶上出现半个标题。

一级标题是「下划线式」,不是色块

三个一级标题写法完全一致:

<h2 style="color:#1F4E79; fontSize:13pt; bold:true; borderBottom:1px solid #1F4E79; paddingBottom:3px; marginBottom:8px">'一、各市(州)业务受理量明细'</h2>

13pt 深蓝加粗,底下压一根 1px 同色线,paddingBottom:3px 贴着字底。这是老派公文和研报里最常见的章节分隔方式:不加底色、不加圆角、不加图标,一条线就是全部装饰。好处是页面干净,21 行表格加一张地图已经很满,标题再搞得花哨,整页会显得吵。

编号用中文数字加顿号,三处顺序是明细、地图、分析,也就是"先看数、再看位置、后看结论":数字给精确值,地图给空间直觉,分析给判断。

paddingBottom:3px 这个值调过:给到 6px 线离字太远,标题像浮在空中;给到 0 线贴着字脚,13pt 的中文字下缘会压到线。

明细表:表头用 td,竖线一根不画

21 行加合计行的表,最容易出的问题不是数据错,是"看起来像 Excel"。

<tr>
  <td style="width:200px; bold:true; padding:6px 4px; borderBottom:1px solid #E3E8EE">'地区'</td>
  <td style="width:130px; bold:true; padding:6px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'受理量(件)'</td>
  <td style="width:110px; bold:true; padding:6px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'同比增长'</td>
  <td style="width:120px; padding:6px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'全省占比'</td>
</tr>

表头没有用 th,用的是 td 加 bold:true;没有底色,只有一条底线;四列宽度 200 / 130 / 110 / 120 加起来 560,正好等于表格的 width:560px。全表不画一根竖线,也没有外框,靠每行一条 1px 的 #E3E8EE 浅灰线把 21 行数据和合计行串起来。

这种"横线表"对长表格特别合适。21 个市州竖着排,每格都画边框就是八十多个格子的网格,眼睛会在格子里跳;只留横线,每行像一条记录,视线顺着左列往下滑,找"成都市""甘孜州"快得多。

四个列宽也不是随手给的。地区列 200px 是给自治州名字留的——"阿坝藏族羌族自治州"九个字,9pt 字号要差不多 100pt 才排得下,200px 富余但不会浪费太多,因为其他三列都是数字,宽度需求稳定。三个数字列里受理量最宽(千分位五位数,42,180),占比最窄(23.8% 这种格式最多五个字符)。

对齐是统一的:文字列左对齐,三个数字列全部 textAlign:right。右对齐之后各位数字在竖直方向对齐,扫一眼能比出量级;左对齐的话 42,180 和 2,410 首位对不齐,就没有可比性了。表头也跟着右对齐。

同比增长那一列没有加正号,写的就是 6.2%、11.8%。21 个市州全部正增长,加号满天飞反而噪音,模板的处理是把"全部为正"这个前提交给下面分析区的文字去交代。

合计行与那根 2px 底线

<td style="padding:6px 4px; bold:true; borderBottom:2px solid #1F4E79">'全省合计(21个市州)'</td>

合计行没有反白底色,也没有灰底,就是四格加粗字,最后一根横线从 1px 换成 2px 深蓝。这一根线的分量比它看起来大:21 行细线已经把眼睛带到了表尾,最后一根 2px 的深线相当于句号,读者的视线到这儿自动停住,不会继续往下滑到地图标题上。

第一格的文案写的是"全省合计(21个市州)",把口径直接写在标签里。区域报表常见的争议是"这个合计含不含省本级""21 个还是 20 个",标签里写清楚,比在页脚加注释有效得多。

我把 21 个市的受理量加了一遍:42,180 + 14,260 + 12,840 + 11,520 + 10,360 + 9,180 + 8,940 + 8,120 + 7,860 + 6,540 + 5,920 + 5,680 + 5,240 + 4,860 + 4,320 + 3,980 + 3,760 + 3,520 + 3,240 + 2,860 + 2,410,结果 177,590,和合计行一字不差。成都 42,180 ÷ 177,590 等于 23.75%,表里写 23.8%,四舍五入对得上。

地图区只声明宽度

<div style="display:flex; justifyContent:center">
  <svg style="width:700pt">${svg}</svg>
</div>
<p style="fontSize:9pt; color:#6c757d; italic:true; marginTop:6px">'图 1  四川省21个市(州)业务受理量分布(底图:四川省行政区划)'</p>

<svg> 只有 width,没有 height。这是这份模板最值得学的一手:渲染器按 800×600 的画布画地图,模板只把宽度压到 700pt,高度按原比例跟着缩到 525pt 左右,轮廓不会变形。要是宽高都写死,700×400 这种比例会把四川的版图横向拉扁——地图被拉扁比任何排版问题都刺眼,因为读者对省界形状有肌肉记忆。

700pt 这个宽度也是算过的。正文版心 560px 的表,地图给到 700pt(差不多 933px),图比表宽出一截,视觉上成为页面的重心;地图再窄,21 个市州的相对位置就分不清了,甘孜、阿坝那种大块区域会被压成一片深蓝。外面套一层 justifyContent:center 的 flex 容器让整块图水平居中,左右留白对称。

图注一行 9pt 斜体灰色,一句话交代"图 1 + 内容 + 底图来源"。斜体是弱化处理,读图时不会先读注,要找口径时又一眼能看见。

分析区:五张卡片,没有圆点

<list style="listStyleType:none; paddingLeft:0px; fontSize:10pt">
  <li style="marginBottom:6px; padding:8px; backgroundColor:#E8F0F7; borderLeft:3px solid #1F4E79">
    <span style="bold:true; color:#1F4E79">'成都平原经济区领跑:'</span>'成都市受理 42,180 件、占全省 23.8%…'
  </li>
</list>

listStyleType:none 把项目符号关掉,paddingLeft:0 把列表默认缩进去掉,每个 li 换成一块 #E8F0F7 浅蓝底、左边 3px 深蓝肩线的卡片,卡片之间 6px 间距。五条结论就是五张卡片,竖着摞下来。

这个改法解决了一个具体问题:分析区如果还是普通项目符号列表,读起来像附录,读者会跳过。换成卡片之后,每条结论成了一个独立的信息块,底色加肩线自带边界,bold 加 #1F4E79 的前缀"成都平原经济区领跑:"在每块里先立一个判断,后面跟数据和解释。五条分别是领跑、增速、尾部、分化、建议,判断在前、依据在后,这是分析文字该有的顺序。

五条全部同底色同肩线,没有一条被特意加重,连"建议"那条也是。结论区五条并列,谁都不该比谁更响,要突出建议得在文字里下功夫。

卡片之间的 6px 不能省。3px 试过,五块浅蓝几乎连成一片,肩线看着像一根断断续续的长线;10px 又散,五块各说各话。

页脚一行灰字

<lineSeparator style="strokeColor:#DCE3EC"></lineSeparator>
<p style="color:#6c757d; fontSize:8pt; marginTop:8px">'数据来源:省公共信用信息平台 | 统计口径:2024年1月 - 12月 | 生成时间:2025年1月15日'</p>

先一根浅灰分隔线,再一行 8pt 灰字,三段信息用竖线隔开:谁给的数、什么口径、什么时候生成。

统计口径写的是"2024年1月 - 12月",抬头日期 2025 年 1 月 15 日,同比拿 2024 对 2023。数据周期、生成时间、同比基期三个时间概念各在各的位置,谁都不含混。

Java 侧三个注脚

版式讲完,回过头补三处代码上的事。

第一处是地图的数据来源。GeoOption.setGeoJsonContent() 吃的是一个 GeoJSON 字符串,Demo 里用 readFromClasspath("sample/test.geojson") 从 classpath 读,读取方法自己写了个私有工具,Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName) 拿流再用 UTF-8 逐行拼。

这个工具方法里有个顺序问题:try 的资源列表里先建了 InputStreamReader(is, UTF_8),is == null 的判断写在后面。真找不到文件的时候,先炸的是包装流那一行,抛出来的是空指针,自定义的那句 File not found in classpath 根本轮不到执行。我在自己项目里换成了先判空再包装,报错信息才有用。

第二处是枚举名。JChartType.Geo 是首字母大写、后面小写,和常见的全大写枚举风格不一致,照着 LINE、BAR 那样写 GEO 会编不过。这类地方别凭记忆写,从 Demo 里复制最稳。

第三处是配置挂载。地图的配置不在 JOption 的通用字段上,得先建 GeoOption,setBackgroundColor("#1F4E79") 定填充色——和模板主色同一个色号,图和页面才是一套——再 option.setGeoOption(geoOption) 挂上去,然后 renderChart(JChartType.Geo, option)。

PDF 那一段和所有 Demo 一样:setFlexLayout(true)、bind("svg", svg)、executeResource("report/biz/18_region_geo.txt")、写字节到 D:\test\biz\18_region_geo.pdf。这份模板里 flex 出现在两处,抬头三栏和地图容器,开关不打开,抬头会从三栏塌成一栏。

复现清单

  1. 依赖 io.github.paohaijiao:jquick-pdfx:4.7.0+(Apache-2.0 协议);
  2. 准备 GeoJSON 底图放 classpath(Demo 用 sample/test.geojson),写一个按 UTF-8 读取的私有方法;
  3. new GeoOption(),setGeoJsonContent(...) 灌底图,setBackgroundColor("#1F4E79") 定填充色;
  4. new JOption() 后 setGeoOption(geoOption),renderChart(JChartType.Geo, option) 取 SVG;
  5. JPdfConfig 开 setFlexLayout(true),构造 JQuickPdfFactory 后 bind("svg", svg);
  6. executeResource("report/biz/18_region_geo.txt") 执行模板,写 D:\test\biz\18_region_geo.pdf;
  7. 核对 21 个市州受理量合计 177,590 与合计行一致;
  8. 检查地图 <svg> 是否只声明 width:700pt,高度交给比例缩放。

完整源码附录

/*
 * 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.chart;

import com.github.paohaijiao.JOption;
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.geo.GeoOption;
import org.junit.Test;

import java.io.*;
import java.nio.charset.StandardCharsets;

/**
 * 业务场景 Demo 18:区域业务分布表(政务/信用平台)
 *
 * <p>业务场景:省公共信用信息平台按行政区划汇总业务受理量,用于省社会信用体系建设联席会议的区域均衡分析。</p>
 * <p>实际图表类型:{@link JChartType#Geo} 地图(GeoJSON 行政区划图,底图区域为四川省 21 个市/州)。</p>
 *
 * <p>模板:{@code report/biz/18_region_geo.txt};地图以 SVG 文本形式绑定到模板的 {@code ${svg}} 占位符,
 * 输出到 {@code D:\test\biz\18_region_geo.pdf}。</p>
 *
 * <p>图表尺寸说明:地图按渲染器默认画布 800pt × 600pt(宽 × 高)绘制;模板中 {@code <svg>} 只声明宽度、
 * 不声明高度,宽度被页面自动收窄时高度会按原比例同步缩放,不会纵向拉伸变形。</p>
 *
 * @author Martin
 * @version 1.0.0
 */
public class JQuickBiz18RegionGeoTest {
   

    public static final String path = JQuickConstant.path;

    /**
     * 从 classpath 读取文本内容(GeoJSON 底图)
     */
    private String readFromClasspath(String fileName) throws IOException {
   
        StringBuilder content = new StringBuilder();
        try (InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName);
             BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) {
   
            if (is == null) {
   
                throw new IOException("File not found in classpath: " + fileName);
            }
            String line;
            while ((line = br.readLine()) != null) {
   
                content.append(line).append("\n");
            }
        }
        return content.toString();
    }

    @Test
    public void biz18RegionGeo() throws IOException {
   
        JOption option = new JOption();
        GeoOption geoOption = new GeoOption();
        // 读取 classpath 下的四川省行政区划 GeoJSON(21 个市/州)作为底图
        geoOption.setGeoJsonContent(readFromClasspath("sample/test.geojson"));
        // 地图填充色沿用政务系统低饱和主色(深蓝)
        geoOption.setBackgroundColor("#1F4E79");
        option.setGeoOption(geoOption);

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

        File dir = new File(path + "biz");
        if (!dir.exists()) {
   
            dir.mkdirs();
        }
        FileOutputStream fileOutputStream = new FileOutputStream(path + "biz/18_region_geo.pdf");
        JPdfConfig config = new JPdfConfig();
        // 开启 flex 行布局,使模板中的 display:flex 生效(图表居中)
        config.getLayoutConfig().setFlexLayout(true);
        JQuickPdfFactory factory = new JQuickPdfFactory(config);
        factory.bind("svg", svg);
        byte[] bytes = factory.executeResource("report/biz/18_region_geo.txt");
        fileOutputStream.write(bytes);
        fileOutputStream.close();
    }
}
<pdf>
<body>
  <div style="borderBottom:2px solid #1F4E79; paddingBottom:8px; marginBottom:10px; keepTogether:true">
    <div style="display:flex; justifyContent:space-between">
      <div style="width:150px">
        <p style="color:#1F4E79; fontSize:10pt; bold:true">'省公共信用信息平台'</p>
      </div>
      <div style="width:250px; textAlignment:center">
        <h1 style="color:#1F4E79; fontSize:16pt; bold:true; textAlignment:center">'区域业务受理量分布'</h1>
      </div>
      <div style="width:150px; textAlignment:right">
        <p style="color:#6c757d; fontSize:9pt">'2025年1月15日'</p>
      </div>
    </div>
  </div>

  <div style="marginBottom:10px">
    <h2 style="color:#1F4E79; fontSize:13pt; bold:true; borderBottom:1px solid #1F4E79; paddingBottom:3px; marginBottom:8px">'一、各市(州)业务受理量明细'</h2>
    <table style="width:560px; fontSize:9pt">
      <tr>
        <td style="width:200px; bold:true; padding:6px 4px; borderBottom:1px solid #E3E8EE">'地区'</td>
        <td style="width:130px; bold:true; padding:6px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'受理量(件)'</td>
        <td style="width:110px; bold:true; padding:6px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'同比增长'</td>
        <td style="width:120px; bold:true; padding:6px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'全省占比'</td>
      </tr>
      <tr>
        <td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'成都市'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'42,180'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'6.2%'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'23.8%'</td>
      </tr>
      <tr>
        <td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'绵阳市'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'14,260'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'9.4%'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'8.0%'</td>
      </tr>
      <tr>
        <td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'宜宾市'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'12,840'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'11.8%'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'7.2%'</td>
      </tr>
      <tr>
        <td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'南充市'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'11,520'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'7.6%'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'6.5%'</td>
      </tr>
      <tr>
        <td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'泸州市'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'10,360'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'8.9%'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'5.8%'</td>
      </tr>
      <tr>
        <td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'凉山彝族自治州'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'9,180'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'12.6%'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'5.2%'</td>
      </tr>
      <tr>
        <td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'达州市'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'8,940'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'6.8%'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'5.0%'</td>
      </tr>
      <tr>
        <td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'乐山市'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'8,120'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'5.4%'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'4.6%'</td>
      </tr>
      <tr>
        <td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'德阳市'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'7,860'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'8.2%'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'4.4%'</td>
      </tr>
      <tr>
        <td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'眉山市'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'6,540'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'10.6%'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'3.7%'</td>
      </tr>
      <tr>
        <td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'遂宁市'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'5,920'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'7.2%'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'3.3%'</td>
      </tr>
      <tr>
        <td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'内江市'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'5,680'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'5.9%'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'3.2%'</td>
      </tr>
      <tr>
        <td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'自贡市'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'5,240'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'4.8%'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'3.0%'</td>
      </tr>
      <tr>
        <td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'广元市'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'4,860'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'9.1%'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'2.7%'</td>
      </tr>
      <tr>
        <td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'巴中市'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'4,320'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'11.2%'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'2.4%'</td>
      </tr>
      <tr>
        <td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'雅安市'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'3,980'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'8.6%'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'2.2%'</td>
      </tr>
      <tr>
        <td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'资阳市'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'3,760'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'6.4%'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'2.1%'</td>
      </tr>
      <tr>
        <td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'广安市'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'3,520'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'7.8%'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'2.0%'</td>
      </tr>
      <tr>
        <td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'攀枝花市'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'3,240'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'3.6%'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'1.8%'</td>
      </tr>
      <tr>
        <td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'甘孜藏族自治州'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'2,860'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'15.8%'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'1.6%'</td>
      </tr>
      <tr>
        <td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'阿坝藏族羌族自治州'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'2,410'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'14.2%'</td>
        <td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'1.4%'</td>
      </tr>
      <tr>
        <td style="padding:6px 4px; bold:true; borderBottom:2px solid #1F4E79">'全省合计(21个市州)'</td>
        <td style="padding:6px 4px; textAlign:right; bold:true; borderBottom:2px solid #1F4E79">'177,590'</td>
        <td style="padding:6px 4px; textAlign:right; bold:true; borderBottom:2px solid #1F4E79">'7.5%'</td>
        <td style="padding:6px 4px; textAlign:right; bold:true; borderBottom:2px solid #1F4E79">'100.0%'</td>
      </tr>
    </table>
  </div>

  <div style="marginBottom:10px">
    <h2 style="color:#1F4E79; fontSize:13pt; bold:true; borderBottom:1px solid #1F4E79; paddingBottom:3px; marginBottom:8px">'二、全省区域分布图'</h2>
    <div style="display:flex; justifyContent:center">
      <svg style="width:700pt">${svg}</svg>
    </div>
    <p style="fontSize:9pt; color:#6c757d; italic:true; marginTop:6px">'图 1  四川省21个市(州)业务受理量分布(底图:四川省行政区划)'</p>
  </div>

  <div style="marginBottom:10px">
    <h2 style="color:#1F4E79; fontSize:13pt; bold:true; borderBottom:1px solid #1F4E79; paddingBottom:3px; marginBottom:8px">'三、区域均衡分析'</h2>
    <list style="listStyleType:none; paddingLeft:0px; fontSize:10pt">
      <li style="marginBottom:6px; padding:8px; backgroundColor:#E8F0F7; borderLeft:3px solid #1F4E79"><span style="bold:true; color:#1F4E79">'成都平原经济区领跑:'</span>'成都市受理 42,180 件、占全省 23.8%,绵阳、德阳、眉山合计 28,660 件,四市合计占全省 39.9%。'</li>
      <li style="marginBottom:6px; padding:8px; backgroundColor:#E8F0F7; borderLeft:3px solid #1F4E79"><span style="bold:true; color:#1F4E79">'民族地区增速领先:'</span>'甘孜藏族自治州同比增长 15.8%、阿坝藏族羌族自治州 14.2%、凉山彝族自治州 12.6%,均显著高于全省 7.5% 的平均增速。'</li>
      <li style="marginBottom:6px; padding:8px; backgroundColor:#E8F0F7; borderLeft:3px solid #1F4E79"><span style="bold:true; color:#1F4E79">'尾部地区基数偏低:'</span>'阿坝 2,410 件、甘孜 2,860 件、攀枝花 3,240 件,三地合计仅占全省 4.8%,业务体量仍有较大提升空间。'</li>
      <li style="marginBottom:6px; padding:8px; backgroundColor:#E8F0F7; borderLeft:3px solid #1F4E79"><span style="bold:true; color:#1F4E79">'增速分化明显:'</span>'21 个市(州)全部实现同比增长,但增速区间自 3.6%(攀枝花市)延伸至 15.8%(甘孜藏族自治州),区域间差异较大。'</li>
      <li style="marginBottom:6px; padding:8px; backgroundColor:#E8F0F7; borderLeft:3px solid #1F4E79"><span style="bold:true; color:#1F4E79">'建议:'</span>'对攀枝花、自贡等低增速地区开展专项督导,同时将甘孜、阿坝的线上受理经验向全省推广,缩小区域服务能力差距。'</li>
    </list>
  </div>

  <lineSeparator style="strokeColor:#DCE3EC"></lineSeparator>
  <p style="color:#6c757d; fontSize:8pt; marginTop:8px">'数据来源:省公共信用信息平台 | 统计口径:2024年1月 - 12月 | 生成时间:2025年1月15日'</p>
</body>
</pdf>
相关文章
|
13天前
|
Linux 开发工具 iOS开发
Codex保姆级教程(下载+安装+登录+使用,含所有版本,2026最新)
Codex是OpenAI推出的开源AI编程智能体,本地运行,可理解整个代码库,支持自然语言指令改代码、执行命令、跑测试、修Bug,兼容Win/macOS/Linux。(239字)
5437 40
|
13天前
|
JavaScript API iOS开发
DeepSeek Harness下载、安装、配置一篇搞定(2026整理,送常用插件)
DeepSeek Harness(DSH)是DeepSeek于2026年开源的MIT协议AI Agent框架,支持插件化组装模型、工具、沙箱与UI,兼容主流大模型。本文提供免Node.js的桌面端安装包(Win/macOS),含详细图文教程及热门插件推荐。
4770 56
|
8天前
|
Linux 开发工具 iOS开发
2026最新codex下载安装保姆级使用教程(下载+安装+登录+使用,含所有历史版本)
本文详解OpenAI Codex国内快速上手指南:提供Win/macOS/Linux全平台免安装包、npm/Homebrew等多方式安装、账号/API Key双登录、简体中文切换,覆盖下载、安装、汉化、使用及高频避坑(如微软商店失败、npm超时等),10分钟即可跑通。
1968 6
|
14天前
|
iOS开发 Docker MacOS
【2026实测】Docker Desktop下载、安装、汉化、配置教程(附官网安装包)
Docker Desktop 是 Docker 官方推出的桌面容器管理工具,集成引擎、CLI、图形界面与 Kubernetes,支持 Win/macOS/Linux。2026 最新版 4.88.1 强化 ARM 原生运行、镜像加速及资源可视化,附中文汉化与国内镜像配置指南。
2266 7
|
5天前
|
人工智能 安全 API
DeepSeek Harness下载、安装、配置一篇搞定(2026整理,送常用插件)
DeepSeek Harness(dsh)是DeepSeek AI于2026年开源的轻量级Agent运行框架,基于Cordis内核,践行“一切皆插件”理念。支持Web/桌面双端,开箱即用;内置多模型接入、丰富插件生态(超3.5万),适配编程、办公、创作等场景。(239字)
1248 0
|
8天前
|
云安全 人工智能 安全
|
1天前
|
云安全 人工智能 安全
|
7天前
|
人工智能 并行计算 调度
本地 AI 一键部署工具 LocModel:Windows 端集成画图、视频生成、Agent 的开源模型运行方案
LocModel 是专为 Windows 设计的一站式本地 AI 工具,支持零配置启动、自动硬件检测、GGUF 模型一键加载、文生图/视频生成及 Agent 自动化任务。适配 8G 显存,内置显存分片调度,轻松实现 AI 漫剧批量创作与离线大模型调用。(239 字)

热门文章

最新文章