python转换各类型文档为pdf 源码 docker镜像

由于工作需要,需要将各个类型的文档(word、ppt、excel和txt)转换为pdf以便于前端展示和后一步处理,尝试了在镜像中转换各类文档为pdf。

unoconv转换word、ppt、excel为pdf

这里使用的是最常用的unoconv工具。本身很简单,只需要unoconv -f pdf [filename] 就可以实现文档的转换。因为底层用的是openoffice,所以除了安装unocov 还需要安装openoofice相关软件。
执行文档转换需要有一个listener,所以需要保持unoconv --listener运行或者 nohup unoconv --listener >/dev/null 2>&1 &

yum install unoconv openoffice.org-headless openoffice.org-writer openoffice.org-calc openoffice.org-impress -y

可能字体缺失、还需要安装中文字体,不然转换出来可能是满屏的方框。

yum install mkfontscale fontconfig -y && \
    mkdir /usr/share/fonts/chinese && \
    cp /tmp/simsun.ttf /usr/share/fonts/chinese && \
    mkfontscale && \
    mkfontdir && \
    fc-cache -fv && \
    source /etc/profile

打包容器时由于centos官方镜像的问题,还需要执行 rpm --rebuilddb 来重建数据库,不然会安装出错。

pdfkit转换txt为pdf

unoconv不支持txt格式直接转换为pdf。一般txt转pdf是使用pdfkit(底层使用wkhtmltopdf)来转换,此处注意在ssh或着某些无显示窗口的环境下还需要使用虚拟桌面来执行命令。具体

yum install  wkhtmltopdf xorg-x11-server-Xvfb -y
pip install pdfkit
mv  /usr/bin/wkhtmltopdf /usr/bin/wkhtmltopdfnew
printf '#!/bin/bash\nxvfb-run --server-args="-screen 0, 1024x768x24" /usr/bin/wkhtmltopdfnew --quiet --page-size Letter --margin-top 0.75in --margin-right 0.75in --margin-bottom 0.75in --margin-left 0.75in --encoding UTF-8  -q $*' > /usr/bin/wkhtmltopdf.sh
chmod a+x /usr/bin/wkhtmltopdf.sh
ln -s /usr/bin/wkhtmltopdf.sh /usr/bin/wkhtmltopdf
wkhtmltopdf www.baidu.com output.pdf

最终生成了百度首页的pdf但是生成文件中所有汉字为乱码。解决方式就是给系统添加中文支持(具体就是 ls能正常显示中文内容)。但是为了解决系统添加中文支持这个问题,我在官方centos镜像中进行了各种基于google和百度的尝试,最终没有找到很好的解决方法(如果你有的话,欢迎提供)。最终只能曲线救国。

python-docx+unoconv转换txt为pdf

应该是由于wkhtmltopdf和unoconv转换原理的差别,猜测wkhtmltopdf是利用屏幕渲染出txt再转换pdf,而unoconv直接利用openoffice在文件层面转换为pdf,所以wkhtmltopdf需要虚拟桌面,而unoconv不需要。最终笔者没能使用wkhtmltopdf,而转txt为docx再利用unoconv转docx为pdf。
具体python-docx生成docx的代码很简单。

document = Document()
document.styles['Normal'].font.name = u'宋体'
 document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
document.add_paragraph(content)
document.save('out_filename.docx')

之后再使用unoconv转换为pdf就行,大功告成。

代码

最终为了简便使用不影响我工程代码环境,我将这个功能打包为一个镜像,使用http接口来实现文件转换为pdf。具体项目地址挂在github上。(–_-- 名字还拼错了,请不要在意。)

最终效果

最终,将文件夹挂载在docker容器中,使用接口上传文件名,容器即可将 /data文件夹下的对应文件转换为pdf。这里由于centos本身没有添加中文支持,应该对中文文件名支持也是有问题的,具体没有测试。

猜你喜欢

转载自blog.csdn.net/lovoslbdy/article/details/102768959