在终端中使用 LibreOffice 从 Mac 命令将 HTML 转换为 PDF?

Posted

技术标签:

【中文标题】在终端中使用 LibreOffice 从 Mac 命令将 HTML 转换为 PDF?【英文标题】:Use LibreOffice to convert HTML to PDF from Mac command in terminal? 【发布时间】:2013-10-09 18:43:13 【问题描述】:

我正在尝试使用 Mac 终端将 html 文件转换为 PDF。

我发现了一个类似的帖子,我确实使用了他们提供的代码。但我一直一无所获。当我发出这个命令时,我没有在任何地方找到输出文件:

./soffice --headless --convert-to pdf --outdir /home/user ~/Downloads/*.odt

我使用的是 Mac OS X 10.8.5。

谁能给我看一个终端命令行,我可以用它来将 HTML 转换为 PDF 吗?

【问题讨论】:

为什么人们会否决这个问题 【参考方案1】:

我正在尝试使用 Mac 终端将 HTML 文件转换为 PDF。

好的,这是在 Mac 命令行上将 (X)HTML 转换为 PDF 的另一种方法。它根本不使用 LibreOffice,应该适用于所有 Mac。

此方法 (ab) 使用来自 Mac 打印子系统的过滤器,称为 xhtmltopdf。此过滤器通常不打算供最终用户使用,而仅供 CUPS 打印系统使用。

但是,如果您了解它,知道在哪里可以找到它并知道如何运行它,那么这样做就没有问题:

    首先要知道的是它不在任何桌面用户的$PATH 中。它位于/usr/libexec/cups/filter/xhtmltopdf

    要知道的第二件事是它需要特定的语法和参数顺序才能运行,否则不会。完全不带参数(或参数数量错误)调用它会发出一个小的使用提示

    $ /usr/libexec/cups/filter/xhtmltopdf
    
      Usage: xhtmltopdf job-id user title copies options [file]
    

这些参数名称中的大多数都清楚地表明该工具与打印有关。该命令总共需要至少 5 个参数,或者是可选的第 6 个参数。如果只给出了 5 个参数,它从<stdin> 中读取其输入,否则从第 6 个参数中读取一个文件名。它总是将其输出发送到<stdout>

我们感兴趣的唯一 CLI 参数是数字 5(“选项”)和(可选)数字 6(输入文件名)。

当我们在命令行上运行它时,我们必须先提供 5 个虚拟或空参数,然后才能输入输入文件的名称。我们还必须将输出重定向到 PDF 文件。

那么,让我们试试吧:

/usr/libexec/cups/filter/xhtmltopdf "" "" "" "" "" my.html > my.pdf

或者,或者(使用 5 个虚拟参数而不是 5 个空参数,这样可以更快地输入并且更容易检查完整性):

/usr/libexec/cups/filter/xhtmltopdf 1 2 3 4 5 my.html > my.pdf

当我们这样做时,我们可以尝试在输出上应用一些其他 CUPS 打印子系统过滤器:/usr/libexec/cups/filter/cgpdftopdf 看起来可能很有趣。与所有 CUPS 过滤器一样,此附加过滤器需要相同类型的参数编号和顺序。

所以这应该有效:

/usr/libexec/cups/filter/xhtmltopdf   1 2 3 4 5 my.html \
| /usr/libexec/cups/filter/cgpdftopdf 1 2 3 4 ""        \
  > my.pdf

然而,只有当我们尝试应用一些“打印选项”时,将xhtmltopdf 的输出通过管道传输到cgpdftopdf 才有意义。也就是说,我们需要在参数号中进行一些设置。 5 取得了一些成就。

查找 CUPS command line options on the CUPS web page 建议了一些候选人:

-o number-up=4 
-o page-border=double-thick 
-o number-up-layout=tblr 

看起来可以在进行 PDF 到 PDF 转换时应用它们。让我们试试吧:

/usr/libexec/cups/filter/xhtmltopdfcc 1 2 3 4 5 my.html        \
| /usr/libexec/cups/filter/cgpdftopdf 1 2 3 4 5                \
  "number-up=4 page-border=double-thick number-up-layout=tblr" \
   > my.pdf

这是我使用此方法获得的两个结果的屏幕截图。两者都用作输入文件两个相同的 HTML 文件,除了一行:它是引用用于呈现 HTML 的 CSS 文件的行。

如您所见,xhtmltopdf 过滤器在将其输入转换为 PDF 时能够(至少部分地)考虑 CSS 设置:

【讨论】:

【参考方案2】:

从 3.6.0.1 开始,您需要系统上的 unoconv 来转换文档。

在 MacOS X 中使用 unoconv

在 MacOS X 下使用 unoconv 需要 LibreOffice 3.6.0.1 或更高版本。这是第一个使用内部 python 脚本分发的版本。没有适用于 MacOS X 的 OpenOffice 版本(当前版本为 3.4)工作,因为必要的内部文件未包含在应用程序中。

【讨论】:

【参考方案3】:

我刚遇到同样的问题,但我找到了this LibreOffice help post。如果您也运行了 LibreOffice(通常的 GUI 版本),似乎无头模式将不起作用。解决方法是添加一个-env 选项,例如

libreoffice "-env:UserInstallation=file:///tmp/LibO_Conversion" \
             --headless \
             --invisible \
             --convert-to csv file.xls

【讨论】:

以上是关于在终端中使用 LibreOffice 从 Mac 命令将 HTML 转换为 PDF?的主要内容,如果未能解决你的问题,请参考以下文章

LibreOffice SDK:如何在 mac 中安装和配置 LibreOffice SDK

将终端的输出重定向到 libreoffice excel 文件

Libreoffice怎么安装

Mac OS X 上 LibreOffice GUI 中的默认系统字体错误

怎么把LibreOffice改成中文

LibreOffice 命令行 (soffice) 打印选项