首页 > 其他分享 >Android中使用PDFBox将文本写入到PDF文件中

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

时间:2024-11-27 16:33:42浏览次数:7  
标签:signPositionData val currentForm position cs PDF Android 文本 PDFBox

在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

相关文章

  • springboot毕设基于Android的电动汽车电桩管理平台前 源码+论文+部署
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着电动汽车产业的迅猛发展,其市场保有量不断攀升。然而,与之配套的充电桩管理却面临诸多挑战。一方面,充电桩数量日益增多,分布广泛且分散,传统的管......
  • 打开PDF文件不能编辑,都有哪些原因?
    PDF文件打开之后,发现不能编辑,都有哪些原因?PDF文件带有限制编辑?有哪些解决方法可以帮助去除?今天我们一起将这两个问题进行一个总结。PDF不能编辑的原因?PDF文件不能编辑,有可能是因为PDF文件中的是图片内容,可以使用OCR功能将文字扫描下来进行编辑;也有可能是因为PDF文件中设置了......
  • component 'rust-std' for target 'aarch64-linux-android' is up to date
    lipan@ubuntu:~/rustdesk$rustuptargetaddaarch64-linux-androidinfo:component'rust-std'fortarget'aarch64-linux-android'isuptodate出现这种错误:首先设置androidsdk的路径:exportANDROID_NDK_HOME=/home/lipan/android-ndk-r23c然后使用......
  • android开发使用openssl3.3.2加解密国密sm2代码实现
    #include"openssl/rsa.h"#include"openssl/pem.h"#include"openssl/err.h"#include"openssl/evp.h"#include"openssl/ec.h"#include<string>#include<unistd.h>#include"openssl_sm2.hpp&......
  • 【转】[C#] Aspose.pdf 添加文字水印
    转自:https://www.cnblogs.com/Shi-zy/p/15494760.html另一篇:https://www.cnblogs.com/z5337/p/7344636.html用aspose.word把word转pdf的代码段:DocumentpdfDocument=newDocument(@"D:\pdfdir\jhrs.com.pdf");for(intpageCount=1;pa......
  • springboot毕设基于Android的考勤签到系统源码+论文+部署
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着信息技术的飞速发展,移动设备在企业管理中的应用日益广泛。Android系统作为移动设备的主流操作系统,具有开放性、易用性和广泛的用户基础等特......
  • Android中序列化方式:Serialzable接口、Parcelabel接口、Binder(一)
    Serializable接口Java提供的一个序列化空接口,为对象提供标准的序列化和反序列化操作,使用方法只需要在类的声明中指定一个标识publicclassUserimplementsSerializable{ privatestaticfinallongserialVersionUID=519067123721295773L; publicintuserId; pub......
  • x-easypdf 初始
    一、概述一个java语言简化处理pdf的框架项目主页https://x-easypdf.cn项目概述x-easypdf是一个java语言简化处理pdf的框架,包含fop模块与pdfbox模块,fop模块以创建功能为主,基于xsl-fo模板生成pdf文档,以数据源的方式进行模板渲染;pdfbox模块以编辑功能为主,对标准的pdfbox......
  • 《JAVA编程思想》第四版 PDF 下载 中文版和英文版 高清PDF扫描带书签
     转载自:https://www.cnblogs.com/buwuliao/p/8073211.html非常感谢也可见:https://www.cnblogs.com/ChaoJieLiu/p/12910447.html一、链接:中文版+英文版+思维导图:链接:https://pan.baidu.com/s/1bmgOdC7gFhI4Waac6JV4Wg提取码:s3vc复制这段内容后打开百度网盘手机App,操作更方......
  • Android15音频进阶之HwAudioSource设置source解析(九十六)
    简介:CSDN博客专家、《Android系统多媒体进阶实战》一书作者新书发布:《Android系统多媒体进阶实战》......