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

2022-01-09  本文已影响0人  爱学习的蹭蹭

1、Gradle配置下载jar

    implementation 'com.lowagie:itext:2.1.7'

2、实现思路

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 + "秒!")
    }
}

上一篇下一篇

猜你喜欢

热点阅读