并行文档转换 ODT > PDF LibreOffice

15 投票
6 回答
11472 浏览
提问于 2025-04-17 17:17

我正在把几百个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 能导出的任何文件格式。

撰写回答