iText 5

news2024/11/23 19:00:48

依赖

    implementation 'com.itextpdf:itextpdf:5.5.13.3'
    implementation 'com.itextpdf:itext-asian:5.2.0'
    implementation 'com.alibaba:fastjson:1.2.83'
    compileOnly 'org.projectlombok:lombok:1.18.22'
    annotationProcessor "org.projectlombok:lombok:1.18.22"

测试

import com.alibaba.fastjson.JSON;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import lombok.SneakyThrows;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Base64;
import java.util.List;
import java.util.Map;

public class GeneratePdfReport {

    private static final Logger logger = LoggerFactory.getLogger(GeneratePdfReport.class);

    public static void main(String[] args) {
        FontFactory.registerDirectories();

        // drawTable();
        drawRowspan0();
    }

    public static ByteArrayInputStream citiesReport(List<City> cities) {

        Document document = new Document();
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

        try {
            // 建立一个书写器(内存流方式)
            PdfWriter.getInstance(document, byteArrayOutputStream);
            document.open();

            PdfPTable table = new PdfPTable(3);
            table.setWidthPercentage(60);
            table.setWidths(new int[]{1, 3, 3});

            Font headFont = FontFactory.getFont(FontFactory.HELVETICA_BOLD);

            PdfPCell h_cell;
            h_cell = new PdfPCell(new Phrase("Id", headFont));
            h_cell.setHorizontalAlignment(Element.ALIGN_CENTER);
            // Leading
            Paragraph paragraph = new Paragraph();
            paragraph.setLeading(2.5f);
            table.addCell(h_cell);

            h_cell = new PdfPCell(new Phrase("Name", headFont));
            h_cell.setHorizontalAlignment(Element.ALIGN_CENTER);
            table.addCell(h_cell);

            h_cell = new PdfPCell(new Phrase("Population", headFont));
            h_cell.setHorizontalAlignment(Element.ALIGN_CENTER);
            table.addCell(h_cell);

            for (City city : cities) {

                PdfPCell cell;

                cell = new PdfPCell(new Phrase(city.getId().toString()));
                cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
                cell.setHorizontalAlignment(Element.ALIGN_CENTER);
                table.addCell(cell);

                cell = new PdfPCell(new Phrase(city.getName()));
                cell.setPaddingLeft(5);
                cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
                cell.setHorizontalAlignment(Element.ALIGN_LEFT);
                table.addCell(cell);

                cell = new PdfPCell(new Phrase(String.valueOf(city.getPopulation())));
                cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
                cell.setHorizontalAlignment(Element.ALIGN_RIGHT);
                cell.setPaddingRight(5);
                table.addCell(cell);
            }

            document.add(table);

        } catch (DocumentException ex) {
            logger.error("Error occurred: {0}", ex);
        } finally {
            document.close();
        }

        return new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
    }


