Convertir un .docx en .pdf avec pandoc

19

J'essaie de convertir un .docx reçu par mail en un pdf correct en utilisant pandoc (j'utilise GNU / Linux).

J'ai une erreur concernant l'encodage des caractères:

$ pandoc file.docx -o file.pdf
pandoc: Cannot decode byte '\x87': Data.Text.Encoding.decodeUtf8: Invalid UTF-8 stream

J'ai essayé d'identifier l'encodage:

$ file -i file .docx 
file.docx: application/vnd.openxmlformats-officedocument.wordprocessingml.document; charset=binary

Je suis un peu surpris par charset=binary(je m'y attendais charset=iso8859-15). Cependant, j'ai quand même essayé de convertir le .docx en utf8 et cela ne fonctionne pas:

 $ iconv -t utf-8 file.docx
P!      $iconv: séquence d'échappement non permise à la position 16

J'ai la même erreur avec la ligne de commande de la documentation pandoc :

iconv -t utf-8 file.docx | pandoc | iconv -f utf-8

Comment puis-je convertir ce .docx en pdf avec pandoc?

ppr
la source
Pourquoi n'utilisez-vous pas Zamzar - pour une seule fois ... Je dois utiliser Kingsoft pour éditer mon travail, bien qu'il soit probablement illégal d'utiliser en Amérique du Nord ...
Wilf
Je suggère de fournir iconvun jeu de caractères source, en utilisant le -fdrapeau. Par exemple, iconv -f ISO-8859-15 -t utf-8 file.docxpourrait fonctionner. Cependant, je n'ai aucune idée du format d'un fichier .docx.
derobert
@wilf j'ai essayé. La sortie n'est pas correcte (normalement, Zamzar fait très bien son travail mais pas pour ce fichier).
ppt
1
@wilf merci (pandoc est si puissant parfois j'oublie qu'il a des limites).
ppt
2
@derobert: Il est peu probable que l' exécution iconvdirecte sur un .docxfichier fonctionne. iconvsuppose que son entrée est un fichier texte dans un format spécifié ou déduit. Un .docxfichier est en fait un fichier zip (une archive compressée) contenant (principalement) des fichiers xml. Vous pourriez peut-être avoir de la chance en décompressant le .docxfichier, en exécutant iconvles fichiers constitutifs, puis en recompressant le tout dans un nouveau .docx, mais je ne parierais pas que cela fonctionne. D'une part, le fichier xml contenant le contenu réel du document spécifie son encodage:, encoding="UTF-8"par exemple.
Keith Thompson

Réponses:

16

Dans la documentation ici , .docxn'est pas répertorié comme une entrée compatible :

Pandoc est une bibliothèque Haskell pour la conversion d'un format de balisage à un autre, et un outil en ligne de commande qui utilise cette bibliothèque. Il peut lire le balisage et (sous-ensembles de) Textile, reStructuredText, HTML, LaTeX, balisage MediaWiki, balisage Haddock, OPML et DocBook; et il peut écrire du texte brut, du markdown, du reStructuredText, du XHTML, du HTML 5, du LaTeX (y compris des diaporamas avec beamer), du ConTeXt, du RTF, de l'OPML, du DocBook, de l'OpenDocument, de l'ODT, du Word docx, du GNU Texinfo, du balisage MediaWiki, de l'EPUB (v2 ou v3) ), FictionBook2, Textile, pages de manuel groff, Emacs Org-Mode, AsciiDoc et Slidy, Slideous, DZSlides, révèlent.js ou S5 diaporamas HTML. Il peut également produire une sortie PDF sur les systèmes sur lesquels LaTeX est installé.

Essayez autre chose, comme Libreoffice - qui peut faire du docx, aussi longtemps que cela ne vous dérange pas quelques erreurs de formatage.

ÉDITER:

La description indique maintenant que Pandoc semble désormais prendre en charge la lecture à partir de Word DOCX (ainsi que DocBook et quelques autres formats):

Pandoc est une bibliothèque Haskell pour la conversion d'un format de balisage à un autre, et un outil en ligne de commande qui utilise cette bibliothèque. Il peut lire le balisage et les (sous-ensembles de) Textile, reStructuredText, HTML, LaTeX, balisage MediaWiki, balisage TWiki, balisage Haddock, OPML, Emacs Org-mode, DocBook, txt2tags, EPUB et Word docx ; et il peut écriretexte brut, démarquage, reStructuredText, XHTML, HTML 5, LaTeX (y compris les diaporamas de projection), ConTeXt, RTF, OPML, DocBook, OpenDocument, ODT, Word docx, GNU Texinfo, balisage MediaWiki, balisage DokuWiki, balisage Haddock, EPUB (v2 ou v3), FictionBook2, Textile, pages de manuel groff, Emacs Org-Mode, AsciiDoc, InDesign ICML et Slidy, Slideous, DZSlides, révèlent.js ou S5 HTML. Il peut également produire une sortie PDF sur les systèmes sur lesquels LaTeX est installé.


Comme l'a suggéré @evilsoup, cela pourrait fonctionner:

cd /DIRECTORY/WITH/FILE/IN && libreoffice --headless --convert-to html 'FILE.docx' && pandoc 'FILE.html' -o 'FILE.pdf'

Oui, vous pouvez utiliser la commande libreoffice avec --outdir, mais la sortie html ne fonctionne pas toujours de cette façon ...

J'ai fait un test rapide, et cela a semblé fonctionner, à part le crash de Pandoc en raison d'une image gif dans le document smiley

Wilf
la source
Um .... Word docx est juste là dans votre texte cité (juste après OpenDocument et ODT). Cela dit, docx n'est toujours pas un format bien documenté et donc, la compatibilité réelle dans le monde ouvert est .... inégale, dirons-nous, et votre suggestion pour LibreOffice (avec les différences de formatage ) est bonne.
SuperMagic
@SuperMagic - c'est, dans le peu qu'il peut écrire ... Il l'a mis en évidence pour le rendre plus facile.
Wilf
1
Si vous voulez vraiment un PDF de style pandoc (en fait LaTeX), vous pouvez également utiliser LibreOffice pour convertir le docx en html, puis l'utiliser comme entrée pour pandoc (selon la compétence de la personne qui a créé le document original, vous devrez peut-être supprimer un tas de <BR>s du html).
evilsoup
1
Sous OSX, l'exécutable est appelé soffice et se trouve dans /Applications/LibreOffice.app/contents/MacOS/bin. Plus de détails peuvent être trouvés ici: ask.libreoffice.org/en/question/12084/…
Tim Saylor
2
Pandoc répertorie désormais Word docx comme format pris en charge dans la documentation.
cledoux
12

Cela revient toujours sur les recherches Google, donc je voulais mettre cela au compte rendu: pandoc n'a pas pu lire docx lorsque cette question a été posée (l'erreur vient d'essayer de lire un fichier binaire) mais depuis la version 1.13, il le peut, et il fait un assez bon travail.

jkr
la source
2
Cependant, Pandoc ne conserve pas la mise en forme du dessin d'origine. Voir cet article: github.com/jgm/pandoc/issues/2206#issuecomment-107994587
orschiro