![将 docx 转换为 PDF](https://linux22.com/image/846819/%E5%B0%86%20docx%20%E8%BD%AC%E6%8D%A2%E4%B8%BA%20PDF.png)
我正在尝试转换文档使用命令行但到目前为止我尝试过的转换器似乎都无法正确转换 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 测试.pdf
当前目录:/home/webmt/dev/test/
运行乳胶时出现一些问题。
检查 test.log 中的错误
继续...
转换为 dvi 失败
有没有办法在 Linux 上正确地将 docx 文件转换为 PDF?如果我知道它适用于使用我之前提到的任何程序的人,这也会对我有所帮助。只要 SE 允许,我就会开始悬赏。
我正在使用 Ubuntu 服务器 12.04
结论:
我不得不得出结论,就我而言,目前还没有可靠的工具可以在 Ubuntu 上处理新的 MS Word 格式及其所有类型的元素并创建 docx 文件的一对一副本。我测试的所有工具都无法正确转换示例文件。由于我将面对非常不同类型的文档版本/内容,并且输出质量是重中之重,因此我最终将通过连接到 Linux 的 Windows 服务器上的 Word 中的 VB 宏来执行转换。
我会将获得最佳结果的帖子设置为可接受的答案。但是,赏金旨在获得绝对正确的转换解决方案。再次感谢大家。
答案1
这个答案通过了所有测试,但流程图测试在您的测试文档中。
sudo apt-get install unoconv
doc2pdf respondus-docx-sample-file.docx
为什么这比迄今为止的其他方法更好?
我已经测试了迄今为止建议的其他方法(特别是oowriter
和ebook-convert
),但它们都通过了更少的测试比此方法更有效。该ebook-convert
方法会从文档中删除边距和部分文本。
这种方法甚至比专业转换器产生更好的效果彩虹pdf。
我也尝试将其转换为html,但是圆圈内的正方形的绘图和流程图不正确。
流程图测试为什么会失败?
libreoffice 和 unoconv 似乎在正确呈现 .docx 文件中的流程图方面存在一些问题。这可能是因为它是使用智能艺术在 Microsoft Office 中。这就是问题所在。一个错误还讨论了此主题。如您所见,通过上述方法生成的 pdf 中包含了文本和视觉信息(不过我必须选择文本)。
例如,字体颜色无法正确显示,有些行太长。我不知道有任何 Linux 解决方案能够正确显示智能艺术。:(
print
这也是为什么本页面上发布的所有解决方案都无法让您满意的原因。
简而言之
简而言之,你正在做的事情确实很难,目前还没有完全让你满意的解决方案。docx2pdf 转换的致命弱点是智能艺术。如果你可以没有它,或者如果你能找到一种方法来发现智能艺术并以某种方式将其转换为图像,您就可以达到您的目标。
选项 1. 强迫用户处理问题
这是一个非常不优雅的解决方案。您的内容创建者可以按照办公室帮助页面因此可以在您的服务器上进行转换。
选项 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>
或者作为一个最小的解决方案,你至少提炼<a:t>
从文件中删除文本( ?)并以更简单的方式保存。或者,如果您的 pdf 的流程图都相同,您可以编写一个脚本来更改 xml 本身中的文本颜色和行长。然后您可以运行doc2pdf
,您将得到一个基本上包含所有正确信息的文件,但可能不是格式。在流程图的情况下,您可能还希望包含一些格式,因为格式是部分的信息。
选项 3. 使用第三方服务
过去几天我做了更多的研究,发现了一项可以完美完成转换的服务:赞扎尔。Zamzar 允许您上传 docx 文件,然后通过电子邮件向您发送链接。他们还有一项(付费?)服务,您可以将任何文件发送到[电子邮件保护]然后将转换后的文件放回到您的收件箱中。您可以轻松构建一个系统,自动发送文件并从电子邮件中解析它。这不需要太多工作,而且最终结果是最好的。
笔记
- 如果有人有其他具有同样功能的服务,请随意进行编辑。
- 我已经给 zamzar 支持部门发邮件询问他们是否有 api。这样就更简单了。
- 或许修饰.NET 和 Java 也能帮忙吗?或者 docx4java这篇非常相关的 SO 帖子。
- 另一个选择是研究odf 转换器它似乎已经过时了,并且依赖于 openoffice 而不是 libreoffice。
- 我现在可以确认 java乔德转换器也遭受流程图转换失败。
我实际上已经花时间测试了本页提出的不同方法。请用实际测试来支持任何评论。
答案2
如果您安装了 Libreoffice,您可以尝试使用它进行转换。只需按键盘上的Ctrl+ Alt+即可T打开终端。打开后,运行以下命令:
libreoffice --headless -convert-to pdf <file_name>.docx -outdir output/path/for/pdf
其他选择安装杯子 PDF。
为此,只需按键盘上的Ctrl+ Alt+T打开终端即可。打开后,运行以下命令:
sudo apt-get install cups-pdf
然后创建一个新的打印机,将其设置为 PDF 文件打印机,并将其命名为您想要的任何名称,只要您知道名称,然后运行:
oowriter -pt pdf your_word_file.docx
您的 PDF 文件将以 的形式显示~/PDF
。
答案3
这是一个运行良好的命令行解决方案 --- 但使用专有软件。
我认为基本问题是Microsoft Word 格式完全可以被 Microsoft Word 理解(即便如此,版本之间也存在差异 --- 以前的 Word 文件在新版本中打开时格式不正确)。所有其他解决方案都是近似值和技巧,因此它们是否有效取决于文件。
因此,为确保您需要使用 Microsoft Word 安装来处理您的 .docx 文件(是的,我认为这是他们的选择,而且很公平。如果您不想使用 Word,就不要使用它 --- 我使用 LaTeX 来完成我的工作,但很难说服世界其他地方的人...)。
我已经用了很多年了交叉在我的 Linux 桌面 (1) 上运行 Microsoft Office,发现它非常有用。也许它也可以与 wine 一起使用 --- 从未尝试过。
我使用以下配置进行转换:
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
6) 转换后的文件将出现在~/PDF/
目录中。
您的文档几乎完美无缺(答案#2 有一些错位,在我的 Office Word 2007 中在 Crossover 下运行时显示出来 --- 我不知道这是否与我的 Windows 版本有关)。
现在的问题是,图形文字界面会弹出来---我不知道如何使它“无头”。Word 的命令行选项没有帮助……
(1) 我与 Codeveawers 没有任何关系 --- 只是一个快乐的用户。
答案4
残酷的事实是:Linux 的 Office 解决方案完全失败了!多年来,我一直是全职的 GNU/Linux 用户,我一直在寻找和尝试不同的办公解决方案,从旧的 Open-Office 到后来的 Libre-Office、Abi-Word 等……它们都无法帮助我完成办公工作。当涉及到非拉丁语言(从右到左的语言,如波斯语、阿拉伯语等)时,情况就更糟了。用户必须与这些软件斗争才能完成工作!而且 Microsoft Office 兼容性根本不存在。我可以花上几个小时谈论我尝试了多少次,但它们都让我失望了,但这不是这个问题的重点。
我也尝试过使用 WINE 安装和运行 Microsoft Office,虽然取得了成功,但效果并不好,而且当我尝试打开我的办公文件时它大多崩溃了。
LaTeX 不错,但它不是办公解决方案。LaTeX 用于排版,更像是专业人士的工具,没有电子表格,也没有演示文稿。
那么解决方案是什么?
这不是一个命令行解决方案。这些年来我想到唯一的解决方案就是在虚拟机(如 VirtualBox)中使用最小的 Microsoft Windows 安装并安装 Microsoft Office 套件,这样我就可以继续使用 GNU/Linux 操作系统并完成办公室工作。
听起来可能不太好,但这是唯一一个完美无缺的解决方案,让我不用浪费宝贵的时间与糟糕的办公解决方案作斗争。起初,我自己也认为这不是一个好的解决方案,但在尝试了所有其他方法都失败了,并且使用了两年多的 VM 之后,我对它感到非常满意 :)
================================================================================
注-1:我不是在为微软产品做广告!只是想帮助解决问题,继续生活。
笔记2:如上所述,这不是命令行解决方案。那么为什么要发布答案呢?因为这是一个经过测试且运行良好的选项!如果没有可用的命令行解决方案(我非常怀疑是这种情况),那么有一个替代选项总比没有选项要好。