    @SneakyThrows
    private static void drawTable() {
        String[] headers = {"列一", "列二", "列三", "列四", "列五", "列六"};
        String list = "[{\"balance\":\"42402\",\"changeDate\":\"20211026111641\",\"dgst\":\"SSTR\",\"outMoney\":\"0\",\"bankSeqNo\":\"00000000000641199893\",\"inMoney\":\"11539\"},{\"balance\":\"30863\",\"changeDate\":\"20211005133736\",\"dgst\":\"SALE\",\"outMoney\":\"7500\",\"bankSeqNo\":\"00000000000635138192\",\"inMoney\":\"0\"},{\"balance\":\"38363\",\"changeDate\":\"20210926113940\",\"dgst\":\"SSTR\",\"outMoney\":\"0\",\"bankSeqNo\":\"00000000000632420138\",\"inMoney\":\"11539\"},{\"balance\":\"26824\",\"changeDate\":\"20210925111144\",\"dgst\":\"SALE\",\"outMoney\":\"11150\",\"bankSeqNo\":\"00000000000632752221\",\"inMoney\":\"0\"},{\"balance\":\"37974\",\"changeDate\":\"20210922083109\",\"dgst\":\"SALE\",\"outMoney\":\"4860\",\"bankSeqNo\":\"00000000000631851353\",\"inMoney\":\"0\"},{\"balance\":\"42834\",\"changeDate\":\"20210919153251\",\"dgst\":\"SALE\",\"outMoney\":\"7910\",\"bankSeqNo\":\"00000000000631503750\",\"inMoney\":\"0\"},{\"balance\":\"50744\",\"changeDate\":\"20210917080014\",\"dgst\":\"SALE\",\"outMoney\":\"5870\",\"bankSeqNo\":\"00000000000630377865\",\"inMoney\":\"0\"},{\"balance\":\"56614\",\"changeDate\":\"20210915153430\",\"dgst\":\"SALE\",\"outMoney\":\"8560\",\"bankSeqNo\":\"00000000000630120441\",\"inMoney\":\"0\"},{\"balance\":\"65174\",\"changeDate\":\"20210830103432\",\"dgst\":\"SALE\",\"outMoney\":\"6200\",\"bankSeqNo\":\"00000000000625635279\",\"inMoney\":\"0\"},{\"balance\":\"71374\",\"changeDate\":\"20210825124135\",\"dgst\":\"SSTR\",\"outMoney\":\"0\",\"bankSeqNo\":\"00000000000624479550\",\"inMoney\":\"11539\"}]";
        List<Map<String, Object>> mapList = (List) JSON.parseArray(list);

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        PdfWriter writer = null;
        Document document = null;
        try {
            // 创建纵向文件
            {
                // 生成pdf
                document = new Document();

                // 页面大小
                Rectangle rectangle;
                {
                    rectangle = new Rectangle(PageSize.A4);
                    // 页面背景颜色
                    rectangle.setBackgroundColor(BaseColor.WHITE);
                }
                document.setPageSize(rectangle);

                // 页边距 左,右,上,下
                document.setMargins(20, 40, 40, 20);
            }
            // 建立一个书写器(内存流方式)
            PdfWriter.getInstance(document, byteArrayOutputStream);

            // 打开文件
            document.open();
            // 添加字体样式
            Font bigFont, blueFont;
            {
                BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
                bigFont = new Font(bf, 14, Font.NORMAL, BaseColor.BLACK);
                blueFont = new Font(bf, 10, Font.NORMAL, BaseColor.BLACK);
            }
            // 段落内容
            Paragraph title;
            {
                title = new Paragraph("测试pdf", bigFont);
                title.setSpacingBefore(5);
                title.setSpacingAfter(5);
                // 文字居中显示
                title.setAlignment(Element.ALIGN_CENTER);
            }
            // 添加段落内容
            document.add(title);

            // 创建表格列数
            PdfPTable table;
            {
                table = new PdfPTable(headers.length);
                // 宽度100%填充
                table.setWidthPercentage(100);
            }
            // 创建表头
            {
                for (String header_text : headers) {
                    PdfPCell cell;
                    {
                        cell = new PdfPCell(new Paragraph(header_text, bigFont));
                        cell.setFixedHeight(27f);
                        // 默认不跨行、跨列
                        cell.setRowspan(1);
                        cell.setColspan(1);
                        // 居中显示
                        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
                        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
                        // 设置边框
                        cell.setBorder(Rectangle.RIGHT + Rectangle.BOTTOM);
                        cell.setPadding(5);
                    }
                    table.addCell(cell);
                }
            }
            // document.add(table); // mark
            // 填充数据
            for (Map<String, Object> map : mapList) {
                // 获取对象
                // Map 获取key & value
                for (Map.Entry<String, Object> entry : map.entrySet()) {
                    Object value = entry.getValue();
                    PdfPCell cell;
                    {
                        cell = new PdfPCell(new Paragraph(value.toString(), blueFont));
                        cell.setFixedHeight(27f);
                        // 默认不跨行、跨列 ps: 0 or 1 没有区别
                        cell.setRowspan(1);
                        cell.setColspan(1);
                        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
                        cell.setHorizontalAlignment(Element.ALIGN_LEFT);
                        // 设置边框
                        cell.setBorder(Rectangle.LEFT);
                        // cell.setBorderWidthRight(1f);
                        cell.setPadding(5);
                    }

                    table.addCell(cell);
                }
                // document.add(table); // mark
            }
            document.add(table); // mark
        } catch (DocumentException | IOException ignored) {

        } finally {
            if (document != null) {
                // 关闭文档
                document.close();
            }
            if (writer != null) {
                // 关闭书写器
                writer.close();
            }
        }
        Base64.Encoder encoder = Base64.getEncoder();
        String url = "data:application/pdf;base64," + encoder.encodeToString(byteArrayOutputStream.toByteArray());
        System.out.println(url);
    }

