pdf 轉 word

HaimaBlog發表於2023-04-25

pdf 轉 word

一、思路

  1. 直接呼叫LibreOffice 命令進行文件轉換的命令列工具
    使用的前系統中必須已經安裝了
  • libreoffice
  • libreoffice已翻譯的使用者介面語言包: 中文 (簡體)
  • libreoffice離線幫助文件: 中文 (簡體)
  • 上傳字型

重點:
重點:
重點:

親測 7.1.8版本pdf 轉word後正常 ,
7.4.6版本轉出來的樣式有問題,都擠在一頁,重疊在一起。

二、軟體安裝下載

1. windows安裝

https://zh-cn.libreoffice.org/download/libreoffice/
a.安裝
直接一鍵預設安裝
環境變數:在path前加入libreoffice安裝路徑(如:D:\Program Files\LibreOffice\program)

進入dos視窗輸入soffice 如果彈出libreoffice介面則表示安裝成功

b. 中文包
另外再下載安裝下以中文包,此處略過

  • libreoffice已翻譯的使用者介面語言包: 中文 (簡體)
  • libreoffice離線幫助文件: 中文 (簡體)

soffice --infilter="writer_pdf_import" --convert-to doc 11種繞過CDN查詢真實IP 方法.pdf 2>&1

2 certos7版本安裝

    1. CentOS系統環境:
[root@localhost ~]# cat   /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
## 下載下面三個包
wget https://downloadarchive.documentfoundation.org/libreoffice/old/7.1.8.1/rpm/x86_64/LibreOffice_7.1.8.1_Linux_x86-64_rpm.tar.gz
wget https://downloadarchive.documentfoundation.org/libreoffice/old/7.1.8.1/rpm/x86_64/LibreOffice_7.1.8.1_Linux_x86-64_rpm_helppack_zh-CN.tar.gz
wget https://downloadarchive.documentfoundation.org/libreoffice/old/7.1.8.1/rpm/x86_64/LibreOffice_7.1.8.1_Linux_x86-64_rpm_langpack_zh-CN.tar.gz
    1. 解壓並安裝
