61

I am trying to convert docx files to pdf on my Ubuntu server using the command line but none of converters I tried so far seems to convert Word 2007/2010/2013 files correctly.

Appearently online converters can manage it without any problems but Web services are not an option because the files contain sensitive data. For tests I use this Word 2007 file because it contains some important elements (formulas, vector graphics, images, lists, etc.). I tested the following tools (partly from this post):

lowriter (LibreOffice Writer) - incorrect output (the circle is supposed to be on the last page, not the first one)

enter image description here

unoconv - the same as LibreOffice since it doesn't use its own converter. Converting to odt first and then to pdf messes the file completely up.

abiword --to=pdf filename.doc - incorrect and incomplete (many elements are missing):

enter image description here

OpenOffice Writer - same result as for abiword

wvPDF - crash with the following error message:

~$ 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

Is there any way to convert docx files to PDF on Linux correctly? It would also help me if I knew it works for someone with any of the programs I already mentioned. I will start a bounty as soon as SE lets me.

p.s. I'm using Ubuntu server 12.04


Conclusion:

I had to conclude that as for me, as for now, there is no reliable tool which will work with new MS Word formats and all kind of its elements on Ubuntu and create a one-to-one copy of docx files. None of tools I tested could convert the sample file properly. Since I will be facing very different kind of document versions/contents and the output quality has one of the highest priority, I will end up performing the conversions by means of VB macros in Word on a Windows server connected to my Linux.

I will set the post getting the best results as the accepted answer. However, the bounty was intended for a solution with absolutely correct conversion. Thanks to everyone, again.

9
  • 3
    gave a try to latex?
    – Braiam
    Dec 30, 2013 at 15:45
  • @ScepticalJule , Yes there is a problem at the end. I just looked at the first page.
    – user224082
    Dec 30, 2013 at 16:08
  • 1
    @Braiam Could you drop a link to converting with latex? Dec 30, 2013 at 17:31
  • 2
    @ScepticalJule I think Braiam meant that you should try to write your document in latex immediately. Conversions from docx to latex are a lot more painful than conversions from docx to pdf. You could try to do conversion from docx to doc and then from doc to pdf. But you'd have to find a LO independent tool to do so. Let me know if I can help in any other way and whether my answer helped you out.
    – don.joey
    Jan 3, 2014 at 7:11

7 Answers 7

79

This answer passes all tests, but the flow chart one in your test document.

sudo apt-get install unoconv
doc2pdf respondus-docx-sample-file.docx

Why is this better than other methods suggest thus far?

I have tested the other methods suggested so far (especially oowriter and ebook-convert), but they pass less tests than this method. The ebook-convert method strips the margins and a part of the texts out of the document.

This method even yields better results than a professional converter as rainbowpdf.

I also tried converting it to html, but the drawing with the square in the circle and the flow chart are incorrect.

Why does the flow chart test fail?

It seems that libreoffice and unoconv have some problems with correctly rendering the flow chart that is in the .docx file. This is probably because it was made using smart art in Microsoft Office. That is the problem. That is a bug also discussed on this thread. The textual and visual information is present in the pdf resulting from the above method as you can see (I had to select the text, though).

The flowchart that does not display completely as expected.

