当前位置: 首页 > news >正文

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上面比较大&#xff0c;可以直接下载需要集成的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文件&#xff0c;导入sql数据_哔哩哔哩_bilibili...

SwiftUI之深入解析如何创建一个灵活的选择器

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

【模拟量采集1.2】电阻信号采集

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

c++牛客总结

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

ts相关笔记(基础必看)

推荐一下小册 TypeScript 全面进阶指南&#xff0c;此篇笔记来源于此&#xff0c;记录总结&#xff0c;加深印象&#xff01; 另外&#xff0c;如果想了解更多ts相关知识&#xff0c;可以参考我的其他笔记&#xff1a; vue3ts开发干货笔记TSConfig 配置&#xff08;tsconfig.…...

Docker随笔

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

uni-app 前后端调用实例 基于Springboot

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…...

vue3+ts开发干货笔记

总结一下在vue3中ts的使用。当篇记录部分来自于vue官网&#xff0c;记录一下&#xff0c;算是加深印象吧。 纯干笔记&#xff0c;不断补充&#xff0c;想到什么写什么&#xff0c;水平有限&#xff0c;欢迎评论指正&#xff01; 另外&#xff0c;如果想了解更多ts相关知识&…...

Android开发新的一年Flag

在新的一年里&#xff0c;为了提升Android开发技能&#xff0c;实现更优质的应用程序&#xff0c;我们制定了2024的新年Flag。这些Flag涵盖了技术学习、代码优化、架构升级、用户体验等多个方面&#xff0c;旨在帮助我们成为更优秀的Android开发者。 1. 学习新技术 1.1. Andr…...

好的OODA循环与快慢无关

OODA循环是指观察&#xff08;Observe&#xff09;、导向&#xff08;Orient&#xff09;、决策&#xff08;Decide&#xff09;和行动&#xff08;Act&#xff09;这四个步骤的循环过程。它是一种决策和行动的框架&#xff0c;旨在帮助个人或组织更快地适应和应对变化。 OODA循…...

Android 车联网——CarUserService介绍(十三)

一、简介 CarUserService 是 Android 汽车平台的一个组件,它用于管理和提供车辆用户信息。该组件可以让开发者创建和管理与车辆用户相关的数据和配置,包括车辆拥有者和乘客的个人信息、偏好设置、用户偏好配置文件等。 CarUserService 提供了以下功能和特性: 用户配置管理:…...

【开题报告】基于微信小程序的母婴商品仓库管理系统的设计与实现

1.选题背景 随着社会经济的发展和家庭生活水平的提高&#xff0c;母婴商品市场逐渐兴起。然而&#xff0c;传统的母婴商品仓库管理方式存在着许多问题&#xff0c;如信息不透明、操作繁琐等。为了提高仓库管理的效率和准确性&#xff0c;基于微信小程序的母婴商品仓库管理系统…...

分布式锁相关问题(三)

Redis实战精讲-13小时彻底学会Redis 一、什么是分布式锁&#xff1f; 要介绍分布式锁&#xff0c;首先要提到与分布式锁相对应的是线程锁、进程锁。 l 线程锁&#xff1a;主要用来给方法、代码块加锁。当某个方法或代码使用锁&#xff0c;在同一时刻仅有一个线程执行该方法或该…...

grep!Linux系统下强大的文本搜索工具!

grep&#xff01;Linux系统下强大的文本搜索工具&#xff01; grep是一个强大的文本搜索工具&#xff0c;它可以在文件中查找包含指定字符串的行。grep的基本语法如下&#xff1a; grep [选项] "搜索字符串" 文件名其中&#xff0c;选项可以是以下几种&#xff1a;…...

(学习打卡1)重学Java设计模式之设计模式介绍

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

docker 部署教学版本

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

2023春季李宏毅机器学习笔记 05 :机器如何生成图像

资料 课程主页&#xff1a;https://speech.ee.ntu.edu.tw/~hylee/ml/2023-spring.phpGithub&#xff1a;https://github.com/Fafa-DL/Lhy_Machine_LearningB站课程&#xff1a;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"); // 打开二进制文件&#xff08;只读模式&#xff09;if (file NULL) {printf("无法打开文件\n");re…...

【React系列】Redux(二)中间件

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

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...