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.Executors

class 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)
            //添加到pdf
            document.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()
        }


    }


}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

亚马逊站内广告位置在哪设置?怎么设置广告位置?-站斧浏览器

亚马逊站内广告位置在哪设置&#xff1f; 亚马逊提供了多种广告类型&#xff0c;包括&#xff1a; Sponsored Products&#xff08;赞助产品&#xff09;&#xff1a;在搜索结果和商品详情页中展示。 Sponsored Brands&#xff08;赞助品牌&#xff09;&#xff1a;在搜索结…

C语言快速入门——前景引入

计算机语言 计算机语言发展计算机的世界操作系统概述计算机编程语言C语言开发环境部署 各位小伙伴想要博客相关资料的话关注公众号&#xff1a;chuanyeTry即可领取相关资料&#xff01; 文章来自&#xff1a;https://www.itbaima.cn/document 计算机语言发展 在学习C语言之前&…

进程的介绍及相关命令

首先&#xff0c;先了解一下计算机五大性能的命令 cpu top w 内存 top free 硬盘剩余 df 硬盘读写性能 iostat 网络带宽 iftop 一&#xff0c;进程与程序 1&#xff0c;什么是程序 &#xff1a; 硬盘上躺着&#xff0c;执行特点任务的一串代码 2&am…

VS2010 ,创建DLL,并调用DLL

一、创建DLL 1. 新建Win32空项目 项目命名为genxls。 2. 创建DLL空项目 3. 头文件&#xff0c;新建项&#xff0c; genxls.h 头文件内容为 // genxls.h #ifndef _DLL_API #define _DLL_API _declspec(dllexport) #else #define _DLL_API _declspec(dllimport) #endif _DLL_A…

我不想学JAVA---------JAVA和C的区别

前言 我一个研究方向是SLAM的为什么要来学JAVA。 从九月份开学到现在&#xff0c;已经学了Linux&#xff0c;数据结构&#xff0c;SLAM&#xff0c;C的基础操作&#xff0c;期间还参与编写了一本VHDL的教材。还有上课、考试什么的其他杂七杂八的事情就不说了。 读研好苦逼&…

IPv6邻居发现协议(NDP)---路由发现

IPv6路由发现(前缀公告) 邻居发现 邻居发现协议NDP(Neighbor Discovery Protocol)是IPv6协议体系中一个重要的基础协议。邻居发现协议替代了IPv4的ARP(Address Resolution Protocol)和ICMP路由器发现(Router Discovery),它定义了使用ICMPv6报文实现地址解析,跟踪邻…

利用蚁剑钓鱼上线CS

前言 ​ 中国蚁剑使用Electron构建客户端软件&#xff0c;Electron实现上用的是Node.js&#xff0c;并且Node.js能执行系统命令&#xff0c;故可以利用蚁剑的webshell页面嵌入js来直接执行命令&#xff0c;进而钓鱼来上线CS。&#xff08;类似Goby&#xff0c;Goby也是使用Ele…

小迪安全第一天

一、常用的专业术语 参考&#xff1a; https://www.cnblogs.com/sunny11/p/13583083.html POC&#xff08;proof of concept&#xff09;验证漏洞的代码EXP(exploit) 利用对一段漏洞代码的利用Playload:有效载荷&#xff0c;当利用exploit成功后如何通过一个管道把这个权限给…

制药企业符合CSV验证需要注意什么?

在制药行业中&#xff0c;计算机化系统验证&#xff08;CSV&#xff09;是确保生产过程的合规性和数据完整性的关键要素。通过CSV验证&#xff0c;制药企业可以保证其计算机化系统的可靠性和合规性&#xff0c;从而确保产品质量和患者安全。然而&#xff0c;符合CSV验证并不是一…

【通讯录案例-延时调用-第三方框架-HUD框架 Objective-C语言】

一、我们接着来看这个通讯录啊,上节课我们说到这里, 1.给它加个注释,// 当用户名和密码正确的时候 进行跳转 我们现在已经把这个判断用户名和密码,登录的这个,以及Segue的简单使用,我们已经说完了, 好,然后呢,在这个里边儿啊, 我们呢,示例程序里边儿,是这个样子的…

