将 docx 转换为 PDF

Sce*_*ule 50 software-recommendation

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

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

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

在此处输入图片说明

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

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

在此处输入图片说明

OpenOffice Writer - 与 abiword 的结果相同

wvPDF - 崩溃并显示以下错误消息:

~$ wvPDF 2007_Office_DocEncryption.docx test.pdf

当前目录:/home/webmt/dev/test/

运行乳胶的一些问题。

检查 test.log 中的错误

继续...

转换为 dvi 失败

有没有办法在 Linux 上正确地将 docx 文件转换为 PDF?如果我知道它适用于我已经提到的任何程序的人,它也会对我有所帮助。一旦 SE 允许,我将开始赏金。

ps 我使用的是 Ubuntu 服务器 12.04


结论

我不得不得出结论,就我而言,就目前而言,没有可靠的工具可以处理新的 MS Word 格式及其在 Ubuntu 上的所有元素,并创建 docx 文件的一对一副本。我测试的任何工具都无法正确转换示例文件。由于我将面临非常不同类型的文档版本/内容,并且输出质量是最高优先级之一,因此我最终将在连接到 Linux 的 Windows 服务器上通过 Word 中的 VB 宏执行转换。

我会将获得最佳结果的帖子设置为接受的答案。但是,赏金旨在提供绝对正确转换的解决方案。再次感谢大家。

don*_*oey 67

此答案通过了所有测试,但测试文档中的流程图之一

sudo apt-get install unoconv
doc2pdf respondus-docx-sample-file.docx
Run Code Online (Sandbox Code Playgroud)

为什么这比迄今为止建议的其他方法更好?

到目前为止,我已经测试了建议的其他方法(尤其是oowriterebook-convert),但它们通过的测试比这种方法。该ebook-convert方法从文档中去除边距和部分文本。

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

我也试过把它转成html,但是圆圈里有正方形的图和流程图都不对。

为什么流程图测试失败?

似乎 libreoffice 和 unoconv 在正确呈现 .docx 文件中的流程图方面存在一些问题。这可能是因为它是使用Microsoft Office 中的智能艺术制作的。那就是问题所在。这也是该线程上讨论的一个错误。如您所见,文本和视觉信息存在于由上述方法生成的 pdf 中(不过,我必须选择文本)。

未按预期完全显示的流程图。

例如,字体颜色读取不正确,有些行太长。我不知道任何能够正确显示智能艺术的 linux 解决方案。:(

这也是print这个页面上发布的所有解决方案都不会让您满意的原因。

简而言之

简而言之,你所做的事情真的很难,目前还没有完全让你满意的解决方案。docx2pdf 转换的致命弱点是智能艺术。如果你可以没有它,或者如果你能找到一种方法来发现智能艺术并将其以某种方式转换成图像,你就可以实现你的目标。

选项 1. 强迫您的用户处理问题

这是一个非常不雅的解决方案。您的内容创建者可以按照office 帮助页面中的描述将他们的智能艺术保存为 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>
Run Code Online (Sandbox Code Playgroud)

或者作为最小的解决方案,您至少从文件中提取文本(<a:t>?)并以更简单的方式保存它。或者,如果您的 pdf 的流程图都相同,您可以编写一个脚本来更改 xml 本身中的文本颜色和行长。然后你可以运行doc2pdf,你会得到一个基本上包含所有正确信息的文件,但可能没有格式。在流程图的情况下,您可能还希望包含一些格式,因为格式是信息的一部分

选项 3. 使用第三方服务

在过去的几天里,我做了一些更多的研究,我发现了一个可以完美转换的服务:zamzar。Zamzar 允许您上传 docx 文件,然后通过电子邮件向您发送链接。他们还有一项(付费?)服务,您可以将任何文件发送到 pdf@zamzar.com,然后将转换后的文件放回您的收件箱。您可以轻松地围绕此构建一个系统,您可以在其中自动发送文件并从电子邮件中解析它。这不是很多工作,最终结果是最好的。

笔记

  • 如果有人有其他服务也做同样的事情,请随时编辑它们。
  • 我已经邮寄了 zamzar 支持,询问他们是否有 api。那会更容易。
  • 也许apose为.NET和Java也可以帮帮忙?或者 docx4java 就像在这个非常相关的 SO post 中一样
  • 另一种选择是查看似乎过时并且依赖于 openoffice 而不是 libreoffice的odf-converter
  • 我现在可以确认 java jodconverter也遇到了流程图转换失败的问题。

我实际上已经花时间测试了此页面上提出的不同方法。请用实际测试支持任何评论。


Rma*_*ano 8

这是一个运行良好的命令行解决方案——但使用专有软件。

我认为基本问题是Microsoft Word 格式仅适用于 Microsoft Word 是完全可以理解的(即使存在,版本之间也存在差异——过去的 Word 文件在较新版本中打开时格式不正确)。所有其他解决方案都是近似值和技巧,因此它们是否有效取决于文件。

因此,为了确保您需要使用 Microsoft Word 安装来处理 .docx 文件(是的,我认为这是他们的选择,而且很公平。如果您不想使用 Word,请不要使用它 --- 我同意LaTeX 适合我的工作,但很难说服世界各地的其他人......)。

我一直在使用Crossover在我的 Linux 桌面 (1) 中运行 Microsoft Office,发现它非常有用。也许它也适用于葡萄酒——从未尝试过。

我使用此配置进行转换:

1)我安装了Crossover

2) 我在 Crossover 下安装了我的 Microsoft Office 版本

3) 在 Microsoft Word 中,禁用“后台打印”

4)我安装了cups-pdf打印机并选择为默认打印机。

5)要进行转换,请运行(此处有提示):

~/cxoffice/bin/wine --cx-app winword.exe respondus-docx-sample-file.docx /q /n /mFilePrintDefault /mFileExit
Run Code Online (Sandbox Code Playgroud)

6) 您转换后的文件将出现在~/PDF/目录中。

您的文档几乎完美无缺(答案#2 有一些错位,在 Crossover 下运行时在我的 Office Word 2007 中显示——我不知道它是否与我的 Windows 版本有关)。

第 1-2 页

第 3-4 页

现在的问题是会弹出图文界面---不知道怎么弄成“无头”。Word 的命令行选项没有帮助...

(1) 我与 Codeveawers 没有任何关系——只是一个快乐的用户。


Mit*_*tch 5

如果您安装了 Libreoffice,您可以尝试使用它进行转换。只需按键盘上的Ctrl+ Alt+T即可打开终端。当它打开时,运行以下命令:

libreoffice --headless -convert-to pdf <file_name>.docx -outdir output/path/for/pdf
Run Code Online (Sandbox Code Playgroud)

另一种选择是安装Cups PDF

为此,只需按键盘上的Ctrl+ Alt+T即可打开终端。当它打开时,运行以下命令:

sudo apt-get install cups-pdf
Run Code Online (Sandbox Code Playgroud)

然后新建一个打印机,设置为PDF文件打印机,随便起个名字,只要知道名字,然后运行:

oowriter -pt pdf your_word_file.docx
Run Code Online (Sandbox Code Playgroud)

您的 PDF 文件将在~/PDF.