Skip to content

表格打印扩展开发

打印模板配置扩展指令

打印模板中表格控件的 打印风格 属性配置为 printOpinionList

20250225161639

新建项目

pom.xml 中引入 co-service-macro-sdk-x.x.x.jarco-service-macro-print-x.x.x.jar

xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.kanq</groupId>
  <artifactId>co-service-ext</artifactId>
  <version>1.0.1</version>
  <packaging>jar</packaging>

  <name>co_service_web_ext_demo</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>

    <dependency>
        <groupId>com.kanq</groupId>
        <artifactId>co-service-macro-sdk</artifactId>
        <version>1.x.x</version>
    </dependency>

    <dependency>
        <groupId>com.kanq</groupId>
        <artifactId>co-service-macro-print</artifactId>
        <version>1.0.58</version>
    </dependency>

  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
</project>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.kanq</groupId>
  <artifactId>co-service-ext</artifactId>
  <version>1.0.1</version>
  <packaging>jar</packaging>

  <name>co_service_web_ext_demo</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>

    <dependency>
        <groupId>com.kanq</groupId>
        <artifactId>co-service-macro-sdk</artifactId>
        <version>1.x.x</version>
    </dependency>

    <dependency>
        <groupId>com.kanq</groupId>
        <artifactId>co-service-macro-print</artifactId>
        <version>1.0.58</version>
    </dependency>

  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
</project>

扩展接口实现

  • 创建 java 类 com.kanq.PrintDemo
  • 增加 private static byte[] printOpinionList(byte[] macroHead,byte[][] argv); 方法
  • 增加指令注册注解 @Macro(name = "printOpinionList", describe = "意见列表打印")

注意

  • 入参说明:
    • macroHead 请求头,参数不定,格式: form:2\r\nuser:1
    • argv 入参参数
  • 出参说明:
    • 字符串:json 格式
    • 文件: 字节流
  • 注解说明:
    • name 指令名称
    • describe 接口描述 :::

macroHead 参数说明

  • addr 当前用户 IP
  • client f: 函数,m:移动动
  • busi 当前业务编号
  • role 当前角色
  • user 当前用户编号
  • stat 当前流程状态
  • tach 当前流程环节
  • flow 当前打开流程
  • form 当前打开表单
  • prev 父级表单
  • tent 指定租户编号
  • trace 链路日志
  • ticket 票据
  • FormDemo.java
java
package com.kanq;

import com.kanq.print.printImpl.PrintImpl;
import com.kanq.print.printImpl.ext.PrintEntity;
import com.kanq.print.printImpl.ext.PrintGrid;
import com.kanq.print.printImpl.ext.PrintGridColn;
import com.kanq.print.printImpl.ext.PrintGridData;
import com.kanq.sdk.config.Macro;
import java.nio.charset.StandardCharsets;

public class PrintDemo {

