当前位置: 首页>>技术教程>>正文


将docx转换为PDF

,

问题描述

我试图使用命令行在我的Ubuntu服务器上将docx文件转换为pdf,但到目前为止我尝试过的转换器似乎都没有正确转换Word 2007/2010/2013文件。

显然,在线转换器可以毫无问题地管理它,但Web服务不是一种选择,因为文件包含敏感数据。对于测试,我使用this Word 2007 file,因为它包含一些重要元素(公式,矢量图形,图像,列表等)。我测试了以下工具(部分来自this post):

lowriter(LibreOffice Writer) – 输出不正确(圆圈应该在最后一页,而不是第一页)

software-recommendation,ubuntu

unoconv – 与LibreOffice相同,因为它不使用自己的转换器。首先转换为odt然后转换为pdf将文件完全打开。

abiword --to=pdf filename.doc – 错误和不完整(缺少许多元素):

software-recommendation,ubuntu

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

到目前为止,为什么这比其他方法更好?

我已经测试了目前建议的其他方法(特别是oowriterebook-convert),但它们通过的测试次数少于此方法。 ebook-convert方法从文档中剥离边距和部分文本。

这种方法甚至比专业转换器rainbowpdf产生更好的结果。

我也尝试将其转换为html,但是圆圈中的方块和流程图的绘图是不正确的。

为什么流程图测试失败?

似乎libreoffice和unoconv在正确呈现.docx文件中的流程图时遇到了一些问题。这可能是因为它是在Microsoft Office中使用智能艺术制作的。那就是问题所在。那就是a bug也在this thread上讨论过。正如您所见,文本和视觉信息存在于上述方法的pdf中(尽管我必须选择文本)。

software-recommendation,ubuntu

例如,字体颜色未正确读取,某些行太长。我不知道任何能够正确显示智能艺术的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转换有几个错误。艺术字(版本包括在内):

这是来自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版本有关)。

software-recommendation,ubuntu

software-recommendation,ubuntu

现在,问题是图形字界面将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操作系统并完成我的办公室工作。办公室西装。

software-recommendation,ubuntu

它可能听起来不是很漂亮,但它是唯一可以完美运行的解决方案,让我免于在宝贵的时间与bad-office-solutions作战。起初,我自己认为这不是一个好的解决方案,但是在与其他所有人失败并且做了这个VM的东西超过2年后,我真的很高兴它:)

================================================== ==============================

注意1:我不是在宣传微软产品!只是试图帮助解决问题和move-on的生活。

注2:如上所述,这不是命令行解决方案。那么为什么要发布答案呢?因为它是TESTED和WELL-WORKING选项!如果没有可用的WORKING 命令行解决方案(我非常怀疑是这种情况),那么使用ALTERNATIVE选项优于NO选项。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/2569.html,未经允许,请勿转载。