在Android中要写入文本,按照网上的使用showText,在showText之前使用moveTo方法无法写入到正确的位置,需要使用Matrix来确定准确的位置和大小
下面的代码时将一个包含写入文本和位置的表单数组,将表单数组中的文本写入到PDF对应位置的方法
// 位置信息
class PositionData {
var signX: Float = 0f
var signY: Float = 0f
var signHeight: Float = 0f
var signWidth: Float = 0f
constructor(currentForm: Form, pdfHeight: Float) {
// 表单的位置
val position = currentForm.position
val positionWidth = position.lrx - position.ulx
val positionHeight = position.lry - position.uly
signHeight = positionHeight.toFloat()
signWidth = positionWidth.toFloat()
signX = (currentForm.position.lrx - positionWidth).toFloat()
signY = (pdfHeight - currentForm.position.lry).toFloat()
}
}
// 将文本写入到PDDF的里面
private fun signTextToPDFWithForms(
infoForms: List<Form>,
document: PDDocument,
) {
if (infoForms.isNotEmpty()) {
// 加载字体文件
val pdFont = PDType0Font.load(document, MainApplication.appContext!!.assets.open("fangsong.ttf"))
for (currentForm in infoForms) {
val currentPage = currentForm.page - 1
val page = document.getPage(currentPage)
val cs = PDPageContentStream(
document,
page,
PDPageContentStream.AppendMode.APPEND,
false
)
// 写入的文本的位置数据
val signPositionData = PositionData(
currentForm,
document.getPage(currentForm.page - 1).mediaBox.height
)
// 开始文本绘制
cs.beginText()
// 计算正确的位置和缩放
val fontSize = 15f
val text = currentForm.initialValue?.toString() ?: ""
// 创建变换矩阵
val transform = AffineTransform().apply {
// 先平移到目标位置
translate(
signPositionData.signX.toDouble(),
signPositionData.signY.toDouble() + 4
)
// 设置缩放比例
var scaleY = signPositionData.signHeight / (fontSize + 5)
scale(scaleY.toDouble(), scaleY.toDouble())
}
// 应用变换
cs.setTextMatrix(transform)
cs.setFont(pdFont, fontSize)
LogUtils.i("draw text form", currentForm, text)
LogUtils.i("draw text position",
"x: ${signPositionData.signX}, y: ${signPositionData.signY}, " +
"width: ${signPositionData.signWidth}, height: ${signPositionData.signHeight}"
)
// 绘制文本
cs.showText(text)
cs.endText()
cs.close()
}
}
}
标签:signPositionData,val,currentForm,position,cs,PDF,Android,文本,PDFBox
From: https://www.cnblogs.com/xxss0903/p/18572578