The font color, for instance, is not properly read and some lines are too long. I am not aware of any linux solution that is able to display smart art correctly. :(

This is also the reason why all the print solutions posted on this page will not satisfy you.

In short

In short, what you are doing is really hard and there are at present no solutions that will fully satisfy you. The achilles' heel of docx2pdf conversions is the smart art. If you can live without that or if you can find a way to spot smart art and convert it somehow into an image, you can reach your goal.

Option 1. Force your users to deal with the problem

This is a very inelegant solution. Your content creators could save their smart art as jpg as described in the office help pages and hence the conversion would be possible on your server.

Option 2. Hack your way around the problem

If the flow charts are often very similar and depending on how good a developper you are, you could try and convert the smart art separately. You could, extract the drawing1.xml file from the .docx cluster of documents and then use natural language processing and some crazy hacks to rebuild a the smart art. For instance, you'd have to mess with this type of 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>

Or as a minimal solution you at least extract the text (<a:t>?) from the file and save it in an easier way. Or if the flow-charts of your pdfs are all the same, you could write a script to change the text color and the line length in the xml itself. Then you could run doc2pdf and you'd have a file that essentially has all the right info, but maybe not the formatting. In the case of flow charts you'd probably also want to include some of the formatting, because the formatting is part of the info.

Option 3. Use a third party service

I have done some more research the past few days and I have found a service that does the conversion perfectly: zamzar. Zamzar allows you to upload a docx file and then emails you a link. They also have a (paying?) service where you can send any file to [email protected] and then get the converted file back in your inbox. You could easily build a system around this where you automatically send the file and parse it from the email. This is not so much work and it the end result is the best.

Notes

  • If anyone has other services that do the same, please feel free to edit them in.
  • I have mailed the zamzar support to ask whether they have an api. That would be even easier.
  • Maybe apose for .NET and Java could also help out? Or docx4java as in this very related SO post.
  • Another option is to look into the the odf-converter which seems dated and is dependent on openoffice rather than libreoffice.
  • I can now confirm that the java jodconverter also suffers fails the flow chart conversion.

I have actually taken the time to test the different methods proposed on this page. Please back any comments up with actual tests.

9
  • 1
    I have gotten news from zamzar: "We currently have an API that we hope to launch in Beta in the next couple of months - we could get you added to the beta trial if this was of interest ?" They also mentioned that their conversion system is something they have developed in-house.
    – don.joey
    Jan 6, 2014 at 8:41
  • @jasonplutext I agree with the reviewers that your edit was not helpful. As author of plutext (I guess?) I would suggest you add an answer of your own with a disclaimer stating your affiliation. Thanks.
    – don.joey
    May 3, 2017 at 7:59
  • Any updates in the last couple of years?
    – a06e
    Jun 30, 2017 at 14:53
  • @becko I have not followed it up. Maybe set a bounty for someone else?
    – don.joey
    Jun 30, 2017 at 20:00
  • Note from the future: the proper usage in recent versions of lowriter is now lowriter --convert-to pdf input_file.docx. Using --pt pdf will fail silently. Mar 15, 2019 at 19:24
9

If you have Libreoffice installed, you can try to convert using that. Just press Ctrl+Alt+T on your keyboard to open Terminal. When it opens, run the command(s) below:

libreoffice --headless -convert-to pdf <file_name>.docx -outdir output/path/for/pdf

Another option is to install Cups PDF.

To do so just press Ctrl+Alt+T on your keyboard to open Terminal. When it opens, run the command(s) below:

sudo apt-get install cups-pdf

Then create a new printer, set it as a PDF file printer, and name it whatever you want, as long as you know the name, then run:

oowriter -pt pdf your_word_file.docx

And your PDF file will be in ~/PDF.

7
  • 1
    Didn't have any success with those. Jan 3, 2014 at 15:10
  • This may answer why. Jan 3, 2014 at 15:34
  • I appreciate your response, It make a lot of sense, but I'm surprised that printing didn't work, since it like printing to paper... :)
    – Mitch
    Jan 3, 2014 at 15:52
  • The key problem is that LibreOffice is not even able to open and display the document correctly. Consequently the output is incorrect, too. Did it work on your Linux? Jan 3, 2014 at 15:54
  • That's good to know. I only use office for just basic documents, the need hasn't come up for anything more complex, but when it does, I'll make sure, and refer to this. Thanks for the great question, and I'll sure add it as a favorite for future reference. I'll will keep this answer, and comments as reference for other users to see.
    – Mitch
    Jan 3, 2014 at 16:00
8

This is a command-line solution that works decently --- but uses proprietary software.

I think that the basic problem is that Microsoft Word formats are fully understandable just for Microsoft Word (even there, there are differences between versions --- there are Word files from the past that opens incorrectly formatted in newer versions). All the other solutions are approximations and hacks, so they will work or not depending on the file.

So to be sure you need to process your .docx files with a Microsoft Word installation (and yes, I think it's their option and it's fair. If you do not want to use Word, don't use it --- I go with LaTeX for my work, but it's difficult to convince the rest of the world around...).

I am using since ages Crossover for running Microsoft Office in my Linux Desktop (1), finding it quite useful. Maybe it works with wine too --- never tried.

I do the conversion using this configuration:

1) I have Crossover installed

2) I have my version of Microsoft Office installed under Crossover

3) In Microsoft Word, disable "background printing"

4) I have cups-pdf printer installed and selected as default printer.

5) To do the conversion, run (hints here):

~/cxoffice/bin/wine --cx-app winword.exe respondus-docx-sample-file.docx /q /n /mFilePrintDefault /mFileExit

6) Your converted file will appear in ~/PDF/ directory.

