feiyu02
2025-09-30 6904763f0e74d9a9fa4dbc39f635d2aee39416c6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package cn.flightfeather.supervision.common.pdf
 
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 {
 
    private const val FONT1 = "/font/STSONG.TTF"
    private const val FONT2 = "font/msyhbd.ttc"
    private const val FONT3 = "font/msyhl.ttc"
 
    @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 htmlToPdf(content: String): ByteArray {
 
        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)
 
        val totalPages = reader.numberOfPages
        val font = BaseFont.createFont(FONT1, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED)
        for (i in 1..totalPages) {
            // 读取第i页内容
            val page = stamper.getOverContent(i)
 
            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 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,图片像素点,dpi越高图片体积越大,216很清晰,105体积稳定
            val image = renderer.renderImageWithDPI(i, 216f)
            // 格式为JPG
            ImageIO.write(image, "jpg", output)
        }
        doc.close()
        return picOutput.map { it.toByteArray() }
    }
}