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() } } }