如何将ODT文件转换为PDF?

有人知道如何将一个ODT文件(LibreOffice)转换为PDF吗?

3相关(但不是重复!):如何将pdf文件转换为odt文件? - Eliah Kagan
7个回答

你也可以使用libreoffice的命令行来实现你的目的。这样可以批量转换文件,但也可以单个文件转换。以下示例将当前目录中的所有ODT文件转换为PDF:
libreoffice --headless --convert-to pdf *.odt

使用以下命令行选项获取更多信息:

man libreoffice

命令行使用的另一个理由是,比如在我的情况下,图形界面突然开始生成有缺陷的PDF文件,但命令行仍然像魔术般地运行良好。 - john-jones
6这个方法是有效的,但是有一个问题:如果图形用户界面(GUI)是打开的,命令将不会执行任何操作(甚至不会显示错误)。虽然不太美观,但通过以下解决方法,您可以打开一个新的实例:--env:UserInstallation=file:///path/to/some/directory - tokland
2@tokland:这个问题已经有一个错误报告了:https://bugs.freedesktop.org/show_bug.cgi?id=37531 - Mechanical snail
1我也成功地使用 unoconv 进行批量转换。例如,我使用了命令 unoconv -f pdf *.ppt - XavierStuvw
3对于那些想知道Unoconv与Libreoffice命令行的优缺点的人来说,这个问题可能会有所帮助:https://github.com/dagwieers/unoconv/issues/364 - Sebastien Lorber
4man 手册中对于 --convert-to 的说明是 "它意味着 --headless"。因此,libreoffice --convert-to pdf *.odt 也应该可以工作(至少对于版本 5.1.6.2)。 - Marten Koetsier
在Windows上,路径是C:\Program Files\LibreOffice\program,并且命令是soffice --headless --convert-to pdf *.odt - user875234
很好。还适用于其他文件,比如 *.odg - end of rainbow

只需使用Libre Office打开文档,然后选择“导出为PDF...”即可。

enter image description here

对于命令行解决方案,可以使用unoconv来进行文件转换。
unoconv -f pdf mydocument.odt

注意:unoconv依赖于Libre Office。

