This commit is contained in:
Mrx
2026-03-16 12:32:41 +08:00
parent 09db8d003e
commit 14b2c53eeb
5 changed files with 394 additions and 75 deletions

View File

@@ -30,6 +30,10 @@ func (r *DatabaseTableRenderer) RenderTable(pdf *gofpdf.Fpdf, tableData *TableDa
r.logger.Warn("表格数据为空,跳过渲染")
return nil
}
// 避免表格绘制在页眉区,防止遮挡 logo
if pdf.GetY() < ContentStartYBelowHeader {
pdf.SetY(ContentStartYBelowHeader)
}
// 检查表头是否有有效内容
hasValidHeader := false
@@ -67,8 +71,13 @@ func (r *DatabaseTableRenderer) RenderTable(pdf *gofpdf.Fpdf, tableData *TableDa
// 即使没有数据行,也渲染表头(单行表格)
// 但如果没有表头也没有数据,则不渲染
// 设置字体
r.fontManager.SetFont(pdf, "", 9)
// 表格线细线(返回字段说明等表格线不要太粗)
savedLineWidth := pdf.GetLineWidth()
pdf.SetLineWidth(0.2)
defer pdf.SetLineWidth(savedLineWidth)
// 正文字体:宋体小四 12pt
r.fontManager.SetBodyFont(pdf, "", BodyFontSizeXiaosi)
_, lineHt := pdf.GetFontSize()
// 计算页面可用宽度
@@ -112,7 +121,7 @@ func (r *DatabaseTableRenderer) RenderTable(pdf *gofpdf.Fpdf, tableData *TableDa
// 策略:先确保每列最短内容能完整显示(不换行),然后根据内容长度分配剩余空间
func (r *DatabaseTableRenderer) calculateColumnWidths(pdf *gofpdf.Fpdf, tableData *TableData, availableWidth float64) []float64 {
numCols := len(tableData.Headers)
r.fontManager.SetFont(pdf, "", 9)
r.fontManager.SetBodyFont(pdf, "", BodyFontSizeXiaosi)
// 第一步:找到每列中最短的内容(包括表头),计算其完整显示所需的最小宽度
colMinWidths := make([]float64, numCols)
@@ -362,8 +371,8 @@ func (r *DatabaseTableRenderer) renderHeader(pdf *gofpdf.Fpdf, headers []string,
// 绘制表头背景和文本
pdf.SetFillColor(74, 144, 226) // 蓝色背景
pdf.SetTextColor(0, 0, 0) // 黑色文字
r.fontManager.SetFont(pdf, "B", 9)
pdf.SetTextColor(0, 0, 0) // 黑色文字
r.fontManager.SetBodyFont(pdf, "B", BodyFontSizeXiaosi)
currentX := 15.0
for i, header := range headers {
@@ -396,8 +405,7 @@ func (r *DatabaseTableRenderer) renderHeader(pdf *gofpdf.Fpdf, headers []string,
pdf.SetXY(currentX+2, textStartY)
// 确保颜色为深黑色(在渲染前再次设置,防止被覆盖)
pdf.SetTextColor(0, 0, 0) // 表头是黑色文字
// 设置字体,确保颜色不会变淡
r.fontManager.SetFont(pdf, "B", 9)
r.fontManager.SetBodyFont(pdf, "B", BodyFontSizeXiaosi)
// 再次确保颜色为深黑色(在渲染前最后一次设置)
pdf.SetTextColor(0, 0, 0)
// 使用正常的行高,文本已经垂直居中(减少内边距,给文本更多空间)
@@ -417,7 +425,7 @@ func (r *DatabaseTableRenderer) renderRows(pdf *gofpdf.Fpdf, rows [][]string, co
numCols := len(colWidths)
pdf.SetFillColor(245, 245, 220) // 米色背景
pdf.SetTextColor(0, 0, 0) // 深黑色文字,确保清晰
r.fontManager.SetFont(pdf, "", 9)
r.fontManager.SetBodyFont(pdf, "", BodyFontSizeXiaosi)
// 获取页面尺寸和边距
_, pageHeight := pdf.GetPageSize()
@@ -575,8 +583,7 @@ func (r *DatabaseTableRenderer) renderRows(pdf *gofpdf.Fpdf, rows [][]string, co
pdf.SetXY(currentX+2, textStartY)
// 再次确保颜色为深黑色(防止被其他设置覆盖)
pdf.SetTextColor(0, 0, 0)
// 设置字体,确保颜色不会变淡
r.fontManager.SetFont(pdf, "", 9)
r.fontManager.SetBodyFont(pdf, "", BodyFontSizeXiaosi)
// 再次确保颜色为深黑色(在渲染前最后一次设置)
pdf.SetTextColor(0, 0, 0)
// 安全地渲染文本,使用正常的行高