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 = "春江潮水连海平,海上明月共潮生。滟滟随波千万里,何处春江无月明!江流宛转绕芳甸,月照花林皆似霰。空里流霜不觉飞,汀上白沙看不见。江天一色无纤尘,皎皎空中孤月轮。江畔何人初见月?江月何年初照人?" 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() } } }