Android中使用PDFBox将文本写入到PDF文件中

在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()
                }
            }
        }
posted @ 2024-11-27 16:28  乌拉小考  阅读(185)  评论(0)    收藏  举报