From 196bb14112448857a885e32dc4149e308e00b01a Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期四, 15 八月 2024 11:57:15 +0800
Subject: [PATCH] 2024.8.15 各项修正

---
 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