LibreOffice 将 .docx 并行转换为 .pdf 效果不佳
LibreOffice convert .docx to .pdf in parallel not working well
我有很多docx文件要转换成pdf。将它们一一转换需要很长时间。所以我写了一个 python 脚本来并行转换它们:
from subprocess import Popen
import time
import os
os.chdir(os.path.dirname(__file__))
output_dir = './outputs'
source_file_format = './docs/example_{}.docx'
po_list = [Popen(
f"/Applications/LibreOffice.app/Contents/MacOS/soffice --invisible --convert-to pdf --outdir {output_dir} {source_file_format.format(i)}",
shell=True)
for i in range(0, 7, 1)]
while po_list:
time.sleep(0.01)
for i, p in enumerate(po_list):
status = p.poll()
if status is None:
continue
elif status == 0:
print('Succeed: [{}] {} -> {}'.format(p.returncode, p.stderr, p.args))
po_list.remove(p)
else:
print('Failed: {} : {}'.format(p.args, p.poll()))
po_list.remove(p)
但是每次我运行这个脚本,只有一部分docx文件转换成功。其余转换过程甚至不抛出任何错误信息。
我们也被困在同一个问题上有一段时间了。
LibreOffice 的多个实例共享同一个 space 使用 UserInstallation 目录,因此并行转换在这里造成了问题(间歇性进程似乎混淆了)。
为每个 libre 实例使用不同的目录有助于解决此问题。您可以通过 UserInstallation env 变量实现此目的,该变量可以传递为:"-env:UserInstallation=file:///d:/tmp/p0/"
您可以通过在目录中附加循环变量或任何唯一标识符来自动执行此操作。
我有很多docx文件要转换成pdf。将它们一一转换需要很长时间。所以我写了一个 python 脚本来并行转换它们:
from subprocess import Popen
import time
import os
os.chdir(os.path.dirname(__file__))
output_dir = './outputs'
source_file_format = './docs/example_{}.docx'
po_list = [Popen(
f"/Applications/LibreOffice.app/Contents/MacOS/soffice --invisible --convert-to pdf --outdir {output_dir} {source_file_format.format(i)}",
shell=True)
for i in range(0, 7, 1)]
while po_list:
time.sleep(0.01)
for i, p in enumerate(po_list):
status = p.poll()
if status is None:
continue
elif status == 0:
print('Succeed: [{}] {} -> {}'.format(p.returncode, p.stderr, p.args))
po_list.remove(p)
else:
print('Failed: {} : {}'.format(p.args, p.poll()))
po_list.remove(p)
但是每次我运行这个脚本,只有一部分docx文件转换成功。其余转换过程甚至不抛出任何错误信息。
我们也被困在同一个问题上有一段时间了。
LibreOffice 的多个实例共享同一个 space 使用 UserInstallation 目录,因此并行转换在这里造成了问题(间歇性进程似乎混淆了)。
为每个 libre 实例使用不同的目录有助于解决此问题。您可以通过 UserInstallation env 变量实现此目的,该变量可以传递为:"-env:UserInstallation=file:///d:/tmp/p0/"
您可以通过在目录中附加循环变量或任何唯一标识符来自动执行此操作。