golang实现pdf中自动换行的表格

需要用到的库:jung-kurt/gofpdf
由于CellFormat方法不支持\n换行,会被变成乱码,MultiCell方法会自动将坐标定位到下一行。所以需要自己实现坐标的计算变换。通过Rect方法画出单元格,MultiCell方法在格内自动换行写字,在计算坐标重复写单元格,最终组成一行。
参考ExampleFpdf_Rect()

  1. 实现自动换行的表格
import "github.com/jung-kurt/gofpdf"type pdfLine struct {pdf      *gofpdf.Fpdfh        float64	// 需要的行高x        float64	// 记录开始时坐标y        float64	// 记录开始时坐标style    string		// 风格  F仅填充 D仅边框 或者DF两个都要alignStr string		// 对其方式 LCR为水平的左、中、右,TMBA为垂直的上、中、下、基准线fontH    float64	// 字体高度cells    []pdfCell	// 
}type pdfCell struct {w      float64	// 宽度h      float64	// 行高txtStr string	// 文本lines  int		// 判断文本会占几行
}func (s *pdfLine) addLine(style string, alignStr string, cells ...pdfCell) {s.style = styles.alignStr = alignStr_, _, _, mbottom := s.pdf.GetMargins() // 获取当前页面边距_, pageh := s.pdf.GetPageSize()        // 获取当前页面尺寸x, y := s.pdf.GetXY()                  // 获取当前位置// 页面剩余行高不够时 开启新一页if s.pdf.GetY()+s.h > pageh-mbottom {s.pdf.AddPage()y = s.pdf.GetY()}s.x = xs.y = y_, s.fontH = s.pdf.GetFontSize()// 记录需要的最高行高for _, cell := range cells {lines := s.pdf.SplitText(cell.txtStr, cell.w)h := float64(len(lines)) * cell.hif s.h < h {s.h = h}cell.lines = len(lines)s.cells = append(s.cells, cell)}s.write()
}// 写入
func (s *pdfLine) write() {x := s.xy := s.y// 手动记录并移动坐标for _, c := range s.cells {usedH := float64(c.lines) * s.fontHmargin := (s.h - usedH) / 2.0s.pdf.Rect(x, s.y, c.w, s.h, s.style)s.pdf.SetXY(x, y+margin) // 保持单元格内的文字有边距s.pdf.MultiCell(c.w, s.fontH, c.txtStr, "", s.alignStr, false)x += c.ws.pdf.SetXY(x, y)}// 坐标重置为下一行的当前位置s.pdf.SetXY(s.x, s.y+s.h)// 重置变量s.cells = nils.h = 0
}// 使用  生成一个每行4列的表格
func main() {pdf := gofpdf.New("P", "mm", "A4", "")pdf.AddPage()pdf.AddUTF8Font("NotoSansSC-Regular", "", "src/font/NotoSansSC-Regular.ttf")pdf.SetFont("NotoSansSC-Regular", "", 12)myPdf := pdfLine{pdf: pdf}width, _ := pdf.GetPageSize()		// 页面宽度left, _, right, _ := pdf.GetMargins()	// 左右边距usable := width - left - right	// 可用的页面宽度_,h := pdf.GetFontSize()	// 字体高度tableH := h + 2	// 行高  多出2mm的边距tableWidth := usable / 4	// 每个单元个的宽度pdf.SetFillColor(233, 233, 233)// 表头myPdf.addLine("FD", "CM", []pdfCell{{w: tableWidth, h: tableH, txtStr: "表头1"},{w: tableWidth, h: tableH, txtStr: "表头2"},{w: tableWidth, h: tableH, txtStr: "表头3"},{w: tableWidth, h: tableH, txtStr: "表头4"},}...)// 内容myPdf.addLine("", "CM", []pdfCell{{w: tableWidth, h: tableH, txtStr: "内容1"},{w: tableWidth, h: tableH, txtStr: "假设这里是很长很长的内容,你可以自己替换一下"},{w: tableWidth, h: tableH, txtStr: "内容3"},{w: tableWidth, h: tableH, txtStr: "内容4"},}...)
}
  1. 创建页面、指定字体
	// 添加页面pdf.AddPage()// 加载字体pdf.AddUTF8Font("NotoSansSC-Regular", "", "src/font/NotoSansSC-Regular.ttf")// 设置字体pdf.SetFont("NotoSansSC-Regular", "", 12)

