Headless LibreOffice 在 Windows 上导出为 PDF 非常慢(比 Linux 慢 6 倍)

2023-12-02

我经常需要使用 LibreOffice 将许多(> 1000).docx 文档导出为 PDF。这是一个示例文档:测试.docx。以下代码可以工作,但在 Windows 上速度相当慢(每个 PDF 文档平均 3.3 秒):

import subprocess, docx, time   # first do: pip install python-docx 
for i in range(10):
    doc = docx.Document('test.docx')
    for paragraph in doc.paragraphs:
        paragraph.text = paragraph.text.replace('{{num}}', str(i))
    doc.save('test%i.docx' % i)   # these 4 previous lines are super fast - a few ms
    t0 = time.time()
    subprocess.call(r'C:\Program Files\LibreOffice\program\soffice.exe --headless --convert-to pdf test%i.docx --outdir . --nocrashreport --nodefault --nofirststartwizard --nolockcheck --nologo --norestore"' % i)
    print('PDF generated in %.1f sec' % (time.time()-t0))

    # for linux:
    # (0.54 seconds on average, so it's 6 times better than on Windows!)
    # subprocess.call(['/usr/bin/soffice', '--headless', '--convert-to', 'pdf', '--outdir', '/home/user', 'test%i.docx' % i])  

如何在 Windows 上加快 PDF 导出速度?

我怀疑浪费了很多时间"Start LibreOffice/Writer, (do the job), Close LibreOffice" "Start LibreOffice/Writer, (do the job), Close LibreOffice" "Start LibreOffice/Writer, (do the job), Close LibreOffice" etc.

Notes:

  • 作为比较:这里:https://bugs.documentfoundation.org/show_bug.cgi?id=92274据说导出时间为 90ms 或 810ms。

  • soffice.exe取而代之swriter.exe:同样的问题:平均3.3秒

    subprocess.call(r'C:\Program Files\LibreOffice\program\swriter.exe --headless --convert-to pdf test%i.docx --outdir ."' % i)
    

事实上,所有时间都浪费在启动/退出 LibreOffice 上。我们可以传递许多 docx 文档一通电话 of soffice.exe:

import subprocess, docx
for i in range(1000):
    doc = docx.Document('test.docx')
    for paragraph in doc.paragraphs:
        paragraph.text = paragraph.text.replace('{{num}}', str(i))
    doc.save('test%i.docx' % i)

# all PDFs in one pass:
subprocess.call(['C:\Program Files\LibreOffice\program\swriter.exe', 
    '--headless', '--convert-to', 'pdf', '--outdir', '.'] + ['test%i.docx' % i for i in range(1000)])

总共 107 秒,因此每个 PDF 平均需要约 107 毫秒,要好得多!

Notes:

  • 它不适用于 10,000 个文档,因为命令行参数的长度将超过 32k 个字符,如下所示在这里解释

  • 我想知道是否可以有一种更具交互性的方式来使用 LibreOffice headless:

    • 开始作家无头,保持开始
    • 发送一个类似的动作open test1.docx到这个过程
    • 发送动作export to pdf,然后关闭 docx
    • send open test2.docx,然后导出等
    • ...
    • 退出无头作家

       

    这适用于 MS Office 的 COM(组件对象模型):使用 python 将 .doc 转换为 pdf但我想知道 LibreOffice 是否存在类似的东西。答案似乎是否定的:LibreOffice/OpenOffice是否支持COM模型

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Headless LibreOffice 在 Windows 上导出为 PDF 非常慢(比 Linux 慢 6 倍) 的相关文章

