项目中有一个在线上传并预览实验报告的需求,因为项目部署在ubuntu上面,所以借助libreoffice实现word转pdf,然后使用pdf.js在线预览pdf文档.
Python里面调用libreoffice转换Word->pdf的方法:
subprocess.call(
'export HOME=/home/luces; timeout 120s lowriter --headless --convert-to pdf "{}"'.format(self.src) + ' --outdir "{}"'.format(
self.dest), shell=True)
timeout 120s是转换超时时间,设置原因是libreoffice转换失败并不会主动退出,而是卡住,导致系统很慢.
export HOME=/home/luces;这句话是因为项目部署在容器里面的时候,默认的系统操作用户时root,而我们的项目的用户并不是,会导致转换失败.
--outdir的作用是指定转换出来的pdf存放目录.
在转换文档格式的时候遇到错误,转换中文格式乱码,linux下缺乏中文字体.我的解决办法如下:
我们把Windows下的字体C:\Windows\Fonts下的宋体,即simsun.ttc复制到当前用户的主文件下。
以打开终端:
sudo cp simsun.ttc /usr/share/fonts
cd /usr/share/fonts
修改权限
sudo chmod 644 simsun.ttc
更新字体缓存:
sudo fc-cache -fv
但是,这样会破坏系统的默认字体设置,特别是Ubuntu,由于宋体的优先级高于文泉驿,系统会优先抓取宋体,默认漂亮的光滑矢量字体会变成点矩阵的宋体。怎么办?
2.最完美的方案:
Linux是多用户的,但是我们自己的电脑通常只用一个普通用户,so,我们只需让字体对自己生效就行了,这样不会破坏系统字体设置。
打开主文件夹
按Ctrl+H显示隐藏文件夹,打开.libreoffice (也有的在.confing/libreoffice,比如ubuntu 12.04)
依次进入到3/user,新建文件夹fonts
然后把字体复制到fonts这个文件夹下即可.(这一部分来自https://blog.csdn.net/frylion/article/details/8207259)
在线预览pdf,能够使用pdf.js,但是最简单的办法时使用pdf文件夹自带的viewers.html.使用方法如下:
<iframe name="myframe" src="/site_media/static/expt_report/js/pdf/generic/web/viewer.html?file={{pdf_path}}" width="100%" height="800"></iframe>
这样就实现在线预览pdf了,并且效果也很好.
还有一点,libreoffice不支持并发,所以当两个文件同时转换的时候会出问题,因此在对文件转换时需要加锁.我现在是对某个文件进行加锁.处理完成释放锁
项目在Ubuntu上使用LibreOffice进行Word到PDF转换时遇到中文乱码问题,通过复制Windows宋体字体到Linux系统并调整字体路径解决了此问题。同时,为防止LibreOffice并发转换问题,引入文件锁定机制。最终实现在线预览PDF文档,使用pdf.js或内置viewer.html。

193

被折叠的 条评论
为什么被折叠?



