grafana-reporter导出中文图表(修改go源码)

2023-11-28 10:48

本文主要是介绍grafana-reporter导出中文图表(修改go源码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、标题中文

grafana-reporter安装过程,看前面教程吧,标题中文我修改了go调用的命令latex为xelatex,原因是latex需要安装ctex模块调用中文始终无法成功;修改为xelatex后,使用xeCJK模块成功导出中文标题。

注意:使用此方法需要安装xelatex和xeCJK的模块

  1. 修改github.com/IzakMarais/reporter/report/report.go文件
    225行和234行内容,把pdflatex换成xelatex
224 func (rep *report) runLaTeX() (pdf *os.File, err error) {
225         //cmdPre := exec.Command("pdflatex", "-halt-on-error", "-draftmode", reportTexFile)
226         cmdPre := exec.Command("xelatex", "-halt-on-error", reportTexFile)
227         cmdPre.Dir = rep.tmpDir
228         outBytesPre, errPre := cmdPre.CombinedOutput()
229         log.Println("Calling LaTeX - preprocessing")
230         if errPre != nil {
231                 err = fmt.Errorf("error calling LaTeX preprocessing: %q. Latex preprocessing failed with output: %    s ", errPre, string(outBytesPre))
232                 return
233         }
234         //cmd := exec.Command("pdflatex", "-halt-on-error", reportTexFile)
235         cmd := exec.Command("xelatex", "-halt-on-error", reportTexFile)
236         cmd.Dir = rep.tmpDir
237         outBytes, err := cmd.CombinedOutput()
238         log.Println("Calling LaTeX and building PDF")
239         if err != nil {
240                 err = fmt.Errorf("error calling LaTeX: %q. Latex failed with output: %s ", err, string(outBytes))
241                 return
242         }
243         pdf, err = os.Open(rep.pdfPath())
244         return
245 }
  1. 修改github.com/IzakMarais/reporter/report/texTemplate.go
    在const defaultTemplate中新增两行
    \usepackage{xeCJK}
    \setCJKmonofont{KaiTi}
    在这里插入图片描述

二、点击下载中文

默认点击下载是unicode码文件名称,比如u4e2du6587u6d4bu8bd5DNS.pdf,不太方便。

  1. 修改github.com/IzakMarais/reporter/cmd/grafana-reporter/handler.go
    引用bytes模块,新增函数conv_str,修改addFilenameHeader函数

conv_str函数如下:

func conv_str(filename string)string {buf := bytes.NewBuffer(nil)i, j := 0, len(filename)for i < j {x := i + 6if x > j {buf.WriteString(filename[i:])break}if filename[i] == '\\' && filename[i+1] == 'u' {hex := filename[i+2 : x]//fmt.Println(hex)r, err := strconv.ParseUint(hex, 16, 64)if err == nil {//fmt.Println(string(r))buf.WriteRune(rune(r))} else {buf.WriteString(filename[i:x])}i = x} else {buf.WriteByte(filename[i])i++}}//fmt.Println(buf.String())return buf.String()
}

修改addFilenameHeader函数如下:
在这里插入图片描述

这篇关于grafana-reporter导出中文图表(修改go源码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/429579

相关文章

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

go 指针接收者和值接收者的区别小结

《go指针接收者和值接收者的区别小结》在Go语言中,值接收者和指针接收者是方法定义中的两种接收者类型,本文主要介绍了go指针接收者和值接收者的区别小结,文中通过示例代码介绍的非常详细,需要的朋友们下... 目录go 指针接收者和值接收者的区别易错点辨析go 指针接收者和值接收者的区别指针接收者和值接收者的

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

Docker镜像修改hosts及dockerfile修改hosts文件的实现方式

《Docker镜像修改hosts及dockerfile修改hosts文件的实现方式》:本文主要介绍Docker镜像修改hosts及dockerfile修改hosts文件的实现方式,具有很好的参考价... 目录docker镜像修改hosts及dockerfile修改hosts文件准备 dockerfile 文

Python将博客内容html导出为Markdown格式

《Python将博客内容html导出为Markdown格式》Python将博客内容html导出为Markdown格式,通过博客url地址抓取文章,分析并提取出文章标题和内容,将内容构建成html,再转... 目录一、为什么要搞?二、准备如何搞?三、说搞咱就搞!抓取文章提取内容构建html转存markdown

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接