随机推荐

  • 如何在 SQL 中抑制或隐藏重复值?

    我已经四处寻找了一下 但还没有找到如何做到这一点 尽管已经找到了很多关于分析其性能的信息 我想执行一个选择 它返回几列数据 然后还返回另一个表中相关行的嵌套表 实际上是同一个表本身连接 但我 认为 这是不相关的 所以数据是这样的 id na
  • WPF 和初始焦点

    似乎当 WPF 应用程序启动时 没有任何东西具有焦点 这实在是太奇怪了 我使用过的所有其他框架都符合您的预期 将初始焦点放在 Tab 键顺序中的第一个控件上 但我已经确认它是 WPF 而不仅仅是我的应用程序 如果我创建一个新窗口 然后在其中
  • 在 Python 中对正则表达式执行 WebDriverWait() 或类似检查

    我希望能够执行类似于WebDriverWait i e WebDriverWait driver 60 until expected conditions text to be present in element By XPATH tr
  • Android Studio 和 AdMob -- 无法实例化以下类

    我一直在尝试在我的应用程序中使用 AdMob 横幅广告 但不断收到错误消息 无法实例化以下类 com google android gms ads AdView java lang VerifyError Expecting a stack
  • 如何摆脱android全屏模式下的顶部褪色边缘?

    通过将以下两行代码放入activity OnCreate中 我可以获得全屏视图 requestWindowFeature Window FEATURE NO TITLE getWindow setFlags WindowManager La
  • 字符串资源文件中的格式语句

    我在通常的 strings xml 资源文件中定义了字符串 如下所示
  • 将 Excel 工作表添加到工作簿末尾

    我正在尝试将 Excel 工作表添加到工作簿的末尾 保留第一个工作表作为摘要 import win32com client Excel win32com client DispatchEx Excel Application Book Ex
  • Java 到 JSP - 如何将 Java 应用程序集成到 JSP 网页中?

    好吧 这肯定是今天最简单的问题了 这是我第一次尝试 Java 和 JSP 我刚刚使用 Eclipse 编写了一个小型 Java 应用程序 现在我想将这个小应用程序提供到网页中 我需要弄清楚Java应用程序和网页之间的联系 这是我的申请 pu
  • Putty - 使用 C# 动态删除文件

    我正在开发一个使用 C 作为编程语言的 Windows 应用程序 要求是 动态登录putty 从特定位置删除旧文件 我目前正在使用下面的代码登录 Putty 但如何运行删除命令 string hostname hostname string
  • Plotly:更新菜单的按钮实际上是如何工作的?

    我为什么想知道 这似乎是一个非常简单的问题 但我在使用下拉菜单编辑具有多个轨迹的图形时遇到了一些困难 所以我真的很渴望确保我理解plotlys下拉菜单 更新菜单和按钮的内部工作原理100 正确 因此 如果有人能抽出时间来看看下面的示例 那就
  • 使用 sscanf 读取带空格的字符串

    对于一个项目 我试图从字符串中读取一个 int 和一个字符串 唯一的问题是sscanf 似乎打破了阅读 s当它看到一个空格时 有什么办法可以绕过这个限制吗 这是我正在尝试做的一个例子 include
  • 反序列化不一致的 JSON 属性

    希望有人可以帮助我解决我尝试使用 Newtonsoft Json 反序列化的大型 JSON 文件中出现的以下不一致问题 对象的属性之一有时会显示为 roles field1 value field2 value 而其他时候 相同的属性显示为
  • Ionic Framework/Cordova 上的 Google 地图不适用于 Android 构建

    我一直在为一个应用程序编写代码来跟踪用户位置并使用谷歌地图显示它 我的代码在浏览器 Safari Firefox Chrome 中完美运行 但在移动设备 android 上根本不起作用 谷歌地图 API 不起作用 导航也不可靠 我是一个离子
  • Discord 机器人如何处理来自多个服务器的事件

    我正在为我的服务器使用discord py 重写分支 开发一个discord 机器人 我需要邀请该机器人到多个服务器并同时使用它 我的问题是 我是否需要为每台服务器设置一个新线程 或者机器人是否对事件进行排队并一一处理它们 如果它确实对它们
  • 将文件作为输入流加载的不同方法

    有什么区别 InputStream is this getClass getClassLoader getResourceAsStream fileName and InputStream is Thread currentThread g
  • 选择不同...内连接与选择...其中 id in (...)

    我正在尝试创建表的子集 作为物化视图 定义为在另一个物化视图中具有匹配记录的记录 例如 假设我有一个包含 user id 和 name 列的用户表 以及一个包含entry id user id activity 和 timestamp 列的
  • Google BigQuery 中的多级数据透视

    是否可以使用 BigQuery 在一个查询中执行以下数据透视 或者我需要将其分解为多个查询 这是原始数据 这是数据透视表 有没有办法在 BigQuery 中构造任意嵌套的数据透视表 或者每个级别都需要自己的 SQL 查询吗 请注意 在上面
  • namespace myspace { int x } 现在为什么 `myspace::x=3;` 给出错误?

    Code include
  • 如何使用vb6检查当前键盘的语言?

    如何使用 vb6 检查当前键盘的语言 IF Is it the English language Then Msgbox EN End IF 我正在使用这个未经充分测试的片段 Private Const LOCALE SISO639LANG
  • Headless LibreOffice 在 Windows 上导出为 PDF 非常慢(比 Linux 慢 6 倍)

    我经常需要使用 LibreOffice 将许多 gt 1000 docx 文档导出为 PDF 这是一个示例文档 测试 docx 以下代码可以工作 但在 Windows 上速度相当慢 每个 PDF 文档平均 3 3 秒 import subp