package cn.flightfeather.supervision.common.pdf
|
|
import com.itextpdf.html2pdf.ConverterProperties
|
import com.itextpdf.html2pdf.HtmlConverter
|
import com.itextpdf.layout.font.FontProvider
|
import freemarker.template.Configuration
|
import java.io.*
|
import javax.servlet.http.HttpServletResponse
|
|
/**
|
* @Description: 生成PDF合同工具类
|
*/
|
object GeneratePdfUtil {
|
private const val TEMPORARY_CONTRACT_HTML = "src/main/resources/templates/temporary.html"
|
|
private const val SIMSUN_FILE = "src/main/resources/font/simsunb.ttf"
|
@Throws(Exception::class)
|
fun generateContract(param: DynamicParam): String {
|
// 生成html合同
|
generateHTML(param.templatePath, param.templateName, param.param)
|
// 根据html合同生成pdf合同
|
generatePDF(param.outPath + param.outName)
|
// 删除临时html格式合同
|
removeFile(TEMPORARY_CONTRACT_HTML)
|
return param.outPath + param.outName
|
}
|
|
/**
|
* @Description 生成html格式合同
|
*/
|
@Throws(Exception::class)
|
private fun generateHTML(templatePath: String, templateName: String, paramMap: Map<String, Any>) {
|
val cfg = Configuration()
|
cfg.defaultEncoding = "UTF-8"
|
/**
|
* 1.setClassForTemplateLoading(this.getClass(), "/HttpWeb");
|
* 基于类路径,HttpWeb包下的framemaker.ftl文件
|
* 2.setDirectoryForTemplateLoading(new File("/template"));
|
* 基于文件系统,template目录下的文件
|
* 3.setServletContextForTemplateLoading(request.getSession().getServletContext(), "/template");
|
* 基于Servlet Context,指的是基于WebRoot下的template下的framemaker.ftl文件
|
*/
|
cfg.setDirectoryForTemplateLoading(File(templatePath))
|
|
// templateName.ftl为要装载的模板
|
val template = cfg.getTemplate(templateName)
|
val outHtmFile = File(TEMPORARY_CONTRACT_HTML)
|
val out: Writer = BufferedWriter(OutputStreamWriter(FileOutputStream(outHtmFile)))
|
// 将参数输出到模版,并操作到HTML上
|
template.process(paramMap, out)
|
out.close()
|
}
|
|
/**
|
* @Description 根据html生成pdf格式合同
|
*/
|
@Throws(Exception::class)
|
private fun generatePDF(pdfUrl: String) {
|
val htmFile = File(TEMPORARY_CONTRACT_HTML)
|
val pdfFile = File(pdfUrl)
|
if (!pdfFile.parentFile.exists()) {
|
pdfFile.parentFile.mkdirs()
|
}
|
println(pdfUrl)
|
// val url = htmFile.toURI()
|
// val os: OutputStream = FileOutputStream(pdfFile)
|
// val renderer = ITextRenderer()
|
// renderer.setDocument(url)
|
// val fontResolver = renderer.fontResolver
|
// // 解决中文支持问题
|
// fontResolver.addFont(SIMSUM_FILE, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED)
|
// renderer.layout()
|
// renderer.createPDF(os)
|
// os.close()
|
val p = ConverterProperties()
|
p.fontProvider = FontProvider().apply {
|
// this.addFont(SIMSUN_FILE)
|
this.addSystemFonts()
|
// this.addDirectory("src/main/resources/font/")
|
}
|
HtmlConverter.convertToPdf(htmFile, pdfFile, p)
|
}
|
|
/**
|
* @Description 移除文件
|
*/
|
private fun removeFile(fileUrl: String) {
|
val file = File(fileUrl)
|
file.delete()
|
}
|
|
@Throws(Exception::class)
|
fun returnPdfStream(response: HttpServletResponse, pathName: String?) {
|
response.contentType = "application/pdf"
|
val file = File(pathName)
|
if (file.exists()) {
|
val `in` = FileInputStream(file)
|
val out: OutputStream = response.outputStream
|
val b = ByteArray(1024 * 5)
|
var n: Int
|
while (`in`.read(b).also { n = it } != -1) {
|
out.write(b, 0, n)
|
}
|
out.flush()
|
`in`.close()
|
out.close()
|
}
|
}
|
}
|