C#自动删除20天前文件夹图片

资料夹如下&#xff0c;需求为自动删除20天前保存的图片 如下为该方法函数&#xff0c;保留天数可以自定义 public static void CleanFile(){string path $"{SvMaster.DataPath}\\Image";\\文件夹路径DirectoryInfo dir new DirectoryInfo(path);FileSystemInfo[] …

CEC2017(Python):七种算法(RFO、DBO、HHO、SSA、DE、GWO、OOA)求解CEC2017

一、7种算法简介 1、红狐优化算法RFO 2、蜣螂优化算法DBO 3、哈里斯鹰优化算法HHO 4、麻雀搜索算法SSA 5、差分进化算法DE 6、灰狼优化算法GWO 7、鱼鹰优化算法OOA 二、CEC2017简介 参考文献&#xff1a; [1]Awad, N. H., Ali, M. Z., Liang, J. J., Qu, B. Y., &…

亚马逊促销效果不好怎么办?亚马逊促销规则是什么?-站斧浏览器

亚马逊促销效果不好怎么办&#xff1f; 分析原因&#xff1a;首先需要深入分析促销效果不佳的原因。可能是促销活动的设计不够吸引人&#xff0c;或者是目标受众定位不准确。 调整策略&#xff1a;根据分析结果调整促销策略。例如&#xff0c;优化广告文案、更改推广时段或调…

CentOS7部署Kafka

CentOS7部署Kafka 一、部署1、前置条件2、下载与解压3、修改配置4、启动kafka二、使用详解1、创建一个主题2、展示所有主题3、启动消费端接收消息4、生产端发送消息三、代码集成pom.xmlapplication.propertiesKafkaConfiguration.javaKafkaConsumer.javaKafkaProducer.javaVehi…

什么是软件安全性测试?如何进行安全测试?

一、什么是软件安全性测试&#xff1f; 软件安全性测试是指对软件系统中的安全漏洞进行检测和评估的过程。其目的是为了确保软件系统在面对各种安全威胁时能够保持其功能的完整性、可用性和机密性。 二、软件安全性测试可以通过以下几个步骤来进行&#xff1a; 1. 需求分析&a…

python的初识(print+intput函数和变量的基本运用)

#主页传送&#xff1a;江南的江 #每日鸡汤&#xff1a;你要知是非以不辩为解脱&#xff0c;烦恼以忍辱为智慧&#xff0c;办事以尽力为有功&#xff0c;处人以真诚为品格。做人的方略是&#xff1a;把好自己的口&#xff0c;明了心中的事&#xff0c;干好手里的活&#xff0c;走…

Uncaught TypeError: Cannot read property ‘snj‘ of null

项目场景&#xff1a; 项目相关背景&#xff1a; 调试项目时&#xff0c;控制台出现红色报错信息 问题描述 问题&#xff1a; 调试项目时&#xff0c;控制台出现如下所示的报错信息&#xff1a; Uncaught TypeError: Cannot read property snj of nullat T.Inj.Ya [as Inj…

软件测试基础理论学习-软件测试方法论

软件测试方法论 软件测试的方法应该建立在不同的软件测试类型上&#xff0c;不同的测试类型会存在不同的方法。本文以软件测试中常见的黑盒测试为例&#xff0c;简述常见软件测试方法。 黑盒测试用例设计方法包括等价类划分法、边界值分析法、因果图法、判定表驱动法、正交试…

C++|【25】构造函数和【26】析构函数

为什么需要构造函数 创造一个实体类&#xff0c;而未将其内部变量提前赋予新值&#xff0c;并强行进行调用&#xff0c;将会随机分配上一个新的值。 而使用构造函数可以确保&#xff0c;可以使得变量有一个稳定的初始值。 Init函数需要人为去调用&#xff0c;而采用构造函数&am…

异步优势演员-评论家算法 A3C

异步优势演员-评论家算法 A3C 异步优势演员-评论家算法 A3C网络结构并行步骤 异步优势演员-评论家算法 A3C A3C 在 A2C 基础上&#xff0c;增加了并行训练&#xff08;异步&#xff09;来提高效率。 网络结构 A2C&#xff1a; A3C&#xff1a; 在这两张图之间&#xff0c;…