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() }
|
}
|
}
|