Android 内容生成pdf文件
1.引入itext7 implementation 'com.itextpdf:itext7-core:7.1.13'上面比较大,可以直接下载需要集成的jar包 implementation files('libs\\layout-7.1.13.jar') implementation files('libs\\kernel-7.1.13.jar') implementation files('libs\\io-7.1.13.jar') implementation files('libs\\slf4j-android-1.6.1-RC1.jar')
import android.graphics.Bitmap import android.os.Environment import com.itextpdf.io.image.ImageDataFactory import com.itextpdf.kernel.font.PdfFontFactory import com.itextpdf.kernel.geom.PageSize import com.itextpdf.kernel.pdf.PdfDocument import com.itextpdf.kernel.pdf.PdfWriter import com.itextpdf.layout.Document import com.itextpdf.layout.borders.Border import com.itextpdf.layout.element.Cell import com.itextpdf.layout.element.Image import com.itextpdf.layout.element.Paragraph import com.itextpdf.layout.element.Table import com.itextpdf.layout.property.HorizontalAlignment import com.itextpdf.layout.property.TextAlignment import com.itextpdf.layout.property.UnitValue import com.itextpdf.layout.property.VerticalAlignment import com.thinkerjet.jdcommunication.appbase.BaseActivity import java.io.ByteArrayOutputStream import java.util.* import java.util.concurrent.Executorsclass PdfUitl {companion object {val sIntance by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {PdfUitl()}public interface SavePdfInterface {fun savePdf(path: String);}lateinit var savePdfInterface: SavePdfInterface}fun createPdf(activity: BaseActivity, bitmap: Bitmap) {try {//创建一个 PdfWriter 对象,用于将文档写入到 PDF 文件中var writer: PdfWriter =PdfWriter(activity.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).absolutePath + "/agreement.pdf")//创建一个 PdfDocument 对象,表示 PDF 文档val pdfDoc = PdfDocument(writer)//指定 PDF 中文本的字体和编码val pdfFont = PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H")//创建一个 Document 对象,表示 PDF 文档的页面 A4 大小val document = Document(pdfDoc, PageSize.A4)val paraTitle = "【客户信息安全保护承诺书】"val paraInfoTop ="***************公司: 为依法做好用户个人信息保护,切实保障人民群众合法权益,促进通信行业健康发展,维护国家安全和社会稳定,我公司及个人做出郑重承诺: 严格按照《电信和互联网用户个人信息保护规定》(工信部第24号令)、《中华人民共和国网络安全法》等法律法规的要求,以及贵公司相关管理规定,落实好用户个人信息保护工作,杜绝发生非法获取个人信息,以及非法使用、提供、销售个人信息的行为,严禁超范围、超界限使用。"val paraInfoMiddle ="在工作及为用户提供服务过程中,未经公司明确授权,不得自行或与第三方进行合作开展任何营销活动;未经公司明确授权,不得在未向用户告知活动详细规则的情况下,通过劝说、引诱等方式要求客户提供信息(包括但不限于手机号、身份证号、短信验证码等),从事为客户注册互联网账号等违规行为;任何处理(包括收集、注册等)客户手机号码等个人信息的行为,均应当严格按照公司的有关规章制度办理,不得超越权限处理。"val paraInfoBottom ="在执行中如有出现违反用户个人信息保护等工作的要求,或者存在隐瞒不报、包庇袒护的行为,视作严重违规,将按贵公司社会渠道管理办法及相关规定接受相应处罚,并对公司内部人员及渠道营业人员进行从严处理,涉嫌犯罪的依法移送司法机关。\n"val paraCompany = "承诺单位名称(盖章)"val paraPeople = "承诺人签字"val cd: Calendar = Calendar.getInstance()val paraDate = cd.get(Calendar.YEAR).toString() + "年" + (cd.get(Calendar.MONTH) + 1).toString() + "月" + cd.get(Calendar.DATE).toString() + "日"document.setFont(pdfFont)document.setFontSize(JnUtils.dp2px(activity, 8f).toFloat())//创建段落val paragraphTitle = Paragraph(paraTitle)//文字居中paragraphTitle.setTextAlignment(TextAlignment.CENTER)//创建段落val paragraphTop = Paragraph(paraInfoTop)//创建段落val paragraphMiddle = Paragraph(paraInfoMiddle)paragraphMiddle.setBold()//单倍行距paragraphMiddle.setMultipliedLeading(1f)val paragraphBottom = Paragraph(paraInfoBottom)val paragraphCompany = Paragraph(paraCompany)paragraphCompany.setTextAlignment(TextAlignment.RIGHT)val paragraphPeople = Paragraph(paraPeople)paragraphPeople.setTextAlignment(TextAlignment.RIGHT)val paragraphDate = Paragraph(paraDate)//添加到pdfdocument.add(paragraphTitle)document.add(paragraphTop)document.add(paragraphMiddle)document.add(paragraphBottom)document.add(paragraphCompany)//这个数组用于存储后续用于创建表格的列宽度信息val resultArray = arrayOfNulls<UnitValue>(2)//第一列的宽度将占据表格可用宽度的 190%。resultArray[0] = UnitValue.createPercentValue(190f)//第二列的宽度将占据表格可用宽度的 200%。resultArray[1] = UnitValue.createPercentValue(200f)//方法用于使表格使用所有可用的宽度,确保表格填满水平空间。val table = Table(resultArray).useAllAvailableWidth()//表格的总宽度为 390 点table.setWidth(390f)table.setHorizontalAlignment(HorizontalAlignment.RIGHT)Executors.newSingleThreadExecutor().execute(object : Runnable {override fun run() {//创建了一个字节数组输出流 baos,用于临时存储图像数据。val baos = ByteArrayOutputStream()//以 JPEG 格式、质量为 100% 的压缩率写入到输出流 baos 中bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos)//创建iText 7 PDF 的图像对象val image = Image(ImageDataFactory.create(baos.toByteArray()))image.setWidth(80f)image.setHeight(35f)//1 行 1 列包含一个段落对象 paragraphPeople的单元格val cellPeople: Cell = Cell(1, 1).add(paragraphPeople)cellPeople.setTextAlignment(TextAlignment.RIGHT)cellPeople.setVerticalAlignment(VerticalAlignment.BOTTOM)cellPeople.setBorder(Border.NO_BORDER)//单元格添加到之前创建的表格 table 中,并设置其边框为无边框table.addCell(cellPeople).setBorder(Border.NO_BORDER)//表格添加1 行 2 列包含图像的单元格table.addCell(Cell(1, 2).setBorder(Border.NO_BORDER).add(image))//2行 1 列包含时间的单元格val cellData: Cell = Cell(2, 1).setBorder(Border.NO_BORDER).add(paragraphDate);cellData.setVerticalAlignment(VerticalAlignment.BOTTOM)cellData.setTextAlignment(TextAlignment.RIGHT)table.addCell(cellData)//将table 添加到PDF文档中document.add(table)//关闭 PDF 文档,完成文档的创建document.close()//回收bitmap的资源,释放内存bitmap.recycle()savePdfInterface?.savePdf(activity.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).absolutePath + "/agreement.pdf")}})} catch (e: Exception) {savePdfInterface?.savePdf("")e.printStackTrace()}}}
相关文章:

Android 内容生成pdf文件
1.引入itext7 implementation com.itextpdf:itext7-core:7.1.13上面比较大,可以直接下载需要集成的jar包 implementation files(libs\\layout-7.1.13.jar) implementation files(libs\\kernel-7.1.13.jar) implementation files(libs\\io-7.1.13.jar) implementatio…...
Javaweb-日程管理
094.日程管理第二期_准备数据库和实体类_哔哩哔哩_bilibili navicat 下载 学生认证: Navicat 教育版 - 学生许可证 | Navicat navicat连接mysql 使用navicat连接mysql数据库创建数据库、表、转储sql文件,导入sql数据_哔哩哔哩_bilibili...

SwiftUI之深入解析如何创建一个灵活的选择器
一、前言 在 Dribbble 上找到的设计的 SwiftUI 实现时,可以尝试通过一些酷炫的筛选器扩展该项目以缩小结果列表。筛选视图将由两个独立的筛选选项组成,两者都有一些可选项可供选择。但是,在使用 UIKit 时,总是将这种类型的视图实…...

【模拟量采集1.2】电阻信号采集
【模拟量采集1.2】电阻信号采集 1 怎么测?2 测输入电阻电压即转为测模拟电压值,这里需要考虑选用怎样的辅助电阻?3 实际电路分析3.1 在不考虑 VCC-5V 电压的纹波等情况时(理想化此时输入的 VCC 就是稳定的 5V)3.2 若考…...

c++牛客总结
一、c/c语言基础 1、基础 1、指针和引用的区别 指针是一个新的变量,指向另一个变量的地址,我们可以通过这个地址来修改该另一个变量; 引用是一个别名,对引用的操作就是对变量本身进行操作;指针可以有多级 引用只有一…...

ts相关笔记(基础必看)
推荐一下小册 TypeScript 全面进阶指南,此篇笔记来源于此,记录总结,加深印象! 另外,如果想了解更多ts相关知识,可以参考我的其他笔记: vue3ts开发干货笔记TSConfig 配置(tsconfig.…...

Docker随笔
OverView 为什么需要Docker 如果我需要部署一个服务,那么我需要提前部署其他应用栈,不同的应用栈会依赖于不用的操作系统和环境。这样做会产生一些负面影响: 不同版本依赖较长的部署时间不同的Dev/Test/Prod环境 这时我们需要一个工具去解…...

uni-app 前后端调用实例 基于Springboot
锋哥原创的uni-app视频教程: 2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中...共计23条视频,包括:第1讲 uni…...

vue3+ts开发干货笔记
总结一下在vue3中ts的使用。当篇记录部分来自于vue官网,记录一下,算是加深印象吧。 纯干笔记,不断补充,想到什么写什么,水平有限,欢迎评论指正! 另外,如果想了解更多ts相关知识&…...
Android开发新的一年Flag
在新的一年里,为了提升Android开发技能,实现更优质的应用程序,我们制定了2024的新年Flag。这些Flag涵盖了技术学习、代码优化、架构升级、用户体验等多个方面,旨在帮助我们成为更优秀的Android开发者。 1. 学习新技术 1.1. Andr…...

好的OODA循环与快慢无关
OODA循环是指观察(Observe)、导向(Orient)、决策(Decide)和行动(Act)这四个步骤的循环过程。它是一种决策和行动的框架,旨在帮助个人或组织更快地适应和应对变化。 OODA循…...
Android 车联网——CarUserService介绍(十三)
一、简介 CarUserService 是 Android 汽车平台的一个组件,它用于管理和提供车辆用户信息。该组件可以让开发者创建和管理与车辆用户相关的数据和配置,包括车辆拥有者和乘客的个人信息、偏好设置、用户偏好配置文件等。 CarUserService 提供了以下功能和特性: 用户配置管理:…...
【开题报告】基于微信小程序的母婴商品仓库管理系统的设计与实现
1.选题背景 随着社会经济的发展和家庭生活水平的提高,母婴商品市场逐渐兴起。然而,传统的母婴商品仓库管理方式存在着许多问题,如信息不透明、操作繁琐等。为了提高仓库管理的效率和准确性,基于微信小程序的母婴商品仓库管理系统…...
分布式锁相关问题(三)
Redis实战精讲-13小时彻底学会Redis 一、什么是分布式锁? 要介绍分布式锁,首先要提到与分布式锁相对应的是线程锁、进程锁。 l 线程锁:主要用来给方法、代码块加锁。当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该…...
grep!Linux系统下强大的文本搜索工具!
grep!Linux系统下强大的文本搜索工具! grep是一个强大的文本搜索工具,它可以在文件中查找包含指定字符串的行。grep的基本语法如下: grep [选项] "搜索字符串" 文件名其中,选项可以是以下几种:…...

(学习打卡1)重学Java设计模式之设计模式介绍
前言:听说有本很牛的关于Java设计模式的书——重学Java设计模式,然后买了(*^▽^*) 开始跟着小傅哥学Java设计模式吧,本文主要记录笔者的学习笔记和心得。 打卡!打卡! 设计模式介绍 一、设计模式是什么? …...

docker 部署教学版本
文章目录 一、docker使用场景及常用命令1)docker使用场景2)rocky8(centos8)安装 docker3)docker 常用命令补充常用命令 二、 单独部署每个镜像,部署spring 应用镜像推荐(2023-12-18)1、 安装使用 mysql1.1 …...

2023春季李宏毅机器学习笔记 05 :机器如何生成图像
资料 课程主页:https://speech.ee.ntu.edu.tw/~hylee/ml/2023-spring.phpGithub:https://github.com/Fafa-DL/Lhy_Machine_LearningB站课程:https://space.bilibili.com/253734135/channel/collectiondetail?sid2014800 一、图像生成常见模型…...
C#和C++存储 和 解析 bin 文件
C 解析 bin 文件 // C 解析 bin 文件 #include <stdio.h>int main() {FILE *file; // 定义文件指针file fopen("example.bin", "rb"); // 打开二进制文件(只读模式)if (file NULL) {printf("无法打开文件\n");re…...

【React系列】Redux(二)中间件
本文来自#React系列教程:https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. 中间件的使用 1.1. 组件中异步请求 在之前简单的案例中,redux中保存的counter是一个本地定义的数据…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...

【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...

GAN模式奔溃的探讨论文综述(一)
简介 简介:今天带来一篇关于GAN的,对于模式奔溃的一个探讨的一个问题,帮助大家更好的解决训练中遇到的一个难题。 论文题目:An in-depth review and analysis of mode collapse in GAN 期刊:Machine Learning 链接:...