    @Macro(name = "printOpinionList", describe = "意见列表打印")
    public static byte[] printOpinionList(byte[] macroHead, byte[][] argv){

        byte[] parm_byte = argv[0];

        // 获取xml
        String xml = new String(parm_byte,StandardCharsets.UTF_8);
        System.out.println("printOpinionList:"+xml);

        // 获取处理打印拓展对象
        PrintImpl kqcoPrint = new PrintImpl();
        // 初始化打印实体对象
        PrintEntity printEntity = kqcoPrint.getPrintEntity(xml);
        // 获取xml中表头数据
        String sHead = printEntity.getDataByKey("head");
        // 获取xml中表值数据
        String sData = printEntity.getDataByKey("data");
        // 获取列表行列操作对象
        PrintGrid grid = kqcoPrint.getPrintGrid(sHead, sData, xml);
        PrintEntity gridRowEntity = null;
        // 获取表格列行数量,以列表行数为循环次数处理---此为行列嵌套打印
        for (int i = 0; i < grid.getRowCount(); i++) {
            if (i == 0) {
                // 列表的第一行默认为添加行数据子级
                gridRowEntity = printEntity.addEntityToInner();
            } else {
                // 添加行数据下同级
                gridRowEntity = gridRowEntity.addEntityToBottom();
            }
            // 设置当前高度
            gridRowEntity.setHeigth(60);
            // 设置当前Y轴偏移量(距离顶部)
            gridRowEntity.setOffsetY(-1);

            PrintEntity colnEntity = null;
            // 获取表格指定下标行数据
            PrintGridData gridData = grid.getRow(i);
            // 获取表格列数量,循环处理
            for (int j = 0; j < grid.getColnCount(); j++) {
                if (j == 0) {
                    // 第一列默认为添加行数据子级,传参i标识列表行位置
                    colnEntity = gridRowEntity.addEntityToInner();
                } else {
                    // 添加行数据下同级
                    colnEntity = colnEntity.addEntityToBottom();
                }
                // 获取表格指定下标列数据
                PrintGridColn gridColn = grid.getColn(j);
                /**
                 * getData,获取表格头和表格数据组装数据
                 * 设置当前打印文本内容
                 */
                colnEntity.setText(gridData.getData(i, j));
                // 设置打印水平位置(赋值1或不设置默认居中,0:上对齐、1:垂直居中、2:下对齐)
                colnEntity.setAlignY(gridColn.getAlginY());
                // 设置当前宽度
                colnEntity.setWidth(gridColn.getWidth(j));// 如果要取列的宽度
                // 设置当前高度
                colnEntity.setHeigth(20);
                // 自定义设置列的宽
//                colnEntity.setWidth(300);
                // 自定义设置当前X轴偏移量(距离左部)
                switch (j){
                    case 0:
                        colnEntity.setOffsetX(10);
                        break;
                    case 1:
                        colnEntity.setOffsetX(20);
                        break;
                    case 2:
                        colnEntity.setOffsetX(350);
                }
                // 设置边框(0为无边框,不设置为默认有边框且宽度为3.细线,代表线粗细程度:1.中等、2.粗线、3.细线)
                colnEntity.setBorder(0);
            }
        }

        // 获取生成的xml数据
        String[] parm = printEntity.toXml();
        System.out.println("return:"+parm[0]);
        return parm[0].getBytes(StandardCharsets.UTF_8);
    }
}

package com.kanq;

import com.kanq.print.printImpl.PrintImpl;
import com.kanq.print.printImpl.ext.PrintEntity;
import com.kanq.print.printImpl.ext.PrintGrid;
import com.kanq.print.printImpl.ext.PrintGridColn;
import com.kanq.print.printImpl.ext.PrintGridData;
import com.kanq.sdk.config.Macro;
import java.nio.charset.StandardCharsets;

public class PrintDemo {

    @Macro(name = "printOpinionList", describe = "意见列表打印")
    public static byte[] printOpinionList(byte[] macroHead, byte[][] argv){

        byte[] parm_byte = argv[0];

        // 获取xml
        String xml = new String(parm_byte,StandardCharsets.UTF_8);
        System.out.println("printOpinionList:"+xml);

        // 获取处理打印拓展对象
        PrintImpl kqcoPrint = new PrintImpl();
        // 初始化打印实体对象
        PrintEntity printEntity = kqcoPrint.getPrintEntity(xml);
        // 获取xml中表头数据
        String sHead = printEntity.getDataByKey("head");
        // 获取xml中表值数据
        String sData = printEntity.getDataByKey("data");
        // 获取列表行列操作对象
        PrintGrid grid = kqcoPrint.getPrintGrid(sHead, sData, xml);
        PrintEntity gridRowEntity = null;
        // 获取表格列行数量,以列表行数为循环次数处理---此为行列嵌套打印
        for (int i = 0; i < grid.getRowCount(); i++) {
            if (i == 0) {
                // 列表的第一行默认为添加行数据子级
                gridRowEntity = printEntity.addEntityToInner();
            } else {
                // 添加行数据下同级
                gridRowEntity = gridRowEntity.addEntityToBottom();
            }
            // 设置当前高度
            gridRowEntity.setHeigth(60);
            // 设置当前Y轴偏移量(距离顶部)
            gridRowEntity.setOffsetY(-1);

            PrintEntity colnEntity = null;
            // 获取表格指定下标行数据
            PrintGridData gridData = grid.getRow(i);
            // 获取表格列数量,循环处理
            for (int j = 0; j < grid.getColnCount(); j++) {
                if (j == 0) {
                    // 第一列默认为添加行数据子级,传参i标识列表行位置
                    colnEntity = gridRowEntity.addEntityToInner();
                } else {
                    // 添加行数据下同级
                    colnEntity = colnEntity.addEntityToBottom();
                }
                // 获取表格指定下标列数据
                PrintGridColn gridColn = grid.getColn(j);
                /**
                 * getData,获取表格头和表格数据组装数据
                 * 设置当前打印文本内容
                 */
                colnEntity.setText(gridData.getData(i, j));
                // 设置打印水平位置(赋值1或不设置默认居中,0:上对齐、1:垂直居中、2:下对齐)
                colnEntity.setAlignY(gridColn.getAlginY());
                // 设置当前宽度
                colnEntity.setWidth(gridColn.getWidth(j));// 如果要取列的宽度
                // 设置当前高度
                colnEntity.setHeigth(20);
                // 自定义设置列的宽
//                colnEntity.setWidth(300);
                // 自定义设置当前X轴偏移量(距离左部)
                switch (j){
                    case 0:
                        colnEntity.setOffsetX(10);
                        break;
                    case 1:
                        colnEntity.setOffsetX(20);
                        break;
                    case 2:
                        colnEntity.setOffsetX(350);
                }
                // 设置边框(0为无边框,不设置为默认有边框且宽度为3.细线,代表线粗细程度:1.中等、2.粗线、3.细线)
                colnEntity.setBorder(0);
            }
        }

        // 获取生成的xml数据
        String[] parm = printEntity.toXml();
        System.out.println("return:"+parm[0]);
        return parm[0].getBytes(StandardCharsets.UTF_8);
    }
}