    @SneakyThrows
    public static void drawRowspan0() {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

        Document document = new Document();
        PdfWriter.getInstance(document, byteArrayOutputStream);
        document.open();

        PdfPTable table = new PdfPTable(3); // 创建一个三列的表格

        for (int i = 0; i < 5; i++) {
            PdfPCell cell = new PdfPCell();
            cell.addElement(new com.itextpdf.text.Paragraph("Cell 1"));
            if (i == 2)
                cell.setRowspan(2); // 第三个单元格不跨行
            // else
            //     cell.setRowspan(2);
            table.addCell(cell);
        }

        document.add(table);

        document.close();

        Base64.Encoder encoder = Base64.getEncoder();
        String url = "data:application/pdf;base64," + encoder.encodeToString(byteArrayOutputStream.toByteArray());
        System.out.println(url);
    }

}
  • 添加图层

添加图层

// 引入itextpdf库X
import com.itextpdf.text.Document;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;

// 打开PDF文件
PdfReader reader = new PdfReader("input.pdf");
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("output.pdf"));

// 创建图层对象
PdfLayer layer = new PdfLayer("New Layer", stamper.getWriter());

// 添加内容到图层
layer.setOn(true);

// 将图层添加到PDF文件
stamper.addAnnotation(layer);
stamper.close();
// 引入itextpdf库X
import com.itextpdf.text.Document;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;

// 打开PDF文件
PdfReader reader = new PdfReader("input.pdf");
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("output.pdf"));

// 创建图层对象
PdfLayer layer = new PdfLayer("New Layer", stamper.getWriter());

// 添加内容到图层
layer.setOn(true);

// 将图层添加到PDF文件
stamper.addAnnotation(layer);
stamper.close();

(以下内容忽略)

jdk 运行 js

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.io.FileNotFoundException;
import java.io.FileReader;

class JavascriptUtils {

    public static void runDisplay() {
        ScriptEngine engine = new ScriptEngineManager().getEngineByName("js");
        try {
            // REPL read eval print loop
            engine.eval(new FileReader("test.js"));
            Invocable invocable = (Invocable) engine;
            Object result;
            result = invocable.invokeFunction("addNumber", 1, 2);
            System.out.println(engine);
            System.out.println(result);
            System.out.println(result.getClass());
        } catch (FileNotFoundException | NoSuchMethodException | ScriptException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {

        runDisplay();
    }
}
  • 事件监听
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class EventDemo {

    @Bean
    public MyListener myListener() {
        // 使用注入进行注册{监听器} 来响应其他{自定义事件}
        return new MyListener();
    }

    public static void main(String[] args) {
        // 在 Spring 中,事件发布和监听器注册都是通过 ApplicationContext 来实现的
        AnnotationConfigApplicationContext context =
                new AnnotationConfigApplicationContext(EventDemo.class);
        context.publishEvent(new MyEvent("hello world"));

        // Spring 内置了很多事件,例如:ContextStartedEvent,ContextStoppedEvent,
        // ContextRefreshedEvent,ContextClosedEvent (应用程序的不同生命周期阶段)
        // RequestHandledEvent (Web 请求处理过程) 等
    }

    private static class MyEvent extends ApplicationEvent {

        private final String message;

        public MyEvent(String message) {
            super(message);
            this.message = message;
        }

        public String getMessage() {
            return message;
        }

    }

    // (need inject)
    private static class MyListener implements ApplicationListener<MyEvent> {
        @Override
        public void onApplicationEvent(MyEvent event) {
            System.out.println("Received event: " + event.getMessage());
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1605293.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

找不到api-ms-win-crt-runtime-l1-1-0.dll文件5种解决方法

在日常使用计算机的过程中&#xff0c;我们时常会遭遇各类意想不到的问题&#xff0c;其中之一就是“api-ms-win-crt-runtime-l1-1-0.dll丢失”。这个错误通常发生在Windows操作系统中&#xff0c;它表示一个动态链接库文件丢失或损坏。这个问题可能会导致某些应用程序无法正常…

【Vue脚手架】

初始化脚手架 如果下载缓慢请配置npm淘宝镜像&#xff1a; npm config set registry http://registry.npm.taobao.org 全局安装vue脚手架&#xff1a; vue/clinpm install -g vue/cli 1. 创建项目使用命令 vue create xxx 注&#xff1a;后面有选择安装版本&#xff0c;请注意选…

授权协议OAuth 2.0之除了授权码许可还有什么授权流程?

写在前面 源码 。 本文看下OAuth2.0的另外3中授权流程&#xff0c;资源拥有者凭据许可&#xff0c;客户端许可&#xff0c;隐式许可。分别看下具体的使用流程以及该使用场景。 1&#xff1a;资源拥有者凭据许可 资源拥有者凭据许可&#xff0c;这里资源拥有者的凭据是什么呢&…

Vue源码解读学习

Vue源码 观察者模式 & 发布订阅 观察者模式&#xff1a;中心一对多 系统单点间的灵活和拓展&#xff08;广播的方式&#xff09; 发布订阅&#xff1a;将注册列表遍历发布给订阅者 initInject initState initProvide他们挂载顺序为什么这样设计&#xff1f; initstate…

MySQL行格式(row format)

MySQL行格式&#xff08;row format&#xff09; 表的行格式决定了其行的物理存储方式&#xff0c;这反过来又会影响查询和 DML 操作的性能。随着单个磁盘页面容纳更多行&#xff0c;查询和索引查找可以更快地工作&#xff0c;缓冲池中需要的高速缓存内存更少&#xff0c;写出…

京西商城——前端项目的创建以及前后端联调

创建VUE项目 在jingxi_shop_project文件夹中再创建一个 frontend 文件夹用来存放前端项目 /jingxi_shop_project/backend/jingxi_shop_project....../frontend/jingxi_shop_web......首先要安装 node.js 和 VUE cli&#xff0c;进入到项目目录内创建项目 vue create jingxi_…

[Vision Board创客营]学习片上Flash移植FAL

文章目录 [Vision Board创客营]学习片上Flash移植FAL介绍环境搭建使用组件测试porbeerasewriteread 结语 [Vision Board创客营]学习片上Flash移植FAL 水平较菜&#xff0c;大佬轻喷。&#x1f630;&#x1f630;&#x1f630; 介绍 &#x1f680;&#x1f680;Vision-Board 开…

解锁流量密码:如何利用HubSpot打造高效的获客策略?(下)

在当今数字化时代&#xff0c;流量是企业成功的关键。HubSpot作为一款全面的营销自动化工具&#xff0c;为我们提供了强大的支持&#xff0c;帮助企业打造高效的流量获取策略。接下来&#xff0c;我们将从社交媒体与SEO优化、自动化营销流程、数据分析与效果评估以及流量获取策…

【R语言】组合图:散点图+箱线图+平滑曲线图+柱状图

用算数运算符轻松组合不同的ggplot图&#xff0c;如图&#xff1a; 具体代码如下&#xff1a; install.packages("devtools")#安装devtools包 devtools::install_github("thomasp85/patchwork")#安装patchwork包 library(ggplot2) library(patchwork) #p1是…

Linux进程和任务管理

目录 一.程序和进程的关系 程序 进程 线程 线程与进程的区别 二.查看进程信息ps 方法一 常用选项 方法二 三.TOP动态查看进程信息 进程信息区各列解释 top常用命令 系统查看命令总结 查看进程信息pgrep 查看进程树pstree 四.控制进程 进程的启动方式 进程的前…

electron的webview和内嵌网页如何通信

在 Electron 的世界里&#xff0c;webview 标签相当于一个小盒子&#xff0c;里面可以装一个完整的网页&#xff0c;就像一个迷你浏览器。当你想和这个小盒子里的内容说话时&#xff08;也就是进行通信&#xff09;&#xff0c;这里有几个方法可以帮你做到&#xff1a; 这里只写…

LIUNX文件系统

目录 1.磁盘的物理结构 2.CHS定位法 3.磁盘的逻辑存储 4.系统层面 inode.block[15] 创建文件的流程 查找文件的流程 了解文件系统&#xff0c;首先要了解磁盘是如何存储和读取数据的。 1.磁盘的物理结构 可以理解这个盘上有很多的小磁铁&#xff0c;通过旋转盘面和摆动…

LeetCode-热题100:114. 二叉树展开为链表

题目描述 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。 示例…

内业减少80%人工操作,林地地形轻松测!

林业作为维护生态平衡和保护环境的关键领域&#xff0c;其科学管理和合理利用是当前林业工作的重中之重。林业调查旨在全面了解当前林业资源的状况&#xff0c;其中林地地形测量是林业调查的基础工作。通过对林地地形的准确测量&#xff0c;可获取森林的地理位置、面积、地貌、…

探索VR数字展厅,对企业未来展示新模式

在数字化浪潮的推动下&#xff0c;企业展示也在经历着一场革命&#xff0c;VR数字展厅正在以一种全新的方式重塑我们的生活和工作空间&#xff0c;不仅重塑了客户的观展体验&#xff0c;也为企业营销打开了新的渠道。 VR数字展厅作为实体展厅的数字化延伸&#xff0c;正以其沉浸…

C++笔记:引用

目录 概念&#xff1a; ​编辑 引用的特性&#xff1a; 引用中的权限问题&#xff1a; 引用与指针的区别&#xff1a; 引用的使用&#xff1a; 概念&#xff1a; 引用是给已存在变量取一个别名&#xff0c;编译器不会为引用变量开辟内存空间。 引用的符号&#xff1a;&…

物联网网络传输,STM32和ESP32

2024.4.17 今天主要是记录一下我这个STM32F407和esp8266组成的互联网板子的一些例程运行心得&#xff0c; 下面这个例程是STM32发AT指令给esp8266&#xff0c;使得esp8266作为tcp client连接到我的手机热点&#xff0c;然后我用电脑连接wifi&#xff0c;打开tcp server&#x…

上海晋名室外气瓶暂存柜海盐项目落地

上周海盐县人民医院武原分院的SAVEST室外气瓶暂存柜项目成功交付验收&#xff0c;此次项目主要用于医院气瓶等室外暂存安全。 用户单位在日常工作运营中涉及到氧气瓶、杜瓦罐等室外安全储存问题&#xff0c;用户在寻找解决方案的过程中搜索到上海晋名的室外气瓶暂存柜系列后挺感…

贪心问题:134. 加油站

https://leetcode.cn/problems/gas-station/ 贪心算法还没找到规律&#xff0c;记录一下该题的思路吧。。。 每个加油站的剩余量rest[i]为gas[i] - cost[i]。 首先如果总油量减去总消耗大于等于零那么一定可以跑完一圈&#xff0c;说明 各个站点的加油站 剩油量rest[i]相加一定…

【AI学习中常见专业英文缩写词的解释】

前言&#xff1a; 为了看着不无聊&#xff0c;文中插入了一些AI生成的狗图片 AI(Artificail Intelligence)人工智能&#xff1a; 让机器模拟和展示人类智能的技术。 GAI(Generative Artificail Intelligence)生成式人工智能: 利用复杂的算法、模型和规则&#xff0c;从大规…