## 主包
tar -xvf LibreOffice_7.1.8.1_Linux_x86-64_rpm.tar.gz
yum install ./LibreOffice_7.1.8.1_Linux_x86-64_rpm/RPMS/*.rpm -y

## 已翻譯的使用者介面語言包: 中文 (簡體)
tar -xvf LibreOffice_7.1.8.1_Linux_x86-64_rpm_langpack_zh-CN.tar.gz
yum install ./LibreOffice_7.1.8.1_Linux_x86-64_rpm_langpack_zh-CN/RPMS/*.rpm -y

## 離線幫助文件: 中文 (簡體)
tar -xvf LibreOffice_7.1.8.1_Linux_x86-64_rpm_helppack_zh-CN.tar.gz
yum install ./LibreOffice_7.1.8.1_Linux_x86-64_rpm_helppack_zh-CN/RPMS/*.rpm -y

3. Debian 版本安裝

root@4f14d865967a:/# cat /etc/issue
Debian GNU/Linux 11 \n \l
wget https://downloadarchive.documentfoundation.org/libreoffice/old/7.1.8.1/deb/x86_64/LibreOffice_7.1.8.1_Linux_x86-64_deb.tar.gz
wget https://downloadarchive.documentfoundation.org/libreoffice/old/7.1.8.1/deb/x86_64/LibreOffice_7.1.8.1_Linux_x86-64_deb_helppack_zh-CN.tar.gz
wget https://downloadarchive.documentfoundation.org/libreoffice/old/7.1.8.1/deb/x86_64/LibreOffice_7.1.8.1_Linux_x86-64_deb_langpack_zh-CN.tar.gz
    1. 解壓並安裝
## 主包
tar -xvf LibreOffice_7.1.8.1_Linux_x86-64_deb.tar.gz
dpkg -i LibreOffice_7.1.8.1_Linux_x86-64_deb/DEBS/*.deb

## 離線幫助文件: 中文 (簡體)
tar -xvf LibreOffice_7.1.8.1_Linux_x86-64_deb_helppack_zh-CN.tar.gz
dpkg -i  LibreOffice_7.1.8.1_Linux_x86-64_deb_helppack_zh-CN/DEBS/*.deb

## 已翻譯的使用者介面語言包: 中文 (簡體)
tar -xvf LibreOffice_7.1.8.1_Linux_x86-64_deb_langpack_zh-CN.tar.gz
dpkg -i LibreOffice_7.1.8.1_Linux_x86-64_deb_langpack_zh-CN/DEBS/*.deb
    1. 使用幫助
      測試是否安裝成功:
    libreoffice7.1 -help (根據使用的版本自己調整命令版本號)
    
    1. 檢視版本
[root@localhost testPdf2word]# libreoffice7.1 -version
Warning: -version is deprecated.  Use --version instead.
LibreOffice 7.1.8.1 e1f30c802c3269a1d052614453f260e49458c82c

4. 安裝字型

安裝字型是為了防止中文亂碼問題處理

1:檢視fonts目錄:cat /etc/fonts/fonts.conf | grep fon
得知字型存放位置:/usr/share/fonts

[root@localhost Fonts]# cat /etc/fonts/fonts.conf | grep fon
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<!-- /etc/fonts/fonts.conf file to configure system font access -->
<fontconfig>
        problems to the fontconfig bugzilla system located at fontconfig.org
        Note that the normal 'make install' procedure for fontconfig is to
        replace any existing fonts.conf file with the new version.  Place
        <dir>/usr/share/fonts</dir>
        <dir>/usr/share/X11/fonts/Type1</dir> <dir>/usr/share/X11/fonts/TTF</dir> <dir>/usr/local/share/fonts</dir>
        <dir prefix="xdg">fonts</dir>
        <dir>~/.fonts</dir>
        <cachedir>/usr/lib/fontconfig/cache</cachedir>
        <cachedir prefix="xdg">fontconfig</cachedir>
        <cachedir>~/.fontconfig</cachedir>
</fontconfig>

2: 新建/usr/share/fonts/Fonts資料夾
mkdir /usr/share/fonts/Fonts

3:把Windows下的字型C:\Windows\Fonts下的宋體,即 simsun.ttc上傳到linux伺服器 /usr/share/fonts/Fonts/ 路徑下即可

[root@localhost Fonts]# ll
總用量 17788
-rw-r--r--. 1 root root 18214472 4月  21 09:39 SIMSUN.TTC

4: 檢視剛指定的字型

[root@localhost Fonts]# fc-list :lang=zh
/usr/share/fonts/Fonts/SIMSUN.TTC: 新宋體,NSimSun:style=常規,Regular
/usr/share/fonts/Fonts/SIMSUN.TTC: 宋體,SimSun:style=常規,Regular

5:至此安裝成功

三、實現PDF轉word文件

pdfword 2003

引數說明
## --outdir為 輸出目標
## --convert-to 轉換格式

libreoffice7.1 --infilter="writer_pdf_import" --convert-to doc ip.pdf --outdir ./ 2>&1

pdfword 2007

libreoffice7.1 --infilter="writer_pdf_import" --convert-to docx ip.pdf --outdir ./ 2>&1

四、製作自己的映象

  1. 執行容器 基於cypress/browsers
    docker run --name=browsers -itd cypress/browsers

  2. 進入容器安裝 LibreOffice_7.1.8.1軟體
    進入browsers容器 使用上面的Debian 版本安裝方式安裝好

  3. 打包映象
    docker commit 4f14d865967a 10.10.11.145:8082/cypress/browsers_libreoffice7.1:latest

  4. 檢視打好映象

[root@cert-admin-api-service ~]# docker images | grep browsers_libreoffice7.1
10.10.11.145:8082/cypress/browsers_libreoffice7.1                  latest                                                   5d2e6f5dc95b   3 minutes ago   3.34GB

  1. 登入映象倉庫
    sudo docker login 127.0.0.1:8082 -u 使用者名稱 -p 密碼

6.推送到映象倉庫

docker push 127.0.0.1:8082/cypress/browsers_libreoffice7.1:latest

五、遇到的坑

1. 版本問題

親測 7.1.8版本pdf 轉word後正常 ,
7.4.6版本轉出來的樣式有問題,都擠在一頁,重疊在一起。
image

解決方法:
安裝7.1.8版本
安裝7.1.8版本
安裝7.1.8版本

2. 字型重疊問題

image

解決方法

為因是 html 轉的 pdf ,然後再用 pdf 轉為 word
出現字型重疊問題,是因為使用粗體導致,所以 html css 樣式不要使用
font-weight: bold;

六、go程式碼實現

使用 golang 執行 cmd 命令,呼叫 libreoffice7,實現 pdfword

/*
  引數說明
  ## --outdir 為 輸出目資料夾路徑
  ## --convert-to 轉換格式 例 doc  / docx  /pdf

  sourcePdfPath pdf原始檔路徑 例 staitc/download/ip.pdf
  createWordPath 生成的word資料夾路徑 例 static/download
  /usr/local/bin/libreoffice7.1 --infilter="writer_pdf_import" --convert-to doc staitc/download/ip.pdf --outdir staitc/download 2>&1
*/
//Pdf2Word pdf 轉 word