3谢谢你提到unoconv,太棒了! - Boris Däppen
1对于那些想知道Unoconv和Libreoffice命令行之间的优缺点的人来说,这个问题可能会有所帮助:https://github.com/dagwieers/unoconv/issues/364 - Sebastien Lorber
@Takkat,unoconv在MacOS Sierra上似乎找不到libreoffice5的位置,它显示“unoconv:在您的系统上找不到合适的办公套件安装”,因此无法使用:( - SebMa

以下是关于“非GUI”方法的更多细节。
1.你不仅可以使用这种方法将ODT文件转换为PDF,还可以用于MS Word DOCX文件(只要LibreOffice能够处理特定的ODT文件),以及一般来说LibreOffice可以打开的所有文件类型。
2.我不认为有一个名为`libreoffice`的二进制文件,就像其他答案中提到的那样。然而,确实有一个`soffice(.bin)`的二进制文件,可以用来从命令行启动LibreOffice。它通常位于`/usr/lib/libreoffice/program/`目录下;很多情况下,符号链接`/usr/bin/soffice`指向该位置。
3.然后,在大多数情况下,参数`--headless --convert-to pdf`是不够的。应该使用以下参数:
`--headless --convert-to pdf:writer_pdf_Export`
确保严格按照这个大小写规则来。
4.接下来,如果系统上已经有一个正在运行的LibreOffice图形界面实例,该命令将无法工作。这是由于2011年以来已知的错误#37531导致的。在命令中添加以下额外的参数:
` "-env:UserInstallation=file:///tmp/LibreOffice_Conversion_${USER}"`
这将创建一个新的独立环境,可以被第二个无头LO实例使用,而不会干扰可能由同一用户启动的第一个图形界面LO实例。
5.此外,确保你指定的`--outdir /pdf`目录存在,并且你对其具有写权限。或者,最好使用不同的输出目录。即使只是为了进行首次测试和调试:
`$ mkdir ${HOME}/lo_pdfs`
6.因此,命令如下(以Mac OS X Yosemite 10.10.5上使用的LibreOffice v5.1.2.2为例,使用我特定的路径soffice,在Ubuntu上将会有所不同...)。在Debian Jessie 8.0上也可以工作(使用路径/usr/lib/libreoffice/program/soffice)。很抱歉,现在无法在Ubuntu上进行测试...
``` /path/to/soffice \ --headless \ "-env:UserInstallation=file:///tmp/LibreOffice_Conversion_${USER}" \ --convert-to pdf:writer_pdf_Export \ --outdir ${HOME}/lo_pdfs \ /path/to/test.docx ```
这对我来说在Mac OS X上运行良好,使用的是LibreOffice v5.1.2.2(使用我特定的二进制文件soffice的路径,在Ubuntu上将会有所不同...)。它还在Debian Jessie 8.0上工作(使用路径/usr/lib/libreoffice/program/soffice)。很抱歉,现在无法在Ubuntu上进行测试...
7.如果尝试处理DOCX时一切都无法工作,可能是你尝试使用的特定DOCX文件的问题...因此,请首先创建一个非常简单的自己的DOCX文档。使用LibreOffice本身完成这个操作。在一张空白页上写上"Hello World!",然后保存为DOCX格式。
8.再试一次。用这个简单的DOCX文件可以工作吗? 9.如果还是不起作用,请重复步骤7,但这次保存为ODT格式。
10.重复步骤8,但确保这次引用的是ODT文件。
11.最后:对sofficesoffice.binlibreoffice使用完整路径,并带上-h参数运行每个命令:
```

值得一提的是,tdf bug 37531 已被标记为解决/修复。 - myrdd

我正在添加一个新答案,因为最近一系列新的转换路径由Pandoc开启,使其能够读取ODT文件。

当Pandoc读取文件格式时,它将其转换为内部格式,即"本地"(一种JSON形式)。

从其本机形式,它可以将文档导出为一整套其他格式。不仅包括PDF,还有DocBook、HTML、EPUB、DOCX、ASCIIdoc、DokuWiki、MediaWiki等等...

由于这里期望的输出格式是PDF,我们有另一种选择不同路径,由Pandoc称之为pdf-engine提供。以下是当前可用的PDF引擎列表(适用于Pandoc v2.7.2及更高版本 - 旧版本可能仅支持较小的列表):

  • pdflatex:这需要安装LaTeX和Pandoc。

  • xelatex:这需要安装XeLaTeX和Pandoc(也可作为通用TeX发行版的附加包安装)。

  • context:这需要安装ConTeXt和Pandoc;ConTeXt可作为大多数通用TeX发行版的附加包安装。

  • lualatex:这需要安装LuaTeX和Pandoc(也可作为通用TeX发行版的附加包安装)。

  • pdfroff:这需要安装GNU Roff和Pandoc。

  • wkhtml2pdf:这需要安装wkhtmltopdf和Pandoc。

  • prince:这需要安装PrinceXML和Pandoc。

  • weasyprint:这需要安装weasyprint和Pandoc。

现在有一些更多和更新的PDF引擎已经集成到Pandoc中,我自己还没有使用过,并且目前无法详细描述:tectoniclatexmk警告:不要期望您原始文档的外观在所有PDF输出中与ODT的打印预览或PDF导出完全相同!Pandoc在转换时不保留布局,它保留内容结构:段落仍然是段落,强调的词仍然是强调的,标题仍然是标题等等。但整体外观可能会发生较大变化。
示例命令: pdflatex:
 pandoc -f odt -o mydoc.pdf mydoc.odt --pdf-engine=pdflatex

XeLaTeX:

 pandoc -f odt -o mydoc.pdf mydoc.odt --pdf-engine=xelatex

LuaLaTeX:

 pandoc -f odt -o mydoc.pdf mydoc.odt --pdf-engine=lualatex

ConTeXt:

 pandoc -f odt -o mydoc.pdf mydoc.odt --pdf-engine=context

GNU troff:

 pandoc -f odt -o mydoc.pdf mydoc.odt --pdf-engine=pdfroff

wkhtmltopdf:

 pandoc -f odt -o mydoc.pdf mydoc.odt --pdf-engine=wkhtml2pdf

PrinceXML:
 pandoc -f odt -o mydoc.pdf mydoc.odt --pdf-engine=prince

weasyprint:
 pandoc -f odt -o mydoc.pdf mydoc.odt --pdf-engine=weasyprint

以上命令是转换的最基本操作。根据您选择的PDF引擎,可能还有许多其他选项可用于控制输出PDF文件的外观。例如,以下附加参数可以添加到所有通过LaTeX进行路由的路径中:
 -V geometry:"paperwidth=23.3cm, paperheight=1000pt, margin=11.2mm, top=2cm"

将使用自定义页面大小(略大于DIN A4),顶边缘边距为2cm,其余三个边的边距为1.12cm)。


请检查从顶部开始的第四段。它似乎不完整。 - DK Bose
@DKBose:谢了,搞定了。 - Kurt Pfeifle

鹦鹉螺脚本

该脚本利用LibreOffice将与LibreOffice兼容的文件转换为PDF格式。

#!/bin/bash
## PDFconvert 0.1
## by Glutanimate (https://askubuntu.com/users/81372/)
## License: GPL 3.0
## depends on python, libreoffice
## Note: if you are using a non-default LO version (e.g. because you installed it 
## from a precompiled package instead of the official repos) you might have to change
## 'libreoffice' according to the version you're using, e.g. 'libreoffice3.6'

# Get work directory
base="`python -c 'import gio,sys; print(gio.File(sys.argv[1]).get_path())' $NAUTILUS_SCRIPT_CURRENT_URI`"

#Convert documents
while [ $# -gt 0 ]; do
    document=$1
    libreoffice --headless --invisible --convert-to pdf --outdir "$base" "$document" 
    shift

done

安装说明请参见此处:如何安装Nautilus脚本?

2我只是希望OSX也能有类似于"lipreoffice"这样的功能。有时候,当我不得不使用Mac时,感觉我的手有点短。 - Léo Léopold Hertz 준영

注意:当我意识到unoconv无法很好地处理psw文件,并且不能成功将其转换为其他格式时,我决定删除我的回答from this question并在这里发布一个修改过的版本。docxxlsx格式可能也会存在问题。
然而,Libreoffice完全支持许多文件类型; 官方网站提供了完整文档,详细介绍了有效的输入和输出格式。
您可以使用命令行libreoffice转换工具或unoconv,后者可在存储库中获得。我发现unoconv非常有用,并且可能是您想要的工具。尽管Takkat简要提到了unoconv,但我认为给出一些更多细节和批量转换的一行命令会很有用。
使用终端,您可以cd到包含您的文件的目录,然后通过运行如下的一行命令进行批量转换:
for f in *.odt; do unoconv -f pdf "${f/%pdf/odt}"; done

(这个一行代码是我修改的翻译脚本,详见此答案。)

如果您以后想使用其他文件格式,只需将odtpdf替换为任何其他支持的输入和输出格式。您可以通过输入unoconv -f odt --show来查找文件类型的支持格式。要转换单个文件,请使用例如unoconv -f pdf myfile.odt

有关该程序的更多信息和选项,请在终端中输入man unoconv或访问Ubuntu manpages online


另一个Nautilus脚本

这个非常简单且轻量级的Nautilus脚本使用unoconv将选定的文件转换为与LibreOffice兼容的PDF格式:

#!/bin/sh
#Nautilus Script to convert selected LibreOffice-compatible file(s) to PDF
#
OLDIFS=$IFS
IFS="
"
for filename in $@; do
unoconv --doctype=document --format=pdf "$filename"
done
IFS=$OLDIFS