一、背景
原先已经简单实现了excel,word,png,pdf合成一个整体pdf的过程。并将它弄到docker容器中。
1、原先入坑的技术栈
- php:7.4 (业务有涉及)
- php第三方包 setasign\Fpdi\Fpdi : 2.3.6 (pdf合并)
- libreoffice : 5.3.6.1
- ImageMagick: 6.9.10-68
2、原先存在的问题
- 合成的pdf中文只有宋体
- 合并部分pdf时,Fpdi版本过低,部分提示失败。
3、最后出坑的技术栈
- php:7.4 (业务有涉及)
- python: 3.6.8
- pypdf (python的包)
- libreoffice : 5.3.6.1
- ImageMagick: 6.9.10-68
二、入坑关键
libreoffice 是直接通过 yum install libreoffice 安装时缺少对中文包的关注
Fpdi对中文支持不友好,手动改了其他博主说的中文支持的改进,年久之后不知道如何升级版本
在执行 libreoffice 进行生成pdf时 缺少 --language=zh-CN 这个关键参数(主要是原先不了解libreoffice 有专门的语言包)
三、出坑过程
1、去除 setasign\Fpdi\Fpdi 改用python版的 pypdf
新增了一个merge_pdf.py的脚本
import argparse
from pypdf import PdfWriter
# 创建参数解析器
parser = argparse.ArgumentParser(description="Merge multiple PDF files into one.")
parser.add_argument("output_file", help="Specify the output merged PDF file name.")
parser.add_argument("input_files", nargs="+", help="Specify input PDF files to merge.")
args = parser.parse_args()
# 创建 PdfWriter 对象
merger = PdfWriter()
# 遍历输入的 PDF 文件进行合并
for pdf in args.input_files:
merger.append(pdf)
# 写入合并后的 PDF 文件
with open(args.output_file, "wb") as output_pdf:
merger.write(output_pdf)
print("PDF files merged successfully into", args.output_file)
使用时
python3 ./merge_pdf.py output.pdf input1.pdf input2.pdf input3.pdf
2、下载新版本的libreoffice
原本打算采用libreoffice24.2,但发现当前的centos不支持。只能选稳定的libreoffice7.6.6
去官网下载
Download LibreOffice | LibreOffice - Free Office Suite - Based on OpenOffice - Compatible with Microsoft
有了rpm包后把它们下到服务器上
3、安装libreoffice基础班及中文支持包
先开始基本包,进入RPMS目录,执行 rpm -Uvh *.rpm
再开始中文包,进入RPMS目录,执行 rpm -Uvh *.rpm
最后是帮助包,进入RPMS目录,执行 rpm -Uvh *.rpm
因为原先我有安装libreoffice的v5版本,所以当前存在2个版本的libreoffice
对它进行备份,并重命名新的版本为默认版本
查看版本 libreoffice --version (当然如果你想共存2个版本就用 libreoffice7.6 --version)
执行.docx转pdf,并输出到目录out_path
libreoffice --headless --invisible --language=zh-CN --convert-to pdf input.docx --outdir out_path
注意上面需要带 --language=zh-CN 因为之前就是忘记加这个才导致一直显示 宋体
4、安装字体(因为这个不是本篇的坑,所以这里稍微提一下)
一般到windows的c:\\windows\Fonts的文件中将中文字体的,打包放到centos中/usr/share/fonts/chinese中(chinese文件自己建一个)
记得清一次缓存
fc-cache -fv