You document come out almost perfectly (there is some misalignement on answer #2, that are shown in my Office Word 2007 when running under Crossover --- I do not know if it's related to my Windows version).

pagew 1-2

pages 3-4

Now, the problem is that the graphic word interface will pop-up --- I do not know how to make it "headless". Command line options for Word didn't help...

(1) I am in no way related to Codeveawers --- just a happy user.

4

I also had this problem in the past, haven't had to use it lately, so I don't know if it still is affecting me.

As for answering the question:

This question: How to batch convert .doc or .docx to .pdf gives a reason in the comments why your conversion with lowriter might be failing:

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

This question's answer also might possibly help:

How can I convert an ODT file to a PDF?

You would run libreoffice --headless --convert-to pdf *.odt. You can get more info on libreoffice with the command man libreoffice if you need help understanding or tweaking the command to work.

However, you can't have LibreOffice open at the time, as per this bug: https://bugs.freedesktop.org/show_bug.cgi?id=37531


This question is also Ubuntu related, even though it's on SuperUser: https://superuser.com/questions/156189/how-to-convert-word-doc-to-pdf-in-linux

The first answer has two options, one using CUPS and creating a PDF printer, the other using LaTex, though you did say that LaTex was failing.

As for converting to PDF via CUPS PDF you would run sudo apt-get install cups-pdf followed by oowriter -pt pdf your_word_file.doc(x). This might help with your oowriter issue.

This is probably a problem with the fact that you are trying to convert to PDF from DOC/DOCX, when most of the tools use ODT, as they are related to LibreOffice/OpenOffice/AbiWord. Thus, they either fail at trying to convert it from Microsofts DOCX format or in the conversion to ODT.

There are several bugs with a conversion from .docx w. Word Art (version is included):

This is from the LibreOffice forum regarding conversion from .doc and somewhat .docx: http://en.libreofficeforum.org/node/5096. It's from January of 2013, so it should apply somewhat.

Beyond all this, I really don't know. Hope you solve your problem!

1
  • Sorry but none of your suggested tools could make a clean conversion. Jan 3, 2014 at 14:53
3
+100

Here is the bitter truth: Office solutions for Linux are total failures! I've been a full-time GNU/Linux user for many years and I've constantly searched and tried different office solutions, from the old Open-Office, to the later Libre-Office, Abi-Word, etc... They have all failed to help me do my office work. It even gets worse when it comes to non-Latin languages (right-to-left languages like Persian, Arabic, etc). The user has to fight with these software to get his/her work done! And Microsoft office compatibility is just not there. I can talk hours and hours of how much I've tried and they have all failed me, but this is not the point of this question.

I've also tried installing and running Microsoft Office using WINE, and some-how successful but it didn't work-out nice and it mostly crashed when I tried to open my office files.

LaTeX is fine, but it's not an office solution. LaTeX is for type-setting, and it's more like a pro's tool, and there's no spread-sheets, nor presentations.

So what's the solution?

This is not a command-line solution. The only solution that I have came up with in all these years, to keep me inside my GNU/Linux OS and also get my office works done, is to use a minimal Microsoft Windows installation in a virtual-machine (like VirtualBox) and install a Microsoft Office suit.

enter image description here

It might not sound pretty but it's the only solution that works flawlessly and saves me from fighting with bad-office-solutions in my precious time. At first, I myself thought this was not a good solution, but after failing with all the others and doing this VM stuff for more than 2 years, I'm really happy with it :)

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

NOTE-1: I'm not advertising Microsoft products! Just trying to help solve the problem and move-on with life.

NOTE-2: As emphasized above, this is NOT a command-line solution. So why post the answer? Because it's a TESTED and WELL-WORKING option! If no WORKING command-line solution is available (which I highly suspect is the case), then having an ALTERNATIVE option is better than NO options.

13
  • 1
    Why just use MS word in wine instead of virtual machine ?
    – totti
    Jan 1, 2014 at 10:12
  • 1
    As I mentioned, my experience with installing and using MS-Office using WINE didn't go well. The program didn't work as it does on Windows (showed incorrect behaviour) and also crashed a lot! Jan 1, 2014 at 10:22
  • 3
    No ohe has downvoted yet, but the question explicitly asks for a command line solution. This isn't useless because of MS, it's useless because it completely ignores the question.
    – djeikyb
    Jan 1, 2014 at 10:26
  • 3
    Seyed, please note that the OP is explicitly asking for a command-line solution that will work on his Ubuntu server (which likely doesn't even have a GUI!). Your answer isn't bad but it just isn't relevant in this case. Jan 1, 2014 at 14:33
  • 2
    @ScepticalJule Ridiculous. You explicitly put a bounty on a command line solution. Then you select an answer which is not even an answer to the question. Have you even studied the other answers. Including this one and mine?
    – don.joey
    Jan 6, 2014 at 13:09
1

Install Calibre from Software Center or Synaptic, and set the default output to PDF.

From a shell prompt, perform

ebook-convert dummyfilename.docx .pdf -h

2
  • This cuts of the text somehow.
    – don.joey
    Jan 1, 2014 at 14:28
  • Crash with ValueError: No plugin to handle input format: docx. Google didn't help on this one so I'll report a bug. Jan 3, 2014 at 15:37
1

Here are a couple applications that you can try and see if they work FF Multi Converter or you can try Kingsoft Office.

1
  • Installed FF Multi Converter, executed the command... nothing happened. Kingsoft has a nice GUI but it could not open/show the file correctly (formulas were missing even after I installed the required fonts. The letters in the circle were also missing). Jan 3, 2014 at 18:50

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .