Konwertuj .docx na .pdf za pomocą pandoc

19

Próbuję przekonwertować .docx otrzymany pocztą na poprawny plik pdf za pomocą pandoc (używam GNU / Linux).

Mam błąd dotyczący kodowania znaków:

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

Próbowałem zidentyfikować kodowanie:

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

Jestem trochę zaskoczony charset=binary(spodziewałem się charset=iso8859-15). Jednak mimo to próbowałem przekonwertować .docx na utf8 i to nie działa:

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

Mam ten sam błąd w wierszu polecenia z dokumentacji pandoc :

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

Jak mogę przekonwertować ten .docx na pdf z pandoc?

ppr
źródło
Dlaczego nie użyjesz Zamzara - jednorazowo ... Muszę użyć Kingsoft do edycji mojej pracy, choć prawdopodobnie jest to nielegalne w Ameryce Północnej ...
Wilf
Sugeruję podanie iconvźródłowego zestawu znaków przy użyciu -fflagi. Na przykład iconv -f ISO-8859-15 -t utf-8 file.docxmoże działać. Nie mam jednak pojęcia, jaki jest format pliku docx.
derobert,
@wilf Próbowałem. Dane wyjściowe są niepoprawne (zwykle Zamzar wykonuje swoją pracę bardzo dobrze, ale nie dla tego pliku).
ppr
1
@wilf dzięki (pandoc jest tak potężny, że czasami zapominam, że ma ograniczenia).
ppr
2
@derobert: Uruchomienie iconvbezpośrednio na .docxpliku jest mało prawdopodobne. iconvzakłada, że ​​jego dane wejściowe są plikiem tekstowym w określonym lub wnioskowanym formacie. .docxPlik jest w rzeczywistości plik ZIP (a skompresowane archiwum) zawierający (w większości) plików XML. Możliwe, że masz szczęście rozpakować .docxplik, uruchomić iconvpliki składowe, a następnie ponownie skompresować wszystko z powrotem do nowego .docx, ale nie postawiłbym na to, że zadziała. Po pierwsze, plik xml zawierający rzeczywistą treść dokumentu określa jego kodowanie: encoding="UTF-8"na przykład.
Keith Thompson,

Odpowiedzi:

16

W dokumentacji tutaj , .docxnie znajduje się na liście kompatybilnych wejścia :

Pandoc to biblioteka Haskell do konwersji z jednego formatu znaczników na inny oraz narzędzie wiersza poleceń, które korzysta z tej biblioteki. Odczytuje markdown i (podzbiory) Textile, reStructuredText, HTML, LaTeX, MediaWiki, Haddock, OPML i DocBook; i może pisać zwykły tekst, markdown, reStructuredText, XHTML, HTML 5, LaTeX (w tym pokazy slajdów), ConTeXt, RTF, OPML, DocBook, OpenDocument, ODT, Word docx, GNU Texinfo, znaczniki MediaWiki, EPUB (v2 lub v3 ), FictionBook2, Tekstylia, strony man groff, Emacs Org-Mode, AsciiDoc i Slidy, Slideous, DZSlides, ujawnić.js lub S5 HTML pokazy slajdów. Może również generować dane wyjściowe w formacie PDF w systemach, w których zainstalowany jest LaTeX.

Wypróbuj coś innego, na przykład Libreoffice - który może obsługiwać docx, pod warunkiem, że nie przeszkadza ci kilka błędów formatowania.

EDYTOWAĆ:

Opis mówi teraz, że Pandoc wydaje się teraz obsługiwać czytanie ze Word DOCX (a także DocBook i kilku innych formatów):

Pandoc to biblioteka Haskell do konwersji z jednego formatu znaczników na inny oraz narzędzie wiersza poleceń, które korzysta z tej biblioteki. Odczytuje markdown i (podzbiory) Textile, reStructuredText, HTML, LaTeX, MediaWiki, TWiki, Haddock, OPML, Emacs Org-mode, DocBook, txt2tags, EPUB i Word docx ; i umie pisaćzwykły tekst, znakowanie, reStructuredText, XHTML, HTML 5, LaTeX (w tym pokazy slajdów), ConTeXt, RTF, OPML, DocBook, OpenDocument, ODT, Word docx, GNU Texinfo, MediaWiki, DokuWiki, Haddock, EPUB (v2 lub v3), FictionBook2, Tekstylia, strony man groff, Emacs Org-Mode, AsciiDoc, InDesign ICML oraz pokazy slajdów Slidy, Slideous, DZSlides, discal.js lub S5 HTML. Może również generować dane wyjściowe w formacie PDF w systemach, w których zainstalowany jest LaTeX.


Jak sugeruje @evilsoup, może to działać:

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

Tak, możesz użyć polecenia libreoffice z --outdir, ale wyjście html nie zawsze działa w ten sposób ...

Dałem ten szybki test i wydawało się, że działa, oprócz awarii Pandoc z powodu obrazu gif w dokumencie buźka

Wilf
źródło
Um .... Słowo docx jest tam w cytowanym tekście (zaraz po OpenDocument i ODT). To powiedziawszy, docx wciąż nie jest dobrze udokumentowanym formatem, a zatem rzeczywista kompatybilność w otwartym świecie jest… niejednoznaczna, powiedzmy, a twoja sugestia dotycząca LibreOffice (wraz z różnicami formatowania ) jest dobra.
SuperMagic,
@SuperMagic - jest w tym, że może pisać do ... Podkreśliłem to, aby ułatwić.
Wilf,
1
Jeśli naprawdę chcesz pliku PDF w stylu pandoc (faktycznie stworzonego przez LaTeXa), możesz także użyć LibreOffice do konwersji docx na HTML, a następnie użyć go jako danych wejściowych dla pandoc (w zależności od kompetencji osoby, która utworzyła oryginalny dokument, być może trzeba usunąć kilka <BR>sz html).
evilsoup
1
W OSX plik wykonywalny nazywa się soffice i można go znaleźć w /Applications/LibreOffice.app/contents/MacOS/bin. Więcej informacji można znaleźć tutaj: ask.libreoffice.org/en/question/12084/…
Tim Saylor
2
Pandoc wymienia teraz Word Docx jako obsługiwany format w dokumentacji.
cledoux,
12

To wciąż pojawia się przy wyszukiwaniu w Google, więc chciałem to zapisać: pandoc nie mógł odczytać docx, gdy zadano to pytanie (błąd pochodzi z próby odczytania pliku binarnego), ale od wersji 1.13 może, i robi całkiem dobra robota.

jkr
źródło
2
Pandoc nie zachowuje jednak oryginalnego formatowania projektu. Zobacz ten post: github.com/jgm/pandoc/issues/2206#issuecomment-107994587
orschiro