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