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