Легкость бытия: Antiword, reST

    Как при подготовке документов избежать медлительных офисных пакетов, пользоваться любимым текстовым редактором, отделить содержание от представления, обеспечить высокую читаемость и прозрачность документов для VCS, легко сравнивать версии текстов?

    Недавно комментировал извещение о выходе нового LibreOffice и решил, что следует оформить соображения более связно.

    Представим, что мы получили по e-mail документ в формате MS Word, должны его заполнить/поправить и распечатать/переслать дальше. Скорее всего, этот документ нам будут периодически присылать снова и/или нам нужно будет на его основе и далее готовить обновленные тексты.

    Проблема №1: на нашем GNU/Linux, естественно, отсутствует MS Office, а OpenOffice и его наследники страшно тормозят (особенно если мы привыкли к Vim и др. легким программам).

    Проблема №2: очень часто верстка входящих файлов — катастрофическая (отбивка пробелами, форматирование без стилей и т.д.), так что приходится практически переделывать весь документ, чтобы нормально внести изменения.

    Проблема №3: формат MS Word непрозрачен, а OpenDocument условно-прозрачен. Другими словами, даже открытый формат невозможно легко читать простыми средствами: нужно разархивировать кучку файлов и парсить XML. А значит, и для контроля версий такие документы непрозрачны.

    Что же делать? На помощь приходит юникс-вей в виде простых программок, работающих с простым текстом.

    Инструменты

    • Antiword — утилита для извлечения текста из формата MS Word;
    • reStructuredText (reST) — очень простой и достаточно мощный язык семантической разметки текста;
    • Docutils tools (rst2latex, rst2html, rst2odt, rst2xml) и rst2pdf — утилиты для экспорта текста из reST в распространенные форматы для верстки, веба и печати;
    • Бонус: rst2a (онлайн-конвертер с API!)

    Workflow

    1. antiword читает .doc и выводит простой текст;
    2. редактируем простой текст;
    3. утилиты rst2* конвертируют текст из reST-разметки в произвольные форматы.
    Например, мы получили документ в формате MSWord, хотим что-то быстро исправить в нем и сохранить себе текст/шаблон на будущее:

    $ antiword смета.doc > смета.txt
    $ vim смета.txt
    $ rst2pdf смета.txt -o смета.pdf

    Готово, красивый PDF можно посмотреть и распечатать. Кстати, удобно в процессе редактирования исходника держать PDF открытым, скажем, в Okular. При экспорте из reST в PDF (а это можно делать и автоматически) Okular сразу же обновит содержимое, не сбрасывая открытую страницу. Получается почти моментальный предпросмотр. И там же (в Okular) можно распечатать документ.

    Я обычно добавляю еще файл стилей (один и тот же более-менее подходит всем документам, можно расширить под конкретный документ). Стили для rst2pdf пишутся в JSON (см. документацию).

    Результаты


    Проблема №1 решена: используются кроссплатформенные, лёгкие, быстрые и ненавязчивые средства.

    Проблема №2 решена: кошмарная исходная верстка сразу убивается, вместо нее мы получаем сам текст, который уже без труда можно привести в reST-порядок. При необходимости результат можно довести в LaTeX'е.

    Проблема №3 решена: все документы (и стили) полностью прозрачны для VCS и могут быть прочитаны без спецсредств. В точности как программный код. Значит, если что-то изменилось в официальном документе, вы всегда будете иметь читабельные диффы для любых дат. Для входящих можно тоже хранить исходные версии (желательно вывод antiword), чтобы диффать именно их и легко переносить только изменения в правильные reST-файлы.

    Примечания

    • Предлагаемый стек утилит заткнет не все дыры. Прелесть юникс-вея в том, что вы можете спокойно заменять компоненты.
    • Между прочим, Antiword «is able to convert Word documents to plain text, to PostScript, to PDF and to XML/DocBook», так что в ряде случаев можно даже избежать reST.
    • Эта заметка написана на reST и экспортирована через rst2html. ;-)
    • UPD: спасибо ingspree за поправку: правильно не ReST, а reST :)
    Поделиться публикацией
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 72
    • +4
      А что делать принимающей стороне, которой вместо редактируемого word присылают PDF?
      • 0
        Если принимающая сторона хочет именно в формате MS Word и именно в исходном форматировании, нужно использовать офисный пакет, причем желательно тот же самый. Ну или сменить принимающую сторону. :-)
        Если принимающая сторона согласна на OpenDocument, достаточно rst2odt.
        Если нужен документ в MS Word, но допустима замена неряшливого форматирования на правильное, можно к концу цепочки добавить OpenOffice (для odt→doc). Тогда офисным пакетом можно будет пользоваться в 2 клика, тормоза не повлияют на работу. Кстати, наверно, можно и без GUI, я просто не в курсе.
      • +2
        Идея интересная, но, по-моему, оправдана только для случаев когда один и тот же документ неоднократно «отфутболивается» взад-вперёд, то есть когда воссоздание оформления оригинального документа на, имхо, довольно экзотическом языке окупится. К тому же, как я понял при беглом просмотре доков, для каждого выходного формата (pdf, html, odt) нужно создавать свои стили на своём языке.
        • –1
          маркдаун лучше.
          • +2
            markdown проще, а расширять его сложнее.
            Субъективные преимущества лишь в некоторых синтаксических конструкциях, не больше.
            • –2
              Думаю, выскажу мнение всех блоггеров мира если скажу.

              Маркдаун — говно!!!

              А в данном случае ещё и просто неприменим.
              • –4
                сам ты говно. почему не применим?
                • –3
                  Слушай, говно, давай не будем переходить на личности. :)

                  Элементарно. reST — это то, что ты из него сделаешь, markdown — это то, что из него сделал разработчик. А он сделал недостаточно для представления некоторых даже самых простых фич офисных форматов.
          • +2
            А я надеялся на краткий обзор собственно возможностей reST, включая вышеупомянутые стили. Что там с такими вещами как отступы, колонтитулы, списки, содержание, контроль разбивки страниц и т.п? Хотелось бы получить ответы на эти вопросы прежде чем лезть в документацию с головой.
            • 0
              reST — не LaTeX, его нельзя использовать совсем для всего. Это одна из самых мощных и расширяемых разметок среди легко читаемых (наряду с Markdown, Textile и всякими вики-разметками).

              Тем не менее, колонтитулы поддерживаются. И вот, кстати, неплохой tutorial по презентациям (в сравнении с LaTeX). Рассматривается и отбивка страниц (по заголовкам, вроде). Вполне в духе этой заметки. Жаль, я только сейчас на этот tutorial наткнулся.

              В целом, reST, наверно, самый популярный язык для документации программ, написанных на Python. Питонисты обычно используют reST в сочетании со Sphinx. Документация самого Питона так и подготовлена. Естественно, это подразумевает легкое построение содержания произвольной глубины по набору документов (т.е. каждую главу можно хранить в отдельном файле).
              • 0
                Понятно, что от подобного языка всей мощи LaTeX'а не стоит ожидать. Просто последний уж через чур громоздкий всё же и хочется найти золотую середину.
            • +2
              «Легкость бытия», ха-ха. И ради чего все эти телодвижения?
              • +1
                Чтобы нормально работать, а не ждать, пока очнется текстовый процессор. И чтобы печатать, а не щелкать мышью. И диффы в VCS… кажется, я повторяюсь. Прочтите топик, там всё сказано.
                • 0
                  Компьютер, на котором летает опенофис, можно собрать за астрономическую сумму в 15к рублей. И все проблемы, которые Вы описываете, просто исчезают. В чем же прелесть такого вот юникс-пути?
                  • +2
                    Компьютер, на котором летает опенофис, и компьютер, на котором летает Firefox с кучей вкладок, редактор, плеер,… И опенофис — это очень разные компьютеры.

                    Опенофис действительно часто тормозит. Если пользователь этого не замечает, у него либо весьма дорогой компьютер, либо просто привычка к заторможенности программ.
                    • +1
                      … и да, скорость работы — лишь одна из нескольких проблем. Вы не читали топик или троллите.
                      • 0
                        Я вот читал топик (честно!), но согласен с вашим оппонентом в том, что какого-то очевидного профита в предложенном вами решении не наблюдается. Ну, если не считать профитом возможность сказать «я сделал это unix-way».
                        • 0
                          Значит, вам не нужен контроль версий, вас устраивает форматирование входящих документов и вам нравится интерфейс/скорость офисных пакетов. ;-)
                          • +5
                            Нет, это значит, что я не готов тратить время на то, чтобы форматировать каждый документ вручную каждый раз, когда мне его присылают по электронной почте. Потому что:
                            1) все изображения, таблицы, ссылки, оглавления, колонтитулы и прочие сложности — в жопу;
                            2) в разы дольше, чем сделать это в «медленном» OO;
                            3) каждый раз есть шанс что-то «недоформатировать».
                            Ну и по мелочи всякое, как-то редактирование текста без спеллчекера.
                            • –3
                              0. Предложенный вариант не предназначен для затыкания всех дыр. Всякий инструмент хорош на своем месте.
                              1. Нет, если диффать. Хотя it depends.
                              2. Нет, если диффать. Хотя it depends.
                              3. Иногда да. Сильно зависит от типа документа и ситуации.

                              Не знаю, зачем нужен спеллчекер, но без vim редактировать текст очень неудобно. Опять же, всё зависит от человека.
                              • +1
                                Предложите способ дифать .doc хотя бы. А то вы говорите «не нужно», а другого решения не предлагаете.
                                • 0
                                  Google их предлагает 43 млн.
                                  • +1
                                    Онлайновые сервисы, GUI-программы, куча всего windows only… а есть простая кроссплатформенная консольная утилита, которую можно соединять с произвольными другими? Я пока нашел только Antiword.
                                  • +1
                                    …и я не думаю, что предложенный в этом хабратопике вариант можно рассматривать как хороший и правильный способ отслеживать изменения в документах MS Word. Прежде всего потому, что на мало-мальски сложных документах эта процедура ну никак не будет соответствовать заголовку этого хабратопика («Легкость бытия»). :)

                                    А вообще самый лучший способ «дифать .doc» — использовать его встроенные средства, предназначенные именно для этого (я имею в виду «Рецензирование»). Правда этот вариант проходит только в процессе обмена документами с более-менее продвинутыми пользователями, да.
                                    • 0
                                      Рецензии интегрируются с какой-то из популярных VCS? Mercurial там, или git.
                                      • 0
                                        Нет. А должны?
                                        • +1
                                          Должны, потому что так проще, если вы работаете не с парой документов, а со многими. Впрочем, зависит от приоритетов и привычек.
                                          • 0
                                            ОК, приведите примеры инструментов, работающих с чем-то сложнее плоского текста, которые интегрируются с системами контроля версий.
                                            • 0
                                              Что значит «сложнее плоского текста»? Если вас интересует вставка изображений, сложные таблицы, всякие хитрые ссылки, генерирование содержания и т.д., посмотрите Sphinx. Тот же reST.
                                              • 0
                                                На входе там плоский текст.
                                                • 0
                                                  Ну так в том и дело! :-)
                                                  Иначе всё было бы гораздо сложнее.
                                                  А вот объекты, которые бессмысленно сводить к плоскому тексту (например, картинки) — они блобами хранятся в VCS.
                                                  Вас что-то не устраивает в этом?

                                                  Честное слово, я с самого начала не могу понять, о чем спор. Я описал вариант решения трех проблем. Вы утверждаете, что он не нужен. Я объясняю, что он не нужен лично вам, но очень нужен, например, мне. Сейчас мы вроде как не можем решить, надо ли текст хранить как текст, если кроме текста есть что-то еще. Бр-р-р. Может, каждый просто будет поступать так, как считает нужным? Вот правда-правда, я не хочу вас переубедить, я просто хочу, чтобы мой опыт пригодился тем, у кого ситуация и требования совпадают с моими.
                                                  • 0
                                                    Проблемы кажутся притянутыми за уши, честно говоря. Особенно первые две. У меня, правда, никода не возникало необходимости загонять переписку (посредством файлов MS Word(!)) в VCS, если бы я с такой проблемой столкнулся — возможно смотрел бы на топик немножко по-другому. А так для меня это всё выглядит как придуманная жизненная сложность и большая связка костылей для её решения. :) Причем, подозреваю, что не только для меня.
                                                    • 0
                                                      Ага, вас двое. ;)
                                                  • +1
                                                    Разделение форматов на текстовые и бинарные очень условно. reST — такой же формат как и остальные. Он сложнее плоского текста, на содержимое документа reST накладываются дополнительные ограничения. Среди его преимуществ — возможность работать без спец. ПО и версионификация стандартными средствами. Формат .doc этих преимуществ не имеет.
                                            • 0
                                              Нет, конечно. Но задача данного топика требует.

                                              Т.е. вы выдумываете себе какие-то другие задачи и предлагаете способы их решения, а лучших способов решить задачу данного топика так и не предложили.

                                              > избежать медлительных офисных пакетов, пользоваться любимым текстовым редактором, отделить содержание от представления, обеспечить высокую читаемость и прозрачность документов для VCS, легко сравнивать версии текстов

                                              Хорошо, вы решили последнее и сказали, что первое «не нужно» (вам, но не neithere). Как быть с остальным?
                                          • +2
                                            Самый лучший способ сравнивать версии .doc — использовать монструозный проприетарный офисный пакет, не работающий на ряде платформ.

                                            Самый лучший способ сравнивать версии текста — использовать простой текст и нормальные системы контроля версий по вкусу.
                                            • 0
                                              Вы совершенно правы.
                                              • 0
                                                Т.е. вы признаёте что ваше решение — это решение какой-то другой задачи, а не представленной в первом абзаце топика.
                                                • 0
                                                  Я признаю, что при работе с .doc (а также .ppt, .cdr, .psd, .mp3, .wav и т.п.) всегда надо помнить, что это не текст. :)
                                                  • 0
                                                    Т.е., название программы — Word — вводит в заблуждение. И mp3 не музыка, потому что туда можно встроить и текстовые комментарии, и даже изображения. Да, да, да. )

                                                    Вот reST именно этим и лучше: отдельно чистый текст, чистые изображения, чистые стили — и нет каши, которую потом можно разобрать только тяжелой артиллерией.
                                          • +1
                                            Кстати, только что навскидку посмотрел офисные пакеты на предмет штатных средств для сравнения версий, и обнаружил следующее:
                                            1) MS Word поддерживает настоящий diff «из коробки», режим рецензирования включать не нужно. Просто на закладке «Рецензирование» жмем «Сравнить», выбираем 2 файла — получаем красиво нарисованные различия между ними → Profit! :)
                                            2) OO тоже поддерживает нечто подобное, но в рамках версий одного файла (пункт меню File > Versions). Так что немножко танцев с бубном: создаем новый документ, вставляем туда содержимое первой версии файла, сохраняем версию, потом вставляем содержимое второго файла, сохраняем версию и просим сделать сравнение двух версий → Profit.

                                            Не устроят вас такие решения? Обязательно надо электронный микроскоп vim и командную строку? :)
                                            • 0
                                              Понимаете, это всё очень хорошо, но если я и дома, и на любом сервере использую одни и те же программы (например, vim, diff, hg) для работы с «околокомпьютерным» текстом, то не гораздо удобнее с их же помощью работать и с текстом любой другой тематики. И действительно проще прицепить конверторы на вход/выход, чем поддерживать и углублять навык работы в еще одной сложной узкоспециализированной среде для достижения того же результата. И невозможность прямой работы с материалом выглядит существенным недостатком.
                                              • 0
                                                s/то не/то мне/
                                                • –1
                                                  Не-а, не понимаю. Если с предложенным мной способом проблему можно решить, условно, за 1 минуту, а предложенным вами — за 10 минут (и по ходу наделать при этом ошибок) — мне искренне непонятно, чем же ваш способ лучше.

                                                  Ваше решение полностью автоматизировано? Нет, после AntiWord кучу всего приходится править ручками, в vim-е. Оно универсально? Нет, некоторые нюансы .doc файлов в reST воспроизвести не получится. Оно быстрее, чем открыть (даже на медленном компе и в медленном OpenOffice) документ, и внести туда изменения? Хрена с два.

                                                  Тогда ради чего? Ради внесения правок в теплом ламповом vim-е и использования все мощи и гибкости nix-систем? Смешно. :)
                                                  • 0
                                                    Tonight on «It's the Mind», we examine the phenomenon of deja vu. That strange feeling we someti.........mzget…

                                                    Ладно, еще раз пластинку покрутим для истории, вдруг пригодится кому.

                                                    1. Получаем жуткое месиво под названием «служебная записка», пропускаем через aw (1 сек), получаем чистый текст. Сохраняем как есть.
                                                    2. Копируем как reST-файл, приводим в порядок (1-3 мин), отныне все новые служебки _мы_ будем начинать отсюда. Отправляем на печать.
                                                    3. Приходит новая служебка; пропускаем через aw (1 сек), диффаем с предыдущим вариантом (2 сек), видим 2-3 изменения, добавляем их в reST (20 сек), отправляем на печать.

                                                    Т.о., единоразовые затраты в пределах пары минут, а повторяющиеся сравнимы с временем запуска OOo и включают в себя проверку корректности изменений.

                                                    Вы пробовали привести в порядок документ, сверстанный типичным пользователем? Если вам это не интересно, перестаньте меня донимать вопросами, пожалуйста. Если интересно, то сами знаете, что проще переделать — и я вам показываю, как.

                                                    Наверно, я не прав, что сделал акцент на antiword'е, надо было подчеркнуть, что документы удобно верстать в reST с нуля. С другой стороны, показалось занятным, что с минимальными усилиями в такую системку втыкается и более-менее типичный workflow.
                                                    • 0
                                                      Чёрт, только здесь понял, для чего нужна была вся эта канитель — вам регулярно присылают много страниц ЦУ в ворде, изменяя только пару строчек.
                                                      Я бы, наверное, попытался использовать VBA или решить проблему на человеческом, а не техническом уровне — требованиями писать более понятно и выделять изменения в документе штатными средствами.
                                                      • –1
                                                        Присылают не ЦУ, а материалы для очеловечивания и дальнейшей публикации. Увы, на той стороне проблема не решается.

                                                        Но еще раз отмечу, что это вторичное применение «системы». Первичное — подготовка документов с нуля, полный замкнутый цикл. Я об этом мечтал при написания диссертации, но тогда никаких rst2pdf и в помине не было, а LaTeX казался (и, наверно, был) оверкиллом.
                                                  • –1
                                                    * предлагаю поместить информацию из этого моего комментария в виде апдейта к топику (чтобы он соответствовал своему громкому названию ;) ), вынуть ваш минус из моей кармы и расходимся.
                                • НЛО прилетело и опубликовало эту надпись здесь
                                  • 0
                                    Не знаю, потому что винду я снес несколько лет назад =)
                                    Из docx обычно извлекаю текст через Google Docs.
                                    • НЛО прилетело и опубликовало эту надпись здесь
                                    • 0
                                      qme.ru
                                      Правда, работало только в IE. Но под виндой это не проблема =)
                                      • 0
                                        Проверил кстати что сохраняет офис.

                                        
                                        <html>
                                        
                                        <head>
                                        <meta http-equiv=Content-Type content="text/html; charset=windows-1251">
                                        <meta name=Generator content="Microsoft Word 14 (filtered)">
                                        <style>
                                        <!--
                                         ***
                                        -->
                                        </style>
                                        
                                        </head>
                                        
                                        <body lang=UK>
                                        
                                        <div class=WordSection1>
                                        
                                        <h1><span lang=EN-US>Hello</span></h1>
                                        
                                        <p class=MsoNormal><span lang=EN-US>Some test</span></p>
                                        
                                        </div>
                                        
                                        </body>
                                        
                                        </html>
                                        

                                        Я бы не сказал что все так плохо.
                                        • НЛО прилетело и опубликовало эту надпись здесь
                                          • 0
                                            По памяти. Office 2010/Save as/Web page (filtered).
                                      • +1
                                        Т.е. берем «неправильный» формат Word, выбираем только текст, вручную форматируем заново, сохраняем в любой из «правильных» форматов… Из причин, нормально понял только про скорость и возможность хранить изменения. «Нормальные кроссплатформенные средства» — это скорее не причина, а инструмент для ее решения.

                                        По поводу скорости, то сколько итераций вопрос-ответ-… должно быть, чтобы ваш вариант был быстрее, чем открыть в медленном OO?

                                        OpenOffice.org сейчас под рукой нет, но в MS Word есть замечательный режим рецензирования.

                                        Я правильно понимаю, что любая вставленная картинка приведет к ее потере?

                                        А сложное форматирование придется делать через Ж… Т.е. открыть в тормозном ОО, сделать текст, подогнать форматирование до уровня тормозного ОО, сохранить в какой-то «правильный» формат.
                                        • 0
                                          Про «итерации вопрос-ответ» не понял. Одно точно могу сказать: пока OOo запускается, я уже внесу правку через vim и отправлю документ на печать.

                                          Antiword не сохраняет картинки, да. Их можно втыкать отдельно. Это будет разумно, если вы составляете документ самостоятельно.

                                          Насколько сложное форматирование? reST довольно мощный, это не вики-разметка. Если не хватает — разумеется, не надо его притягивать за уши, берите LaTeX.

                                          Еще раз: описанное решение не призвано заткнуть все дыры.
                                          • 0
                                            Чем бы их Word получать reST с сохранением форматирования (хотя бы выделением заголовков, жирности, курсивности и т.д.)?
                                            • 0
                                              Хорошо бы, угу. Хотя я обычно получаю файлы, в которых заголовки оформлены нажатием кнопочки «жирный» и выбором размера шрифта. Ну и всё в этом духе. В результате проще взять чистый текст и привести его в норму, чем возиться с первоначальной кашей. В хорошем тексте то или иное выделение встречается довольно редко и его без труда можно перенести вручную.
                                              • +1
                                                Аналогично получаю файлы, в которых заголовок отмечен жирным. Но не всегда хочу вдумчиво перечитывать весь файл. Одно дело — найти, где заголовок отмечен жирным — и исправить (в reST), другое дело — вдумчиво перечитывать файл в поисках подзаголовков. Если же в длинном тексте автор одно слово выделил курсивом — то твоим методом ты это слово почти наверняка упустишь.

                                                ЗЫ. Я для себя в свое время использовал wiki-разметку вместо reST и html2wiki — простые теги он преобразует в вики-разметку, сложные оставляет прямо html — т.е. сразу видно, где надо руками не забыть сконвертить. Из ворда сначала приходилось конвертить в HTML…
                                              • 0
                                                P.S.: man antiword :)
                                                в т.ч. antiword -f foo.doc
                                                • 0
                                                  У меня не установлен. Поэтому поясни, что означает -f?
                                                    • +1
                                                      Ой. Я правильно понимаю, что antiword выдаст жирный текст как *text*, а reST потом поймет *text* как курсив?
                                                      • +1
                                                        В reST нет «жирного» и «курсива», тк это семантическая разметка. Там есть emphasis и strong emphasis (транслируются в em и strong). Да, произойдет смещение акцентов. Антиворд генерит дурацкую вики-разметку. Ну и понятно, что тупо прогонять результат через регексы в данном случае небезопасно. Я думаю, что при необходимости соблюсти совершенно правильное форматирование надо не сразу гнать в reST, а сначала в какой-то из XML-based форматов (напр., antiword -x db foo.doc > foo.xml && db2rst.py foo.xml foo.rst).
                                                        • 0
                                                          это не вики-разметка, эта штука родом из емейлов, ньюсов и фидо, когда никаких вики ещё не было :)
                                              • –1
                                                Может вам стоит девушку завести 0_о
                                                А то, чувствую, слишком много свободного времени на всякие глупости.
                                                • –1
                                                  Еще одну? о_О
                                                  И, да, мне очень, очень важно было услышать именно Ваше мнение!!! ))
                                                • 0
                                                  В дополнение — замечательная статья «Документооборот: LaTeX to All, или мы будем прогибаться под испорченный мир» (Владимир Игнатов, 2004)
                                                  • +1
                                                    wvware.sourceforge.net/ умеет из doc делать LaTeX. Мне пока не на чем попробовать, но обещают читабельный и чистый LaTeX.
                                                    • 0
                                                      Ага. В статье (см. линк в предыд. комменте) упоминается эта штука. Я пробовал только doc→plaintext, качество действительно очень хорошее, в тч таблицы идеально транслируются в reST-совместимые. Но нет настроек процесса, поэтому всякие лишние отступы придется корректировать дополнительно.

                                                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.