加载字体时,会将前面New方法指定的目录和AddUTF8Font方法指定的目录文件拼在一起。

  1. 其他常用写入方法
	// 简单单元格,接收参数为 1.单元格长度  2.行高  3.文本pdf.Cell(cellWeight, h, "my text")// 自动换行的单元格,调用这个方法之左边会回到下一行的开头pdf.MultiCell(0, h, "假设这是一个很长的单元格")// 设置填充颜色pdf.SetFillColor(233, 233, 233)// 指定格式的单元格  参数 1.单元格长度 2.行高 3.文本 4.边框形式(1全边框、或者LTRB分别代表左上右下) 5.单元格// 写入之后的坐标(1为下一行开头,2当前坐标的下一行) 6.对其方式(LCR为水平的左、中、右,TMBA为垂直的上、中、// 下、基准线) 7.是否填充当前格子 8.连接 9.连接urlpdf.CellFormat(tableWidth, tableH, "总成本", "1", 0, "M", true, 0, "")// 插入图片 参数分别为  1图片位置 2x坐标 3y坐标 4图片宽度 5图片高度pdf.ImageOptions("src/font/logo.png", width-right-25, 5, 25, 0, false, opt, 0, "")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/657966.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

瑞_数据结构与算法_红黑树

文章目录 1 什么是红黑树1.1 红黑树的背景1.2 红黑树的特性 ★★★ 2 红黑树的Java实现2.1 红黑树颜色枚举类Color2.2 红黑树节点类Node2.2.1 实现判断是否是左孩子方法isLeftChild()2.2.2 实现查找叔叔节点方法uncle()2.2.3 实现查找兄弟节点方法sibling() 2.3 红黑树类RedBla…

GoLang中应该避免的10个错误

Go是一种静态类型的、并发的、垃圾收集的编程语言&#xff0c;由谷歌开发。近年来&#xff0c;由于它的简单性、性能和对并发的强大支持&#xff0c;它已经获得了普及。尽管它很简单&#xff0c;但开发人员在编写Go代码时仍有一些常见的错误。下面是Go语言中需要避免的十大坏错…

Python如何递归删除空文件夹

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 1.Python如何递归删除空文件夹&#xff0c;这个问题很常见。 但大多数人的解决办法都是自己实现递归函数解决这个问题&#xff0c;其实根本不用那么麻烦。 Python中的os.walk提供了一种从内到外的遍历目录树的方法&#xff…

fullcalendar案例

fullcalendar案例 <script srchttps://cdn.jsdelivr.net/npm/fullcalendar6.1.10/index.global.min.js></script><script srchttps://code.jquery.com/jquery-3.6.0.min.js></script> <!-- 引入 jQuery CDN --><script>document.addEventL…

第5章 python深度学习——波斯美女

第5章 深度学习用于计算机视觉 本章包括以下内容&#xff1a; 理解卷积神经网络&#xff08;convnet&#xff09; 使用数据增强来降低过拟合 使用预训练的卷积神经网络进行特征提取 微调预训练的卷积神经网络 将卷积神经网络学到的内容及其如何做出分类决策可视化 本章将…

【前端-VUE】Vue3组件组成部分及组件通信(详解)

一、父子间通信 1.父传子&#xff1a; 2.子传父&#xff1a; 3.什么是prop Prop定义&#xff1a;组件上注册的一些自定义属性 Prop作用&#xff1a;向子组件传递数据 特点&#xff1a; 可以传递任意数量的prop可以传递任意类型的prop 3.1 props校验 思考&#xff1a;组件的prop…

母排设计时没有柜体3D数据?来试试SuperPanel的钣金功能!

CAD版SuperPanel软件能够助力用户快速、准确地设计和修改母排&#xff0c;同时快速输出加工图纸和数控加工代码。在壳体外购&#xff0c;没有柜体3D数据的情况下&#xff0c;如何轻松进行母排设计&#xff1f;一起来学习利驰数字母排的钣金功能吧&#xff01; SuperPanel的钣金…

【新课】安装部署系列Ⅲ—Oracle 19c Data Guard部署之两节点RAC部署实战

本课程由云贝教育-刘峰老师出品&#xff0c;感谢关注 课程介绍 Oracle Real Application Clusters (RAC) 是一种跨多个节点分布数据库的企业级解决方案。它使组织能够通过实现容错和负载平衡来提高可用性和可扩展性&#xff0c;同时提高性能。本课程基于当前主流版本Oracle 1…

