并行文档转换 ODT > PDF LibreOffice
我正在把几百个ODT文件转换成PDF文件,但一个一个转换非常耗时间。我有一台多核的CPU。有没有办法用bash或python写个脚本,让这些转换同时进行呢?
有没有什么方法可以让使用命令行的libreoffice批量转换文件变得更快(我不太确定我用的词对不对)?
我一直在用python/bash调用以下命令:
libreoffice --headless --convert-to pdf *appsmergeme.odt
或者
subprocess.call(str('cd $HOME; libreoffice --headless --convert-to pdf *appsmergeme.odt'), shell=True);
谢谢!
Tim
6 个回答
1
既然作者已经提到Python是一个有效的答案:
import subprocess
import os, glob
from multiprocessing.dummy import Pool # wrapper around the threading module
def worker(fname, dstdir=os.path.expanduser("~")):
subprocess.call(["libreoffice", "--headless", "--convert-to", "pdf", fname],
cwd=dstdir)
pool = Pool()
pool.map(worker, glob.iglob(
os.path.join(os.path.expanduser("~"), "*appsmergeme.odt")
))
使用线程池而不是进程池,通过 multiprocessing.dummy
就足够了,因为真正的并行处理是通过 subprocess.call()
来创建新进程的。
我们可以直接设置命令和当前工作目录 cwd
。这样就不需要为每个文件都加载一个 shell
来完成这个操作。此外, os.path
让不同平台之间的操作变得更简单。
1
这个讨论或者回答有点老了。 我测试了 libreoffice 4.4,确认我可以同时运行多个 libreoffice。 看看我的脚本。
for odt in test*odt ; do
echo $odt
soffice --headless --convert-to pdf $odt &
ps -ef|grep ffice
done
4
你可以把 libreoffice 作为一个后台服务来运行。可以看看这个链接,也许对你有帮助:将 LibreOffice 服务转为后台运行
另外一个选择是使用 unoconv。unoconv 是一个命令行工具,可以把 OpenOffice 能导入的任何文件格式转换成 OpenOffice 能导出的任何文件格式。