问题描述
我试图使用命令行在我的Ubuntu服务器上将docx文件转换为pdf,但到目前为止我尝试过的转换器似乎都没有正确转换Word 2007/2010/2013文件。
显然,在线转换器可以毫无问题地管理它,但Web服务不是一种选择,因为文件包含敏感数据。对于测试,我使用this Word 2007 file,因为它包含一些重要元素(公式,矢量图形,图像,列表等)。我测试了以下工具(部分来自this post):
lowriter
(LibreOffice Writer) – 输出不正确(圆圈应该在最后一页,而不是第一页)
unoconv
– 与LibreOffice相同,因为它不使用自己的转换器。首先转换为odt然后转换为pdf将文件完全打开。
abiword --to=pdf filename.doc
– 错误和不完整(缺少许多元素):
OpenOffice Writer – 与abiword相同的结果
wvPDF
– 崩溃并显示以下错误消息:
~$ wvPDF 2007_Office_DocEncryption.docx test.pdf
Current directory: /home/webmt/dev/test/
Some problem running latex.
Check for Errors in test.log
Continuing…
Conversion into dvi failed
有没有办法在Linux上正确地将docx文件转换为PDF?如果我知道它适用于我已经提到的任何程序的人,它也会对我有所帮助。一旦SE让我,我会开始赏金。
附:我正在使用Ubuntu服务器12.04
结论:
我必须得出结论,至于我,就目前而言,没有可靠的工具可以使用新的MS Word格式及其在Ubuntu上的所有类型的元素,并创建一个one-to-one docx文件副本。我测试的所有工具都无法正确转换样本文件。由于我将面对非常不同类型的文档版本/内容并且输出质量具有最高优先级之一,因此我将最终通过连接到Linux的Windows服务器上的Word中的VB宏来执行转换。
我将设置帖子获得最佳结果作为接受的答案。但是,赏金是用于具有绝对正确转换的解决方案。再次感谢大家。
最佳解决方案
此答案通过了所有测试,但测试文档中的流程图为1。
sudo apt-get install unoconv
doc2pdf respondus-docx-sample-file.docx
到目前为止,为什么这比其他方法更好?
我已经测试了目前建议的其他方法(特别是oowriter
和ebook-convert
),但它们通过的测试次数少于此方法。 ebook-convert
方法从文档中剥离边距和部分文本。
这种方法甚至比专业转换器rainbowpdf产生更好的结果。
我也尝试将其转换为html,但是圆圈中的方块和流程图的绘图是不正确的。
为什么流程图测试失败?
似乎libreoffice和unoconv在正确呈现.docx文件中的流程图时遇到了一些问题。这可能是因为它是在Microsoft Office中使用智能艺术制作的。那就是问题所在。那就是a bug也在this thread上讨论过。正如您所见,文本和视觉信息存在于上述方法的pdf中(尽管我必须选择文本)。
例如,字体颜色未正确读取,某些行太长。我不知道任何能够正确显示智能艺术的Linux解决方案。 🙁
这也是为什么本页面上张贴的所有print
解决方案都不能满足您的原因。
简而言之
简而言之,你所做的事情真的很难,目前还没有完全可以满足你的解决方案。 docx2pdf转换的致命弱点是智能艺术。如果你可以没有它,或者如果你能找到一种方法来发现智能艺术并将其转换成图像,你就可以实现目标。
选项1.强制用户处理问题
这是一个非常不优雅的解决方案。您的内容创建者可以按照office help pages中的描述将其智能艺术保存为jpg,因此可以在您的服务器上进行转换。
选项2.解决问题
如果流程图通常非常相似,并且取决于您的开发者有多好,您可以尝试单独转换智能艺术。您可以从.docx文档集群中提取drawing1.xml文件,然后使用自然语言处理和一些疯狂的黑客来重建智能艺术。例如,你必须搞乱这种类型的xml:
<dsp:txBody>
<a:bodyPr spcFirstLastPara="0" vert="horz" wrap="square" lIns="8255" tIns="8255" rIns="8255" bIns="8255" numCol="1" spcCol="1270" anchor="ctr" anchorCtr="0">
<a:noAutofit/>
</a:bodyPr>
<a:lstStyle/>
<a:p>
<a:pPr lvl="0" algn="ctr" defTabSz="577850">
<a:lnSpc><a:spcPct val="90000"/>
</a:lnSpc>
<a:spcBef>
<a:spcPct val="0"/>
</a:spcBef>
<a:spcAft>
<a:spcPct val="35000"/>
</a:spcAft>
</a:pPr>
<a:r>
<a:rPr lang="en-US" sz="1300" b="1" kern="1200"/>
<a:t>All three sides are different lengths
</a:t>
</a:r>
</a:p>
</dsp:txBody>
或者作为一个最小的解决方案,你至少从文件extract文本(<a:t>
?)并以更简单的方式保存它。或者如果你的pdf的flow-charts都是一样的,你可以编写一个脚本来改变文本颜色和xml本身的行长度。然后你可以运行doc2pdf
并且你有一个基本上拥有所有正确信息的文件,但可能不是格式化。在流程图的情况下,您可能还希望包含一些格式,因为格式是信息的一部分。
选项3.使用第三方服务
过去几天我做了一些研究,我找到了一个完美转换的服务:zamzar。 Zamzar允许您上传docx文件,然后通过电子邮件向您发送链接。他们还有一个(付费?)服务,您可以将任何文件发送到pdf@zamzar.com,然后将转换后的文件放回收件箱。您可以轻松地围绕此系统构建一个系统,您可以自动发送文件并从电子邮件中解析它。这不是太多的工作,最终的结果是最好的。
说明
-
如果有人有其他相同的服务,请随时编辑它们。
-
我已经邮寄了zamzar支持,询问他们是否有api。那会更容易。
-
也许用于.NET和Java的apose也可以提供帮助?或者像this very related SO post中的docx4java。
-
另一个选择是查看看似过时的odf-converter,它依赖于openoffice而不是libreoffice。
-
我现在可以确认java jodconverter也遭遇了流程图转换失败。
我实际上花时间测试了本页提出的不同方法。请用实际测试回复任何评论。
次佳解决方案
我过去也遇到过这个问题,最近没有使用它,所以我不知道它是否仍在影响我。
至于回答这个问题:
这个问题:How to batch convert .doc or .docx to .pdf在评论中给出了为什么您使用lowriter
进行转换可能失败的原因:
Beware of using “space” character from command line… When you get to the space character simply press “tab” 😉 – Pitto Nov 16 ’12 at 13:11
这个问题的答案也可能有所帮助:
How can I convert an ODT file to a PDF?
您将运行libreoffice --headless --convert-to pdf *.odt
。如果需要帮助理解或调整命令,可以使用命令man libreoffice
获取有关libreoffice的更多信息。
但是,根据此错误,您无法在当时打开LibreOffice:https://bugs.freedesktop.org/show_bug.cgi?id=37531
这个问题也与Ubuntu有关,即使它在SuperUser上:https://superuser.com/questions/156189/how-to-convert-word-doc-to-pdf-in-linux
第一个答案有两个选项,一个使用CUPS并创建一个PDF打印机,另一个使用LaTex,尽管你确实说LaTex失败了。
至于通过CUPS PDF转换为PDF,您将运行sudo apt-get install cups-pdf
,然后运行oowriter -pt pdf your_word_file.doc(x)
。这可能有助于您的oowriter问题。
当大多数工具使用ODT时,这可能是您尝试从DOC /DOCX转换为PDF的问题,因为它们与LibreOffice /OpenOffice /AbiWord相关。因此,他们要么试图将其转换为微软DOCX格式,要么转换为ODT。
从.docx w转换有几个错误。艺术字(版本包括在内):
-
https://bugs.freedesktop.org/show_bug.cgi?id=33072 – 3.3.0 rc 2(过时我相信)
-
https://bugs.freedesktop.org/show_bug.cgi?id=63289 – 4.0.2.2
-
https://bugs.freedesktop.org/show_bug.cgi?id=62251 – 4.0.0.3
这是来自LibreOffice论坛关于转换自.doc和某些.docx:http://en.libreofficeforum.org/node/5096。它是从2013年1月开始的,所以它应该适用一些。
除此之外,我真的不知道。希望你解决问题!
第三种解决方案
这是一个运行良好的命令行解决方案—但使用专有软件。
我认为基本问题是Microsoft Word格式对于Microsoft Word是完全可以理解的(即使在那里,版本之间存在差异 – 过去的Word文件在较新版本中打开格式不正确)。所有其他解决方案都是近似和黑客攻击,因此它们可以工作与否,具体取决于文件。
因此,为了确保您需要使用Microsoft Word安装处理您的.docx文件(是的,我认为这是他们的选择,这是公平的。如果您不想使用Word,请不要使用它 – 我继续使用LaTeX用于我的工作,但很难说服周围的世界……)。
我使用自Crossover年龄以来在我的Linux桌面(1)中运行Microsoft Office,发现它非常有用。也许它也适用于葡萄酒—从未尝试过。
我使用此配置进行转换:
1)我安装了Crossover
2)我在Crossover下安装了我的Microsoft Office版本
3)在Microsoft Word中,禁用”background printing”
4)我安装了cups-pdf
打印机并选择为默认打印机。
5)要进行转换,请运行(提示here):
~/cxoffice/bin/wine --cx-app winword.exe respondus-docx-sample-file.docx /q /n /mFilePrintDefault /mFileExit
6)您转换的文件将出现在~/PDF/
目录中。
你的文档几乎完美出来(在#2上有一些错误,在我的Office Word 2007中运行时,在Crossover下运行—我不知道它是否与我的Windows版本有关)。
现在,问题是图形字界面将pop-up —我不知道如何制作它”headless”。 Command line options for Word没有帮助……
(1)我与Codeveawers无关 – 只是一个快乐的用户。
第四种方案
如果您安装了Libreoffice,则可以尝试使用它进行转换。只需按键盘上的Ctrl
+ Alt
+ T
即可打开终端。打开时,运行以下命令:
libreoffice --headless -convert-to pdf <file_name>.docx -outdir output/path/for/pdf
另一个选择是安装Cups PDF。
为此,只需按键盘上的Ctrl
+ Alt
+ T
即可打开终端。打开时,运行以下命令:
sudo apt-get install cups-pdf
然后创建一个新的打印机,将其设置为PDF文件打印机,并将其命名为您想要的任何名称,只要您知道该名称,然后运行:
oowriter -pt pdf your_word_file.docx
您的PDF文件将在~/PDF
中。
第五种方案
这是一个痛苦的事实:Linux的Office解决方案完全失败!多年来我一直是full-time GNU /Linux用户,我不断搜索和尝试不同的办公解决方案,从旧的Open-Office到后来的Libre-Office,Abi-Word等……他们都没能帮我做我的办公室工作。当涉及到non-Latin语言(right-to-left语言,如波斯语,阿拉伯语等)时,它甚至会变得更糟。用户必须使用这些软件来完成他/她的工作!而且微软办公室兼容性并不存在。我可以谈谈我已经尝试了多少时间和他们都失败了,但这不是这个问题的重点。
我也尝试使用WINE安装和运行Microsoft Office,并且some-how成功但它没有work-out很好,当我试图打开我的办公室文件时它大部分都崩溃了。
LaTeX很好,但它不是办公室解决方案。 LaTeX适用于type-setting,它更像是专业工具,没有spread-sheets,也没有演示。
那么解决方案是什么?
这不是命令行解决方案。这些年来我提出的唯一解决方案就是在virtual-machine(如VirtualBox)中使用最小的Microsoft Windows安装并安装Microsoft,以便让我进入我的GNU /Linux操作系统并完成我的办公室工作。办公室西装。
它可能听起来不是很漂亮,但它是唯一可以完美运行的解决方案,让我免于在宝贵的时间与bad-office-solutions作战。起初,我自己认为这不是一个好的解决方案,但是在与其他所有人失败并且做了这个VM的东西超过2年后,我真的很高兴它:)
================================================== ==============================
注意1:我不是在宣传微软产品!只是试图帮助解决问题和move-on的生活。
注2:如上所述,这不是命令行解决方案。那么为什么要发布答案呢?因为它是TESTED和WELL-WORKING选项!如果没有可用的WORKING 命令行解决方案(我非常怀疑是这种情况),那么使用ALTERNATIVE选项优于NO选项。