利用Kotlin與itext將多張圖片合成Pdf文件

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章