打包

将程序和依赖 jar 分离打包

  • 程序保存 ./jar/co/ 目录下
  • 依赖保存 ./jar/lib/ 目录下
xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.kanq</groupId>
  <artifactId>co-service-ext</artifactId>
  <version>1.0.1</version>
  <packaging>jar</packaging>

  <name>co_service_web_ext_demo</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <!-- 打包不含依赖jar -->
  <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

  <!-- 依赖包导出lib文件夹下 -->
  <build>
        <finalName>Ext</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.1.2.RELEASE</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <!--<fork>true</fork>-->
                    <layout>ZIP</layout>
                    <includes>
                        <include>
                            <!-- 排除所有Jar -->
                            <groupId>nothing</groupId>
                            <artifactId>nothing</artifactId>
                        </include>
                    </includes>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <!-- ${project.build.directory}是maven变量,内置的,表示target目录,如果不写,将在跟目录下创建/lib -->
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                            <!-- excludeTransitive:是否不包含间接依赖包,比如我们依赖A,但是A又依赖了B,我们是否也要把B打进去 默认不打-->
                            <excludeTransitive>false</excludeTransitive>
                            <!-- 复制的jar文件去掉版本信息 true去掉 false 不去-->
                            <stripVersion>false</stripVersion>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.kanq</groupId>
  <artifactId>co-service-ext</artifactId>
  <version>1.0.1</version>
  <packaging>jar</packaging>

  <name>co_service_web_ext_demo</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <!-- 打包不含依赖jar -->
  <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

  <!-- 依赖包导出lib文件夹下 -->
  <build>
        <finalName>Ext</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.1.2.RELEASE</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <!--<fork>true</fork>-->
                    <layout>ZIP</layout>
                    <includes>
                        <include>
                            <!-- 排除所有Jar -->
                            <groupId>nothing</groupId>
                            <artifactId>nothing</artifactId>
                        </include>
                    </includes>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <!-- ${project.build.directory}是maven变量,内置的,表示target目录,如果不写,将在跟目录下创建/lib -->
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                            <!-- excludeTransitive:是否不包含间接依赖包,比如我们依赖A,但是A又依赖了B,我们是否也要把B打进去 默认不打-->
                            <excludeTransitive>false</excludeTransitive>
                            <!-- 复制的jar文件去掉版本信息 true去掉 false 不去-->
                            <stripVersion>false</stripVersion>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

注意

  • 新接口需重启 co-service 后才能生效

启动服务

扩展开发注册成功如下:

20250225172811

注意

  • co-service 日志级别为 调试
  • 测试打印扩展指令

配置二开之前打印效果:

20250225182612

配置二开之后打印效果:

20250225183016

DEMO 代码下载

本示例代码在 com.kanq.PrintDemo 类中的 printOpinionList 方法

Powerd by Vitepress.