Задача

Так случается, что время от времени бывает нужно оформить текстовый документ в соответствии с ГОСТ, то есть сделать и заполнить рамки и штамп. Кому-то это нужно по работе, кому-то по учебе, кому-то редко, кому-то постоянно... Вариантов решения этой задачи множество и я попробую описать некоторые из них, а также предложить еще один способ. Итак, рассмотрим некоторые способы решения поставленной задачи.

LaTeX

Одним из самых изящных и мощных способов решения этой задачи является использование LaTeX в качестве системы разработки документации. Для него существуют даже уже готовые пакеты для оформления документов в соответствии с ГОСТ, например, eskdx (там надо всего-лишь чуть-чуть подправить стили оформления под свои нужды, а, возможно, вас устроит и то что есть).

LaTeX имеет огромные преимущества перед традиционными средствами разработки документации (не только уже готовое решение с рамками и штампами), и я даже не буду пытаться описать большую их часть здесь. По этой системе есть горы литературы (в том числе и на русском языке).

Реально непреодолимый недостаток у LaTeX только один:
процесс разработки документации при помощи него очень сильно отличается от всем известных и самых распространенных технологий (я имею ввиду WYSWYG-разработку, то есть то, что предполагается при использовании Microsoft Word, OpenOffice.org, KOffice, AbiWord, и т. п.). При разработке LaTeX документов (если кто-то не знаком с этой замечательной системой) исходный документ довольно сильно отличается от того, что получается в результате. То есть, если говорить упрощенно, то исходный документ представляет собой простые текстовые файлы, в которых присутствуют элементы разметки. Как в html, только гораздо более мощно и гибко. При использовании "офисных" пакетов, пользователь сразу в процессе набора текста видит приблизительно то, что и получит в итоге.

К сожалению, в реальной жизни столь кардинальные отличия процесса разработки документации чаще всего перевешивают все достоинства. Если на предприятии так сложилось, что используются именно, так называемые, "офисные" пакеты, причем используются давно (не думаю, что сильно ошибусь если скажу, что это справедливо для более чем 90% предприятий). Если накопился громадный архив документов в форматах "офисных" пакетов, и они используются для создания новых документов. Если люди не видят преимуществ перехода на новую систему и не хотят даже пробовать и обучаться. Если другие предприятия-партнеры, которым созданная документация поставляется в электронном виде, используют только "офисные" пакеты. В общем, все эти "если" зачастую приводят к невозможности использования таких систем как LaTeX.

Рамки в колонтитулах

Еще один вариант решения проблемы рамок - "нарисовать" их прямо в документе и поместить в колонтитулы, чтобы не мешали набору текста. Большинство современных офисных пакетов позволяют проделать эту процедуру.

Вариант этот заманчив, достоинства его очевидны, но он обладает также и рядом существенных недостатков. Большинство недостатков связаны с существенным усложнением внутренней структуры документа.

Отсутствует переносимость. То есть сделав такой документ, к примеру, в Microsoft Word, с ним не получится нормально работать в OpenOffice.org, несмотря на то, что последний позволяет работать с форматами первого - слишком сложная структура документа. Это же самое относится и к варианту преобразования через rtf, html или любой другой универсальный формат (во многих из них и рядом нет такого понятия как "рамки в колонтитулах").

Другим неприятным следствием излишне сложной внутренней структуры документа является невозможность создания больших документов. Когда количество листов документа переваливает за 100, а сам документ при этом изобилует таблицами, списками, рисунками, формулами, да еще и рамки в колонтитулах, то редактор начинает "глючить", без видимых причин "вылетать", случайно выделять фрагменты, "тормозить" и т. д.

Рисовать рамки отдельно

Еще есть вариант, когда документ создается без рамок, а потом запускается макрос, который рисует рамки поверх текста, но! Такой макрос еще надо создать (хотя и не сверхзадача, но время отнимет), а самое непрятное, что реально это работает не совсем так как хотелось бы. Точных причин этого не знаю, но реально рамки "съезжают", "наползают" друг на друга и прочее. Возможно это происходит из-за постоянного автоматического форматирования (разбивка на страницы, выравнивание абзацев и т. п.), возможно из-за тесной привязки координатной системы к текстовым абзацам и другим объектам на странице (реально не помогает даже принудительная привязка к странице, а не к абзацу). В общем, даже если удается сделать вроде бы нормальные рамки - все может резко поменяться от простого нажатия "предварительного просмотра".

Разновидность этого способа: "мухи отдельно - котлеты отдельно". Распечатываем рамки, а потом распечатываем документ на листах с ранее напечатанными рамками. Вроде и работает, а вроде и 21 век на дворе (это не считая того, что из принтера листы не выходят идеально ровно, поэтому особо "кривые" листы придется перепечатывать заново). А если в документе содержатся таблицы, да еще и такие, у которых левый и/или правый край находятся близко к рамке, то малейшая кривизна рамки относительно края таблицы сразу бросается в глаза.

CAD системы

C CAD системами (AutoCAD, PCAD, ...) все совсем просто: рамки и чертежи сделать не проблема, но реально разрабатывать текстовые документы при помощи них невозможно!

phpstamp

В результате экспериментов с вышеописанными способами появилась идея как все-таки сделать рамки, избежав при этом недостатков этих способов (естественно, это касается только ситуаций, когда использование LaTeX невозможно).

Суть идеи заключается в следующем. Преобразовать документ в формат pdf, а затем, добавить к уже готовому документу рамки и штампы.

PDF формат выбран не случайно. Во-первых, это стандартный формат для документации (это означает еще и отсутствие проблем с просмотром и печатью на большинстве современных платформ и операционных систем). Во-вторых, создать pdf-файлы можно практически из всего, что можно напечатать (где-то штатные средства экспорта в pdf, например, в OpenOffice, ghostscript, где-то при помощи сторонних программ, например, для пользователей windows есть бесплатный PDFCreator).

Есть замечательная библиотека для работы с pdf-файлами - pdflib. Она позволяет на многих языках программирования формировать pdf-файлы. К сожалению, ее бесплатная версия не позволяет читать pdf-файлы и добавлять к ним дополнительные элементы. Зато это может модуль PDF из библиотеки Zend Framework, написанной на php и для php. Программа ttf2pt1 позволяет преобразовывать шрифты формата TrueType в шрифты формата Type1, а утилита makefont из пакета FPDF позволяет формировать из них метрики, необходимые для определения реальных размеров текста (к сожалению, методы, предусмотренные для этих целей в Zend Framework некорректно работают с не-английским текстом).





Последние изменения были внесены 05.11.2008.