因工作需要实现word转pdf
实现原理:利用go命令行调用libreffice命令实现文件转化
**使用 libreffice 文件转pdf 并发数不能超2,只能一个文件转化成功后,在进行下一个
注意事项使用前本机或者服务器先安装开源软件 libreffice !!!
注意事项使用前本机或者服务器先安装开源软件 libreffice !!!
传送门:libreoffice
代码如下(粘贴后直接运行):
package Test
import (
"fmt"
"os"
"os/exec"
"path"
"runtime"
"strings"
"testing"
)
//TestToPdf golang+libreffice 实现word,excel,pptx转pdf,html
func TestToPdf(t *testing.T) {
fileSrcPath := "/Users/xing/Desktop/123/test2.docx" //自己机器上的文件地址
outPath := "/Users/xing/Desktop/123/pdf" //转出文件的路径
fileType := "pdf"
osName := runtime.GOOS //获取系统类型
switch osName {
case "darwin": //mac系统
command := "/Applications/LibreOffice.app/Contents/MacOS/soffice"
pdfFile, err := FuncDocs2Pdf(command, fileSrcPath, outPath, fileType)
if err != nil {
println("转化异常:", err.Error())
}
fmt.Println("转化后的文件:", pdfFile)
case "linux":
command := "libreoffice7.3"
pdfFile, err := FuncDocs2Pdf(command, fileSrcPath, outPath, fileType)
if err != nil {
println("转化异常:", err.Error())
}
fmt.Println("转化后的文件:", pdfFile)
case "windows":
command := "soffice libreoffice" // 因为没有windows机器需要自己测试下这个命令行
pdfFile, err := FuncDocs2Pdf(command, fileSrcPath, outPath, fileType)
if err != nil {
println("转化异常:", err.Error())
}
fmt.Println("转化后的文件:", pdfFile)
default:
fmt.Println("暂时不支持的系统转化:" + runtime.GOOS)
}
}
/**
*@tips libreoffice 转换指令:
* libreoffice6.2 invisible --convert-to pdf csDoc.doc --outdir /home/[转出目录]
*
* @function 实现文档类型转换为pdf或html
* @param command:libreofficed的命令(具体以版本为准);win:soffice; linux:libreoffice6.2
* fileSrcPath:转换文件的路径
* fileOutDir:转换后文件存储目录
* converterType:转换的类型pdf/html
* @return fileOutPath 转换成功生成的文件的路径 error 转换错误
*/
func FuncDocs2Pdf(command string, fileSrcPath string, fileOutDir string, converterType string) (fileOutPath string, error error) {
//校验fileSrcPath
srcFile, erByOpenSrcFile := os.Open(fileSrcPath)
if erByOpenSrcFile != nil && os.IsNotExist(erByOpenSrcFile) {
return "", erByOpenSrcFile
}
//如文件输出目录fileOutDir不存在则自动创建
outFileDir, erByOpenFileOutDir := os.Open(fileOutDir)
if erByOpenFileOutDir != nil && os.IsNotExist(erByOpenFileOutDir) {
erByCreateFileOutDir := os.MkdirAll(fileOutDir, os.ModePerm)
if erByCreateFileOutDir != nil {
fmt.Println("File ouput dir create error.....", erByCreateFileOutDir.Error())
return "", erByCreateFileOutDir
}
}
//关闭流
defer func() {
_ = srcFile.Close()
_ = outFileDir.Close()
}()
//convert
cmd := exec.Command(command, "--invisible", "--language=zh-CN", "--convert-to", converterType,
fileSrcPath, "--outdir", fileOutDir)
byteByStat, errByCmdStart := cmd.Output()
//命令调用转换失败
if errByCmdStart != nil {
return "", errByCmdStart
}
//success
fileOutPath = fileOutDir + "/" + strings.Split(path.Base(fileSrcPath), ".")[0]
if converterType == "html" {
fileOutPath += ".html"
} else {
fileOutPath += ".pdf"
}
fmt.Println("文件转换成功...", string(byteByStat))
return fileOutPath, nil
}
参考文章: