From 9558ad87cc950bd67306aa31e5f3b7de367258ae Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期二, 20 一月 2026 17:29:23 +0800
Subject: [PATCH] 2026.1.20 1. 新增自巡查承诺功能接口
---
src/main/kotlin/cn/flightfeather/supervision/common/pdf/PdfUtil.kt | 138 +++++++++++++++++++++++++--------------------
1 files changed, 76 insertions(+), 62 deletions(-)
diff --git a/src/main/kotlin/cn/flightfeather/supervision/common/pdf/PdfUtil.kt b/src/main/kotlin/cn/flightfeather/supervision/common/pdf/PdfUtil.kt
index f85361f..106912d 100644
--- a/src/main/kotlin/cn/flightfeather/supervision/common/pdf/PdfUtil.kt
+++ b/src/main/kotlin/cn/flightfeather/supervision/common/pdf/PdfUtil.kt
@@ -1,82 +1,96 @@
package cn.flightfeather.supervision.common.pdf
-import org.apache.poi.util.Units
-import org.apache.poi.xwpf.usermodel.XWPFDocument
-import org.apache.poi.xwpf.usermodel.XWPFParagraph
-import java.io.File
-import java.io.FileInputStream
-import java.io.FileOutputStream
-import java.io.IOException
+import com.itextpdf.html2pdf.ConverterProperties
+import com.itextpdf.html2pdf.HtmlConverter
+import com.itextpdf.layout.font.FontProvider
+import com.itextpdf.text.Element
+import com.itextpdf.text.Font
+import com.itextpdf.text.FontFactory
+import com.itextpdf.text.pdf.BaseFont
+import com.itextpdf.text.pdf.PdfReader
+import com.itextpdf.text.pdf.PdfStamper
+import org.apache.pdfbox.pdmodel.PDDocument
+import org.apache.pdfbox.rendering.PDFRenderer
+import org.fit.pdfdom.PDFDomTree
+import org.fit.pdfdom.PDFDomTreeConfig
+import org.xhtmlrenderer.pdf.ITextRenderer
+import java.io.*
+import javax.imageio.ImageIO
+import javax.xml.parsers.ParserConfigurationException
object PdfUtil {
- fun generateContract(dynamicParam: DynamicParam): String {
- val src = dynamicParam.templatePath+dynamicParam.templateName
- val out = dynamicParam.outPath + dynamicParam.outName
+ private const val FONT1 = "/font/STSONG.TTF"
+ private const val FONT2 = "font/msyhbd.ttc"
+ private const val FONT3 = "font/msyhl.ttc"
- val inputStream = FileInputStream(File(src))
- val xwpfDocument = XWPFDocument(inputStream)
-
- replace(xwpfDocument, dynamicParam.param)
-
- output(xwpfDocument, out)
-
- return out
+ @Throws(IOException::class, ParserConfigurationException::class)
+ fun parseWithPdfDomTree(`is`: InputStream?, startPage: Int, endPage: Int, config: PDFDomTreeConfig?): String? {
+ val pdf: PDDocument = PDDocument.load(`is`)
+ val parser = PDFDomTree(config)
+ parser.startPage = startPage
+ parser.endPage = endPage
+ val output: Writer = StringWriter()
+ parser.writeText(pdf, output)
+ pdf.close()
+ return output.toString()
}
- /**
- * 鏇挎崲娈佃惤涓寚瀹氱殑鏂囨湰
- */
- fun replace(doc:XWPFDocument, params:Map<String, Any>) {
- try {
- setContent(doc.paragraphs, params)
+ fun htmlToPdf(content: String): ByteArray {
- for (tab in doc.tables) {
- for (row in tab.rows) {
- for (cell in row.tableCells) {
- //娉ㄦ剰锛実etParagraphs涓�瀹氫笉鑳芥紡鎺�
- //鍥犱负涓�涓〃鏍奸噷闈㈠彲鑳戒細鏈夊涓渶瑕佹浛鎹㈢殑鏂囧瓧
- //濡傛灉娌℃湁杩欎釜姝ラ閭d箞鏂囧瓧浼氭浛鎹笉浜�
- setContent(cell.paragraphs, params)
- }
- }
- }
- } catch (e: IOException) {
- e.printStackTrace()
+ val p = ConverterProperties()
+
+ p.fontProvider = FontProvider().apply {
+ addFont(FONT1)
}
- }
+ val outputStream = ByteArrayOutputStream()
+ HtmlConverter.convertToPdf(content, outputStream, p)
+ val inputStream = ByteArrayInputStream(outputStream.toByteArray())
+ val reader = PdfReader(inputStream)
+ val output = ByteArrayOutputStream()
+ val stamper = PdfStamper(reader, output)
- private fun setContent(paragraphs: List<XWPFParagraph>, params: Map<String, Any>) {
- for (p in paragraphs) {
- for (r in p.runs) {
- //闇�瑕佹浛鎹㈢殑鏂囨湰
- val text = r.getText(0)
- //鏇挎崲鎸囧畾鐨勬枃鏈�
- for (key in params.keys) {
- if (text != null && text == key) {
- //鏇挎崲鐨勬椂鍊欒娉ㄦ剰锛宻etText鏄湁涓や釜鍙傛暟鐨�
- //绗竴涓槸鏇挎崲鐨勬枃鏈紝绗簩涓槸浠庡摢閲屽紑濮嬫浛鎹�
- //0鏄浛鎹㈠叏閮紝濡傛灉涓嶈缃偅涔堥粯璁ゅ氨鏄粠鍘熸枃瀛�
- //缁撳熬寮�濮嬭拷鍔�
- val v = params[key]
- when (v) {
- is String -> r.setText(v, 0)
- is File -> {
- val input = FileInputStream(v)
- val pic = r.addPicture(input, XWPFDocument.PICTURE_TYPE_JPEG, v.name, Units.toEMU(40.0), Units.toEMU(40.0))
+ val totalPages = reader.numberOfPages
+ val font = BaseFont.createFont(FONT1, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED)
+ for (i in 1..totalPages) {
+ // 璇诲彇绗琲椤靛唴瀹�
+ val page = stamper.getOverContent(i)
- input.close()
- }
- }
- }
- }
+ val pageSize = reader.getPageSize(i)
+ page.run {
+ beginText()
+ setFontAndSize(font, 12F)
+ showTextAligned(Element.ALIGN_CENTER, "绗� ${i} 椤�", pageSize.width / 2, 20F, 0F)
+ endText()
}
}
+ stamper.close()
+ reader.close()
+
+// val render = ITextRenderer()
+// render.fontResolver.adF
+
+ return output.toByteArray()
+
+
}
- fun output(doc: XWPFDocument, outSrc: String) {
- doc.write(FileOutputStream(outSrc))
+ fun pdfToPic(bytes: ByteArray): List<ByteArray> {
+ val picOutput = mutableListOf<ByteArrayOutputStream>()
+
+ val doc = PDDocument.load(bytes)
+ val renderer = PDFRenderer(doc)
+ val pageCount = doc.numberOfPages
+ for (i in 0 until pageCount) {
+ val output = ByteArrayOutputStream()
+ picOutput.add(output)
+ // dpi锛屽浘鐗囧儚绱犵偣锛宒pi瓒婇珮鍥剧墖浣撶Н瓒婂ぇ锛�216寰堟竻鏅帮紝105浣撶Н绋冲畾
+ val image = renderer.renderImageWithDPI(i, 216f)
+ // 鏍煎紡涓篔PG
+ ImageIO.write(image, "jpg", output)
+ }
doc.close()
+ return picOutput.map { it.toByteArray() }
}
}
\ No newline at end of file
--
Gitblit v1.9.3