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是一个本地定义的数据…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...
Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...
在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...