func Pdf2Word(sourcePdfPath, createWordDirPath string) (filePath string, err error) {
	argStr := fmt.Sprintf(`libreoffice7.1 --infilter="writer_pdf_import" --convert-to doc %s --outdir %s`, sourcePdfPath, createWordDirPath)
	cmd := exec.Command("/bin/sh", "-c", argStr)
	log.Println("cmd:-->", cmd.String())

	// 方法一
	//stderr, err := cmd.StderrPipe()
	//if err != nil {
	//	log.Println("stderr1:-->", err.Error())
	//	return
	//}
	//stdout, err := cmd.StdoutPipe()
	//if err != nil {
	//	log.Println("stderr2:-->", err.Error())
	//	return
	//}
	//if err = cmd.Start(); err != nil {
	//	log.Println("stderr3:-->", err.Error())
	//	return
	//}
	//outErr, err := io.ReadAll(stderr)
	//if err != nil {
	//	log.Println("stderr4:-->", err.Error())
	//	return
	//}
	//out, err := io.ReadAll(stdout)
	//if err != nil {
	//	log.Println("stderr5:-->", err.Error())
	//	return
	//}
	//if err = cmd.Wait(); err != nil {
	//	log.Println("stderr6:-->", err.Error())
	//	return
	//}
	//log.Printf("Result: %s, outErr: %s; /n", out, outErr)

	// 方法二
	var out bytes.Buffer
	var stderr bytes.Buffer
	cmd.Stdout = &out
	cmd.Stderr = &stderr
	err = cmd.Run()
	//log.Println("cmd.Run() failed:", fmt.Sprint(err)+": "+stderr.String())
	if err != nil {
		log.Println("cmd.Run() failed22:", fmt.Sprint(err)+": "+stderr.String())
		return
	}

	log.Println("pdf2Word success . Result: " + out.String())

	//獲取檔名帶字尾
	filenameWithSuffix := path.Base(sourcePdfPath)
	//獲取檔案字尾
	fileSuffix := path.Ext(filenameWithSuffix)
	//獲取檔名
	filenameOnly := strings.TrimSuffix(filenameWithSuffix, fileSuffix)
	filePath = createWordDirPath + "/" + filenameOnly + ".doc"

	return filePath, nil
}

參考相關文件:

linux安裝參考官網
https://zh-cn.libreoffice.org/get-help/install-howto/linux/
官網命令列說明
https://help.libreoffice.org/latest/zh-CN/text/shared/guide/convertfilters.html?DbPAR=SHARED#bm_id541554406270299

Libreoffice命令列實現office轉pdf(Windows、Linux)
https://blog.csdn.net/CheneyKing/article/details/122323156

Go語言中 如何實現PDF轉word文件 ?
https://zhuanlan.zhihu.com/p/619789117

3分鐘帶你透過 Go 語言實現 PDF 轉 Word!
https://baijiahao.baidu.com/s?id=1761721549111346526&wfr=spider&for=pc

相關文章