美文网首页
利用Kotlin与itext将多张图片合成Pdf文件

利用Kotlin与itext将多张图片合成Pdf文件

作者: 爱学习的蹭蹭 | 来源:发表于2022-01-09 22:07 被阅读0次

    1、Gradle配置下载jar

        implementation 'com.lowagie:itext:2.1.7'
    

    2、实现思路

    • 利用Kotlin与itext将多张图片合成Pdf文件。首先指定一个文件目录,把所有图片读取出来,然后指定到一个目标目录输出一个pdf文件

    3、代码实现

    package com.rub.domain
    
    import com.lowagie.text.Document
    import com.lowagie.text.Image
    import com.lowagie.text.Rectangle
    import com.lowagie.text.pdf.PdfWriter
    import java.awt.image.BufferedImage
    import java.io.File
    import java.io.FileOutputStream
    import java.util.stream.Collectors
    import javax.imageio.ImageIO
    
    
    /**
     * 将多张图片合并转为PDF;需要用到iTextpdf包,
     */
    object Image2Pdf {
        /**
         * @param imageFolderPath 图片文件夹地址
         * @param pdfPath         PDF文件保存地址
         */
        private fun convertToPdf(imageFolderPath: String, pdfPath: String) {
            try {
                // 输入流
                val fos = FileOutputStream(pdfPath)
                // 创建文档
                val doc = Document(null, 0F, 0F, 0F, 0F)
                //doc.open();
                // 写入PDF文档
                PdfWriter.getInstance(doc, fos)
                // 读取图片流
                var img: BufferedImage? = null
                // 实例化图片
                var image: Image? = null
                //读取文件并且过滤图片类型
                val fileArr = listFiles(imageFolderPath, ArrayList()).stream().filter { o: String ->
                    o.endsWith(".png") || o.endsWith(".jpg") || o.endsWith(
                        ".gif"
                    ) || o.endsWith(".jpeg") || o.endsWith(".tif")
                }.collect(Collectors.toList())
    
                // 循环获取图片文件夹内的图片
                for (filePath in fileArr) {
                    // 读取图片流
                    img = ImageIO.read(File(filePath))
                    // 根据图片大小设置文档大小
                    doc.pageSize = Rectangle(img.width.toFloat(), img.height.toFloat())
                    // 实例化图片
                    image = Image.getInstance(filePath)
                    // 添加图片到文档
                    doc.open()
                    doc.add(image)
                }
                // 关闭文档
                doc.close()
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }
    
        /**
         * 列出文件清单,以一个数组形式返回,
         *
         * @param filePath 磁盘文件路径
         * @param fileArr  此参数需要传一个new ArrayList<>()进入方法体,在非法体创建一个对象数组,子目录的文件存放不了进数组进行返回
         * @return
         */
        private fun listFiles(filePath: String, fileArr: MutableList<String>): List<String> {
            val files = File(filePath).listFiles()
            for (k in files.indices) {
                if (files[k].isDirectory) {
                    listFiles(files[k].path, fileArr)
                } else if (!files[k].isDirectory) {
                    fileArr.add(files[k].absolutePath)
                }
            }
            return fileArr
        }
    
        @JvmStatic
        fun main(args: Array<String>) {
            val startTime = System.currentTimeMillis()
            //指定一个图片目录与输出文件
            convertToPdf("D:\\lxw\\", "D:\\lxw\\爱学习的蹭蹭.pdf")
            val endTime = System.currentTimeMillis()
            val time = ((endTime - startTime) / 1000).toInt()
            println("执行了:" + time + "秒!")
        }
    }
    
    

    相关文章

      网友评论

          本文标题:利用Kotlin与itext将多张图片合成Pdf文件

          本文链接:https://www.haomeiwen.com/subject/gyspcrtx.html