python 写入csv文件 内容乱码

问题 python 写入csv文件 内容乱码 详细问题 笔者核心代码 import csv # 将数据写入 CSV 文件 csv_file_path "soil_data.csv" header ["经度", "纬度", "土壤类型", "pH值"]with open(csv_file_path, mode"w&q…

【PyTorch实战演练】Fast R-CNN中的RoI(Region of Interest)池化详解

文章目录 0. 前言1. ROI池化的提出背景2. RoI池化的结构与工作原理3. RoI池化的作用及意义4. RoI使用示例 0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自己学习的理解&#xff0c;虽然参考了他人的宝贵见解及成果&#xff0c;但是内容可能存在不准确的地方…

优化器刺客之limit 1--Order by col limit n 代价预估优化探索

一、现象 order by 排序加了limit后更慢了&#xff1f; test# explain analyze select userid from dba_users where username like %aaaaaaaaaaaaaaaaaa% order by userid ;QUERY PLAN --------------…

ElementUI Form:Radio 单选框

ElementUI安装与使用指南 Radio 单选框 点击下载learnelementuispringboot项目源码 效果图 el-radio.vue 页面效果图 项目里el-radio.vue代码 <script> export default {name: el_radio,data() {return {radio: 1,radio2: 2,radio3: 3,radio4: 上海,radio5: 上海,ra…

12个适合后端程序员的前端框架

前言 今天我们分享12个适合后端程序员的前端框架&#xff0c;本文中的所有前端框架都已经收录到适合后端程序员的前端框架GitHub Issues知识库中&#xff0c;假如大家有更好前端框架推荐欢迎到以下GitHub项目地址留言或者在文末留言&#xff08;注意&#xff1a;排名不分先后&a…

c#鼠标绘制

有用的没用的&#xff0c;用的上的用不上的&#xff0c;能写的不能写的&#xff0c;反正想起来就写了&#xff0c;比如这篇&#xff0c;好像一般也没什么用&#xff0c;emmm&#xff0c;或许&#xff0c;做录制软件的时候可以用一下。 顾名思义&#xff0c;本篇主要就是来实现将…

dvwa,xss反射型lowmedium

xss&#xff0c;反射型&#xff0c;low&&medium low发现xss本地搭建实操 medium作为初学者的我第一次接触比较浅的绕过思路high low 发现xss 本关无过滤 <script>alert(/xss/)</script> //或 <script>confirm(/xss/)</script> //或 <scr…

幻兽帕鲁服务器游戏怎么升级版本?

幻兽帕鲁服务器游戏怎么升级版本&#xff1f;自建幻兽帕鲁服务器进入Palworld游戏提示“您正尝试加入的比赛正在运行不兼容的游戏版本&#xff0c;请尝试升级游戏版本”什么原因&#xff1f;这是由于你的客户端和幻兽帕鲁服务器版本不匹配&#xff0c;如何解决&#xff1f;更新…

故障诊断 | 一文解决,SVM支持向量机的故障诊断(Matlab)

效果一览 文章概述 故障诊断 | 一文解决,SVM支持向量机的故障诊断(Matlab) 支持向量机(Support Vector Machine,SVM)是一种常用的监督学习算法,用于分类和回归分析。SVM的主要目标是找到一个最优的超平面(或者在非线性情况下是一个最优的超曲面),将不同类别的样本分开…

Flutter的安装与环境配置

一、下载安装Futter&#xff1a; 1、Flutter中文文档&#xff1a; 安装和环境配置 - Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 2、下载 Futter SDK&#xff1a; Flutter中文文档 里面有&#xff0c;下载完成之后找个文件夹解压出来&#xff0c;最好不要将 Flu…

大数据分析|从七个特征理解大数据分析

文献来源&#xff1a;Saggi M K, Jain S. A survey towards an integration of big data analytics to big insights for value-creation[J]. Information Processing & Management, 2018, 54(5): 758-790. 下载链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1…

轩辕编程(Java第十一讲):Java类的多态性

多态在程序设计中指“一种定义&#xff0c;多种实现” 多态性是面向对象的核心特征之一&#xff0c;主要有方法的多态和类型的多态。方法的多态包括方法的重载和覆盖&#xff0c;为一种功能提供多种实现&#xff1b;类型的多态表现为&#xff0c;子类是一种父类类型。 子类声…