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 + "秒!")
}
}
网友评论