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


    }


}

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值