Разработка программного продукта обеспечивающего экспорт спецификации из приложения PartList

Тип работы:
Дипломная
Предмет:
Программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

Содержание

ЗАДАНИЕ

РЕФЕРАТ

  • ВВЕДЕНИЕ. ПОСТАНОВКА ЗАДАЧИ НА УРОВНЕ ЦЕЛЕЙ
  • 1 ОБЗОР СУЩЕСТВУЮЩИХ МЕТОДОВ И СРЕДСТВ РЕШЕНИЯ ЗАДАЧИ
    • 1.1 Выбор метода передачи информации
    • 1.2 Выбор формата для представления
    • 1.4 Выбор метода построения пользовательского интерфейса
  • 2 ОПИСАНИЕ СТРУКТУРЫ, ПРЕОБРАЗОВАНИЯ И ПРЕДСТАВЛЕНИЯ ИНФОРМАЦИИ С ПОМОЩЬЮ ТЕХНОЛОГИЙ XML-XSL
    • 2.1 Механизм преобразования XML в PDF. Постановка задачи
    • 2.2 Расширяемый язык разметки XML
    • 2.3 Язык стилей XSL
    • 2.4 Текстовые процессоры
  • 3 РЕАЛИЗАЦИЯ ПРЕДСТАВЛЕНИЯ СПЕЦИФИКАЦИИ В XML-ФОРМАТЕ И ЕЕ ПРЕОБРАЗОВАНИЕ В PDF-ФОРМАТ
    • 3.1 Разработка структуры xml-файла
    • 3.2 Применение XSLT-инструкций для разработки шаблона XSL
    • 3.3 Разработка шаблона XSL
    • 3.4 Алгоритм преобразования исходного XML в новый XML
    • 3.5 Использование MSXSL и Apache FOP
  • 4 РАЗРАБОТКА КОНВЕРТЕРА XML-ПРЕДСТАВЛЕНИЙ ГРУППОВЫХ СПЕЦИФИКАЦИЙ НА СБОРОЧНОЕ ИЗДЕЛИЕ В PDF-ФОРМАТ
    • 4.1 Разработка приложения
      • 4.1.1 Реализация пользовательского интерфейса
    • 4.2 Создание инсталляционного пакета
    • 4.3 Руководство пользователя
  • 5 ОРГАНИЗАЦИОННО-ЭКОНОМИЧЕСКИЕ РАСЧЕТЫ
    • 5.1 Обоснование необходимости и актуальности разработки
    • 5.2 Определение трудоемкости разработки программного продукта
    • 5.3 Определение состава исполнителей
    • 5.4 Расчет сметной стоимости и договорной цены разработки ПП
    • 5.5 Расчет трудоемкости сопровождения ПП
    • 5.6 Определение стоимости сопровождения ПП
    • 5.7 Планирование цены ПП
    • 5.8 Анализ конкурентоспособности и качества разрабатываемого программного продукта
    • 5.8.1 Анализ технической прогрессивности разрабатываемого ПП
    • 5.8.3 Анализ соответствия разрабатываемого программного продукта нормативам
    • 5.8.4 Анализ экономических показателей разрабатываемого ПП
    • 5.8.5 Оценка конкурентоспособности ПП
    • 5.9 Анализ технико-экономических показателей разработки и эксплуатации ПП
  • 6 БЕЗОПАСНОСТЬ И ЭКОЛОГИЧНОСТЬ
    • 6.2 Шум на рабочем месте
  • Полученные результаты расчета сравниваются с допустимым значением уровня шума для отдельного рабочего места согласно СанПиН 2.2.4. 1191−03
    • 6.3 Расчет освещённости рабочей зоны
      • Расчет параметров вентиляции для помещения вычислительного центра, как средства защиты от факторов, пагубно влияющих на микроклимат рабочей зоны.
      • 6.5 Требования по пожарной безопасности
    • 6.6 Экологичность проекта
  • ЗАКЛЮЧЕНИЕ
  • СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ
  • ПРИЛОЖЕНИЯ
  • ВВЕДЕНИЕ. ПОСТАНОВКА ЗАДАЧИ НА УРОВНЕ ЦЕЛЕЙ
  • В наше время благодаря стремительному развитию вычислительной техники стали возможными разработка и использование систем автоматизированного проектирования и подготовки производства. Рынок специализированного программного обеспечения, или CAD (Computer Aided Design) технологий, насыщен всевозможными пакетами. Современные лидеры CAD систем — это так называемые системы «тяжелого» САПРа. К наиболее известным в промышленности «тяжелым» системам можно отнести следующие CAD системы: Creo, NX и CATIA. Основная часть таких пакетов — импортного производства, поэтому их надо приспосабливать к требованиям и традициям российских пользователей.
  • Внедрение зарубежных систем автоматизированного проектирования на российских предприятиях требует значительных усилий по их локализации, особенно в тех случаях, когда локализация не поддерживается разработчиком. Под локализацией в данном случае следует понимать как русификацию программного продукта, так и обеспечение возможностей оформления конструкторской документации по ЕСКД.
  • Локализацией одной из систем, а именно Creo, занимаются специалисты инженерно-консалтинговой компании Солвер. Данная промышленная система обладает возможностью параллельной разработки изделия: основной стратегией, применяемой ведущими компаниями. Многочисленный набор программных решений позволяет выбрать необходимую конфигурацию каждого рабочего места в соответствии с его функциональностью. Сюда включаются возможности промышленного дизайна, проектирования механических конструкций (в том числе, управление большими сборками), имитации функциональности изделия, изготовления и управления инженерными данными. На сегодняшний день решения Creo обеспечивают наиболее всестороннюю, интегрированную среду разработки продукта.
  • Основные задачи, которые ставятся перед любой системой автоматизированного проектирования — это сокращение сроков разработки нового изделия и повышение качества выполнения проекта. Creo решает эти задачи оптимальным путем. Программа обладает рядом преимуществ по сравнению с конкурентами. Но, как и любой другой продукт, не лишен недостатков [7].
  • Один из недостатков Creo — отсутствие удобных средств подготовки конструкторской документации в соответствии с отечественной ЕСКД. В том числе — средств формирования спецификаций на сборочное изделие.
  • Для преодоления указанного недостатка в компании «Солвер» был разработан плагин (надстройка) PartList для формирования спецификаций на сборочное изделие в соответствии с отечественными ГОСТами.
  • Модуль PartList предназначен для автоматизации процесса создания спецификации на сборочное изделие, разработанное в Creo (Рисунок 1). После установки модуль автоматически подключается в момент запуска Creo и позволяет назначать значения параметров спецификации компонентов сборки, устанавливать позиции компонентов (автоматически или вручную), формировать выходной документ для просмотра и печати.
  • Используя PartList, пользователь получает возможность:
  • — задать параметры спецификации детали в режиме детали;
  • — задать параметры спецификации сборочной единицы в режиме сборки;
  • — задать параметры спецификации элементов, не входящих в сборку, но представленных в спецификации (документация, ведомости, комплекты и т. п.);
  • — сформировать, просмотреть и распечатать спецификацию, не выходя из Creo;
  • — использовать при формировании спецификации автоматическое или ручное присвоение позиций;
  • — редактировать значения параметров спецификации и полей основной надписи в режиме просмотра документа [3].

/

  • Рисунок 1 — Фрагмент групповой спецификации по ГОСТ 2. 113−75
  • Однако предприятию, разрабатывающему изделие, необходимо не только подготовить и, возможно, распечатать документацию к нему, но и иметь возможность хранить и тиражировать эту документацию в некотором общеупотребительном, межплатформенном, электронном формате. Ведь для обеспечения долгосрочного преимущества в конкурентной борьбе организациям требуется высокоэффективное управление жизненным циклом изделий. Оно помогает сократить затраты, улучшить качество продукции, ускорить выход ее на рынок и обеспечить качественный сервис.
  • Основу управления жизненным циклом изделий составляет общекорпоративная информационная система управления для совместного создания, управления и использования актуальной информации об изделиях, объединяющая в единое информационное пространство людей, процессы, продукцию и информацию [8]. Для создания базы данных такой системы необходима документация в общеупотребительном электронном виде. PartList лишен возможности подготовки такой документации. Разработка средств экспорта спецификации из PartList в одном из стандартных форматов считается важной задачей. Их реализация позволит упростить процесс управления и передачи информации об изделии в рамках конструкторской подготовки производства. Уменьшить время на подготовку документации. Упростить процесс настройки рабочих мест пользователей.
  • Целью данной квалификационной работы является разработка программного продукта обеспечивающего экспорт спецификации из приложения PartList. Разрабатываемый программный модуль должен выполнять экспорт в стандартном, повсеместно используемом формате. При разработке механизма экспорта необходимо использовать современные, широко применяемые, хорошо документированные и по возможности открытые технологии.
  • 1 ОБЗОР СУЩЕСТВУЮЩИХ МЕТОДОВ И СРЕДСТВ РЕШЕНИЯ ЗАДАЧИ
  • 1.1 Выбор метода передачи информации
  • Один из способов передачи информации в файл, пригодный для чтения, был реализован специалистами «Солвер» в программном модуле, входящем в комплект программ поставляемых с PartList. Модуль Convertor. exe, реализованный средствами Visual Basic, способен конвертировать файл c расширением *. skd собственного формата PartList в файл формата, используемого Microsoft Word (расширение *. doc).
  • Рассмотрим другие общеупотребительные подходы.
  • В современном мире уже давно наметилась тенденция разбиения разного рода информации на группы. Человек, пришедший в магазин купить книгу по информатике, может легко найти её на отдельном стенде. Ярким примером разделения информации из жизни web-мастера служат HTML (Hypertext Markup Language — язык гипертекстовой разметки) и каскадные таблицы стилей CSS (Cascading Style Sheets) [1]. HTML — это стандартный язык разметки, используемый для описания того, как текст, изображения, гиперссылки и стандартные элементы графического интерфейса будут отображаться в web-браузере. Программист, разрабатывая web-страницу, вносит в текстовый файл данные, а так же элементы форматирования. Браузер загружая эту web-страницу, считывает данные и отображает их с учётом элементов форматирования. Но, в случае, когда для отображения объектов необходимо использовать большое количество элементов (тэгов) форматирования, гораздо удобнее воспользоваться CSS, определив в них новый элемент форматирования. Таким образом, создаваемый документ не загромождается лишней, повторяющейся информацией и легко воспринимается. Правда, HTML создавался для отображения информации и фокусируется на том, как выглядят данные. Соответственно полного отделения данных от их представления он не поддерживает. Более новой разработкой являются технологии XML и XSL.
  • Сейчас существует практически общепринятый подход, использующий связку технологий XML и XSL для представления, передачи и последующего преобразования информации.
  • XML (Extensible Markup Language — расширяемый язык разметки) — это язык разметки, описывающий целый класс объектов данных, называемых XML-документами. Он создан для описания данных и фокусируется на том, что они из себя представляют. XML предназначен для структурирования, хранения и передачи информации [2].
  • XSL (Extensible Stylesheet Language — расширяемый язык таблиц стилей) — язык стилей XML. Он может описывать преобразование XML в HTML, pdf и некоторые другие форматы. Может фильтровать и сортировать XML — данные, адресоваваться к разным частям документа. С помощью XSL возможно форматировать данные в зависимости от их значения [4].
  • Использование технологий XML и XSL позволяет отделить структуру данных от формата её представления и предоставляет средства для реализации нескольких представлений на базе одного XML-документа. Благодаря чему возможна разработка и последующее применение разных XSL-шаблонов для различных форм применяемых в ЕСКД, при одновременном использовании одной и той же структуры данных представленной в формате XML.
  • XML является платформенно независимым форматом, что открывает возможность его использования в среде любой операционной системы (при условии, что на персональном компьютере установлено соответствующее программное обеспечение). Использование XML не влечёт за собой покупки лицензии, он является открытым, бесплатно распространяемым форматом данных. Организация World Wide Web Consortium разработавшая и утвердившая стандарт XML предоставляет бесплатно распространяемый конвертор, объединения файлов XML и XSL, в форматы: PDF, PCL, PS, SVG, XML. Данный конвертор представляет собой fop-процессор (Formatting Objects Processor — процессор форматирующих объектов), именуемый Apache FOP [11]. Он является Java-приложением, которое считывает дерево форматирующих объектов и затем отображает полученную страницу в указанном формате вывода.
  • 1.2 Выбор формата для представления
  • Благодаря возможности отделения структуры данных от описания формы представления документа, XML возможно преобразовать практически к любому формату файла. На сегодняшний день существует большое количество программного обеспечения способного использовать XML-файлы и преобразовывать их в свой внутренний формат.

Так как наша документация будет представлена в виде таблиц, хорошим вариантом её электронного формата был бы xls, который в свою очередь является внутренним форматом программы Microsoft Excel. Данный программный продукт специально разрабатывался специалистами компании Microsoft для работы с таблицами, поэтому позволяет легко вносить изменения в них. С экономической точки зрения, для использования программного продукта Microsoft Excel необходима покупка лицензии предприятием, а так же пользователями электронной документации. К тому же, он предоставляет посредственный «механизм» защиты информации. В Microsoft Excel реализована возможность защиты документа от изменения, но в случае его пересохранения открывается возможность редактирования. Нельзя запретить копирование текста в буфер обмена. Есть вариант установки пароля на открытие файла, но ведь возможность чтения необходима. Данное приложение входит в состав Microsoft Office, являющийся платформозависимым пакетом программ для офиса, то есть входящие в него программы могут быть установлены на компьютер только с операционной системой Windows. Значит, пользователь, работающий на Linux или Mac OS, не сможет воспользоваться электронной документацией в формате xls.

Формат doc менее удобен для редактирования таблиц, к тому же он принадлежит приложению Microsoft Word, входящему в состав пакета программ Microsoft Office. То есть, он не лишен недостатков присутствующих у xls.

HTML — электронный формат файла предназначенный для представления информации в сети Интернет. Он является открытым, бесплатно распространяемым форматом. HTML предоставляет возможность редактирования хранящихся в нём данных. Для внесения изменений необходим простейший текстовый редактор, но для этого пользователю необходимо знать сам язык HTML (Hypertext Markup Language — гипертекстовый язык разметки) [1]. Данный формат файла является межплатформенным, то есть допускает своё использование на различных программных платформах (в различных операционных средах). HTML является альтернативой формату pdf, но не предоставляет возможности защиты данных от изменений, в отличие от конкурента. К тому же HTML не удобен при просмотре больших документов, так как позволяет сохранять каждую страницу только в отдельном файле.

Формат Adobe PDF (Portable Document Format — переносимый формат документов) является универсальным файловым форматом, который сохраняет все шрифты, форматирование, цвета и графику любого исходного документа независимо от того, в каком приложении и на какой платформе создавался этот исходный документ. Файлы Adobe PDF компактны, и любой пользователь бесплатной программы Adobe Reader может открывать к ним общий доступ, просматривать свои документы PDF и перемещаться по ним, а также печатать файлы PDF в точности такими, какими они были созданы. Adobe Reader, как правило, входит в состав программного обеспечения поставляемого с большинством новых персональных компьютеров.

Использование формата pdf не несёт за собой затрат связанных с покупкой лицензии ни со стороны предприятия, ни со стороны пользователя. Он предоставляет возможность защиты данных от копирования и последующего изменения. Листы документа хранятся в одном файле, что очень удобно. Приложения для чтения pdf-файлов распространяются бесплатно. Конвертор связки XML и XSL в PDF имеет бесплатную лицензию (приложение Apache FOP).

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

1.3 Выбор программных средств обработки древовидных структур данных

Для выполнения преобразования данных xml-документа, в соответствии с xsl-шаблоном, в файл формата PDF, необходимо соответствующее программное обеспечение.

Обработка файла формата XML и применения к нему элементов языка XSLT возможна с помощью:

— серверной программы, например, Java или JavaServer Page (JSP), которая использует таблицу стилей для автоматического преобразования документа и представления его клиенту;

— клиентской программы, например, браузера, которая выполняет преобразование путём чтения таблицы стилей, указанной с помощью инструкции по обработке < ?xml-stylesheet?> (эти функции в некотором объёме может выполнять Internet Explorer);

— отдельной программы, предназначенной для выполнения преобразования [1].

Приложения, выполняющие инструкции языка XSLT, называют XSLT-процессорами. В настоящей квалификационной работе в качестве XSLT-процессора был выбран программный модуль MSXSL, разработанный специалистами корпорации Microsoft. Он распространяется бесплатно, при этом предоставляя все необходимые средства для обработки элементов языка XSLT.

Для обработки файла, использующего форматирующие объекты языка XSL-FO и создания отформатированного документа, будем использовать fop-процессор, разработанный Джеймсом Таубером, который передал его проекту Apache XML. Программа Apache FOP (Formatting Object Processor — процессор форматирующих объектов), предназначенная для синтетических анализаторов Java, основана на XML-анализаторе Xerces проекта Apache XML. Так как Apache FOP является Java-приложением, оно может быть запущено на компьютер с любой операционной системой (при условии установленной на нём виртуальной машины Java) [2].

Данный программный продукт является бесплатно распространяемым, в отличие от конкурентов. Его функциональных возможностей достаточно для представления требуемой спецификации в pdf-формате в соответствии с ГОСТ 2. 113 — 75.

1.4 Выбор метода построения пользовательского интерфейса

Рассмотренные, в предыдущем подразделе, приложения предоставляют консольный интерфейс и поэтому не удобны для пользователя. Обработка большого числа файлов усложняется постоянным вводом путей к ним, передаваемых в качестве параметров, по средствам командной строки. Для устранения данного недостатка было принято решение о разработке программы XMLConverter, предоставляющей графический интерфейс пользователя. Данный программный модуль будет являться связующим звеном приложений, участвующих в преобразовании xml-документа в pdf-файл. В нём так же будет реализован алгоритм приведения спецификации в полное соответствие с ГОСТ 2. 113 — 75 путём преобразования xml-документа в промежуточный xml-документ.

В качестве инструментальной среды программирования, в которой будет реализовано приложение, выбрана Microsoft Visual Studio 2010. Данный программный продукт предоставляет широкие возможности создания и редактированию приложений для операционных систем Windows XP/Vista/7/8. Visual Studio даёт возможность выбора языка программирования: С++, C#, F#, Basic. Самым гибким языком программирования, из выше перечисленных, является С++. Visual Studio предоставляет возможность выбора между двумя платформами для этого языка. Более молодой из них является NET. Её инструментальные средства хорошо продуманы. Библиотеки Framework, предоставляемые этой средой, дают широкие возможности для разработки графического пользовательского интерфейса. Используемые в NET технологии упрощают работу с функциями библиотеки Win32Api. Однако существенным недостатком этой платформы является большая ресурсоёмкость разработанного в её среде приложения. Это связано с тем, что в ней более активно используются готовые модули, предоставляющие программисту требуемые и не требуемые возможности. То есть в оперативную память загружаются и обрабатываются процессором блоки компонентов, которые не будут использоваться вообще. Альтернативой Framework является разработанная ранее библиотека MFC (Microsoft Foundation Classes — библиотека базовых классов Microsoft) [6]. Она предоставляет более скромные возможности при разработке интерфейса пользователя, так как использует не столь большое число готовых компонент, но их вполне достаточно для разработки GUI (Graphical User Interface — графический пользовательский интерфейс) приложения XMLConverter. Плюсом старой платформы является ее малая ресурсоёмкость. Так приложение, созданное с использованием MFC, занимает в оперативной памяти в 3−4 раза меньше места, чем созданное в NET.

Исходя из выше сказанного, для разработки приложения был выбран язык Visual C++ и библиотека MFC.

В рамках текущей главы были определены технологии, применяемые при преобразовании структуры данных xml-файла в pdf-документ.

2 ОПИСАНИЕ СТРУКТУРЫ, ПРЕОБРАЗОВАНИЯ И ПРЕДСТАВЛЕНИЯ ИНФОРМАЦИИ С ПОМОЩЬЮ ТЕХНОЛОГИЙ XML-XSL

2.1 Механизм преобразования XML в PDF. Постановка задачи

В рамках настоящей квалификационной работы для преобразования xml-файла, содержащего данные групповой спецификации, в pdf-файл необходимо:

1 этап. Разработать структуру файла формата XML, который будет генерироваться модулем PartList (Рисунок 1).

2 этап. Разработать таблицы стилей XSL по ГОСТ 2. 113 — 75, описывающие преобразование и представление xml-документа в pdf-формате.

3 этап. Разработать приложение (XMLConverter), преобразующее искомый xml-документ в промежуточный xml-документ для приведения его в соответствие с требованиями предприятия. А также реализующее интерфейс между пользователем и программными средствами, выполняющими дальнейшее преобразование. Воспользоваться им.

4 этап. С помощью процессора трансформирующих объектов MSXSL выполнить преобразование xml-файла в документ, использующий форматирующие объекты (файл с расширением *. fo).

5 этап. Используя процессор форматирующих объектов Apache FOP, получить требуемый файл формата PDF.

6 этап. Создать инсталляционный пакет, упрощающий процесс установки разработанного приложения и его компонентов.

Схема, преобразования XML в PDF, представлена на рисунке 2.1.

/

Рисунок 2.1 — Механизм преобразования XML в PDF

2.2 Расширяемый язык разметки XML

XML используется в качестве средства для описания грамматики других языков и контроля над правильностью составления документов. То есть, сам по себе XML не содержит никаких тегов — элементов языка предназначенных для разметки, он просто определяет условия их создания. Теги не заданы в этом языке с самого начала. Программист сам определяет их. Таким образом, если мы считаем, что для обозначения элемента line в документе необходимо использовать тег < line/>; то XML позволяет свободно использовать определяемый нами тег и мы можем включать в документ фрагменты, подобные следующему: < line> данные < /line>. Как видно из примера, открывающий < line> и закрывающий < /line> содержат в себе данные. Во многих случаях, когда их много, целесообразно

Процесс создания XML документа достаточно прост и требует лишь базовых знаний HTML и понимания тех задач, которые необходимо выполнить, используя XML в качестве языка разметки. Таким образом, у разработчиков появляется уникальная возможность определять собственные команды, позволяющие им наиболее эффективно определять данные, содержащиеся в документе. Автор документа создает его структуру, строит необходимые связи между элементами, используя те команды, которые удовлетворяют его требованиям, и добивается такого типа разметки, которое необходимо ему для выполнения операций просмотра, поиска, анализа документа [2].

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

2.3 Язык стилей XSL

спецификация конвертер шаблон

С помощью XSL возможно форматировать данные в зависимости от их значения (например, показывать отрицательные числа зелёным цветом) и подготавливать для вывода на различные устройства, например, экран, бумагу или звуковое воспроизведение. Фактически язык XML состоит из двух частей: языка преобразований XSLT и языка форматирования XSL-FO.

XSLT — язык преобразования XML в другие типы документов или в другие XML-документы. Он является наиболее важной частью стандарта XSL. XSLT можно применять для преобразования XML документов в формат, знакомый браузерам [2].

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

XSL-FO — язык форматирования, описывающий внешний вид страниц. Он предоставляет более совершенную визуальную модель страницы, нежели HTML и CSS. В отличие от связки последних, XSL-FO поддерживает такие типы форматирования, как направление письма с права на лево и снизу вверх, сноски, заметки на полях документа, перекрёстные ссылки на номера страниц и другие. В отличие от каскадных таблиц стилей CSS, которые преимущественно предназначены для веб-страниц, XSL-FO предназначен для более широкого круга задач. Можно, например, написать таблицу стилей XSL, которая с помощью форматирующих объектов сгенерирует вёрстку целой книги. Другая таблица стилей может «сгенерировать» из того же документа веб-сайт [4].

Подобно другим XML-приложениям, форматирующие XSL-объекты имеют собственное пространство имен http: //www. w3. org/1999/XSL/Format (для XSLT пространство имён http: //www. w3. org/1999/XSL/Transform), для которого, как правило, используется префикс fo. Например, далее показано, как можно создать блок, который отображает текст «Добрый день» с помощью шрифта sans-serif, размер которого составляет 14 пунктов. При этом используется форматирующий объект < fo: block>:

< fo: block font-family="sans-serif" line-height="8pt" font-size="14pt">

Добрый день

< /fo:block>

В этом примере используется форматирующий объект fo: block, а также его свойства font-fami1у, line-height и font-size, которым присваиваются некоторые значения. После создания документа с использованием fo-объектов, можно воспользоваться специальной программой для получения отформатированного документа.

2.4 Текстовые процессоры

Для преобразования xml-документа, содержащего данные спецификации, используются текстовые процессоры: XMLConverter, MSXSL и Apache FOP. Первый, из которых, преобразует xml-документ в промежуточный xml-документ. Он добавляет отступы в виде пустых строк в спецификацию, а также дописывает их в конец последней страницы. Второй процессор используется для применения XSLT-инструкций, описанных в xsl-файле, к xml-файлу. В результате чего получается fo-файл. Он содержит данные xml-документа и форматирующие объекты xsl-шаблона. Для преобразования fo-файла в pdf-документ, используется Apache FOP.

В рамках текущей главы дана постановка задачи. Продемонстрирована схема механизма преобразования xml-представления групповой спецификации в pdf-документ. Даны общие понятия об объектах, участвующих в преобразовании.

3 РЕАЛИЗАЦИЯ ПРЕДСТАВЛЕНИЯ СПЕЦИФИКАЦИИ В XML-ФОРМАТЕ И ЕЕ ПРЕОБРАЗОВАНИЕ В PDF-ФОРМАТ

3.1 Разработка структуры xml-файла

Информационная структура файла формата XML представляет собой дерево. В роли элементов дерева (предков, потомков и листьев) выступают теги и их атрибуты. Теги используются для разметки документа на фрагменты, содержащие данные разного вида. Атрибуты применяются для обозначения данных разного рода. Атрибуты так же называют объектами. Они состоят из имени и поля, содержащего данные. Зная название тега, позицию в файле и имя атрибута, можно получить доступ к этим данным. Данные имеют строковый тип, но могут интерпретироваться программами как числа.

Файлы описываемого формата являются текстовыми, соответственно их содержимое — это текст. Язык, применяемый для разметки содержимого этих файлов — это язык гипертекстовой разметки XML. Программы, работающие с файлами данного типа, можно отнести к классу текстовых процессоров. Они интерпретируют байты данных xml-файла как символы. Исходя из этого, разработчиками стандартов XML было введено требование, указывать кодировку файла по средствам одного из атрибутов тега xml, относящегося к инструкциям и обозначаемого следующим образом: < ?xml version="1. 0″ encoding="UTF-8″ ?>. В приведённом примере это атрибут encoding, имеющий значение поля UTF-8 (однобайтный Unicode). Объект version указывает версию используемого языка разметки XML. [1]

Информационная структура, разрабатываемого файла, содержащего данные спецификации, представлена на рисунке 3.1. Как видно из рисунка, данные, входящие в спецификацию, подразделяются на данные, входящие в штамп, данные, относящиеся к разделу, и данные, входящие в строку. Штамп присутствует в одном экземпляре. Все данные, относящиеся к нему, есть всегда. Наименование раздела отсутствовать не может, так как в противном случае теряется смысл в самом разделе. Строка состоит из следующих данных: формат, зона, позиция, обозначение, наименование, количество на исполнение и примечание. Количеств на исполнение несколько. В зависимости от спецификации их может быть: 10, 30, 39. Счёт начинается с 0. Например, если количеств 10, N будет равен 9.

/

Рисунок 3. 1

Разделов, как и строк, может быть много. Их число определяется данными, сформированными в PartList, а также требованиями соответствующего ГОСТа.

Для представления описанной структуры данных в XML формате воспользуемся тегами и их атрибутами. Для обозначения корневого элемента спецификации будем использовать элементы < specification> и < /specification>. Данные, относящиеся к штампу спецификации, ограничим при помощи тега < stamp/>. Разметим содержимое элемента < stamp/> с помощью следующих атрибутов: OBOZNACHENIE, NAIMENOVANIE1, NAIMENOVANIE2, NAIMENOVANIE3, NAIMENOVANIE4, NAIMENOVANIE5, RAZRABOTAL, PROVERIL, N_KONTROL, UTVERDIL, NAZVANIE_ORGANIZACII1, NAZVANIE_ORGANIZACII2, PERVICH_PRIM, kline_before, kline_after, kpage. Соответствующие значения атрибутов представлены в таблице 3.1. Наименование разбивается, в зависимости от длины, на некоторое количество строк (не больше 5). Атрибут NAZVANIE_ORGANIZACII2 может отсутствовать, если название организации состоит из одной строки.

Таблица 3.1 — Атрибуты элемента < stamp/>

Атрибут

Значение

OBOZNACHENIE

Обозначение

NAIMENOVANIE1

Наименование, строка 1

NAIMENOVANIE2

Наименование, строка 2

NAIMENOVANIE3

Наименование, строка 3

NAIMENOVANIE4

Наименование, строка 4

NAIMENOVANIE5

Наименование, строка 5

Атрибут

Значение

RAZRABOTAL

Разработал

PROVERIL

Проверил

N_KONTROL

Нормоконтролер

UTVERDIL

Утвердил

NAZVANIE_ORGANIZACII1

Название организации, 1

NAZVANIE_ORGANIZACII2

Название организации, 2

PERVICH_PRIM

Первичная применяемость

kline_before

Отступ перед разделом

kline_after

Отступ после раздела

Kpage

Количество страниц в документе

Раздел обозначим при помощи тега < section/>. К данному элементу относится только одно поле данных «наименование», обозначим его следующим образом s_NAIMENOVANIE. Символ s в начале имени описываемого элемента служит для идентификации этого атрибута, как атрибута относящегося к тегу < section/>.

Для выделения данных, относящихся к строке, будем использовать тег < line/>. Соответствующие значения атрибутов представлены в таблице 3.2. Примечание может быть представлено в виде одной строки (атрибут PRIMECHANIE), а может быть разбито на две строки (PRIMECHANIE1 и PRIMECHANIE2, соответственно).

Таблица 3.2 — Атрибуты элемента < line/>

Атрибут

Значение

FORM

Формат

ZONE

Зона

POZICIA

Позиция

OBOZNACHENIE

Обозначение

NAIMENOVANIE

Наименование

Атрибут

Значение

KOL-VO0

Количество 0

KOL-VO_N

Количество N

PRIMECHANIE

Примечание

PRIMECHANIE1

Примечание, строка 1

PRIMECHANIE2

Примечание, строка 2

Представим разработанную информационную структуру данных в виде дерева XML. Применим все обозначенные ранее теги и атрибуты. В результате получим следующий документ.

< ?xml version="1. 0″ encoding="UTF-8″?>

< specification>

< stamp OBOZNACHENIE="СПЕЦИФИКАЦИЯ" NAIMENOVANIE1="" NAIMENOVANIE2="" NAIMENOVANIE3="Разгонщик" NAIMENOVANIE4="" NAIMENOVANIE5="" RAZRABOTAL="Кобыльский" PROVERIL="Гундорова" N_KONTROL="Качанов" UTVERDIL="Кравец"

NAZVANIE_ORGANIZACII1="ВГТУ, ФАЭМ" NAZVANIE_ORGANIZACII2="ВМ-022″

PERVICH_PRIM = ««

kline_before="2″ kline_after="1″ kpage="3"/>

< section s_NAIMENOVANIE="Документация"/>

< line FORM="" ZONE="" POZICIA="" OBOZNACHENIE="Р35−1. 00. 000 СБ" NAIMENOVANIE="Сборочный чертеж" KOL-VO0="" PRIMECHANIE="" PRIMECHANIE1="" PRIMECHANIE2=""/>

… < !-- Некоторое количество элементов < line … /> -->

< line FORM="" ZONE="" POZICIA="" OBOZNACHENIE="Р35−1. 00. 000 МЧ" NAIMENOVANIE="Монтажный чертеж" KOL-VO0="" PRIMECHANIE="" PRIMECHANIE1="примечание" PRIMECHANIE2=""/>

< section s_NAIMENOVANIE="Сборочные единицы"/>

< line FORM="" ZONE="" POZICIA="1″ OBOZNACHENIE="Р34−1. 05. 000″ NAIMENOVANIE="Подъемник" KOL-VO0="1″ PRIMECHANIE="" PRIMECHANIE1="" PRIMECHANIE2=""/>

< line FORM="" ZONE="" POZICIA="2″ OBOZNACHENIE="Р35−1. 01. 003″ NAIMENOVANIE="Гидроцилиндр" KOL-VO0="3″ PRIMECHANIE="" PRIMECHANIE1="" PRIMECHANIE2=""/>

< /specification>

Для наглядности здесь представлен небольшой документ, не отражающий все данные спецификации, но демонстрирующий её представление в виде xml-документа. Пустые атрибуты (атрибуты, не содержащие данных, например FORM="") могут отсутствовать, они представлены в данном примере для отображения всей информационной структуры xml-файла.

3.2 Применение XSLT-инструкций для разработки шаблона XSL

Применение XSLT-инструкций обусловлено необходимостью выборки данных из xml-файла. Для их использования в шаблоне XML необходимо указать пространство имён, а именно: < xsl: stylesheet version="1. 0″ xmlns: xsl="http://www. w3. org/1999/XSL/Transform"/>. Здесь тег xsl из пространства имён xmlns, содержит строку, указывающую на использование в документе пространства имён xsl. Атрибут version указывает версию используемого языка XSL [1].

Для установки соответствия с корневым узлом xml-документа и создания соответствующего шаблона используется элемент < xsl: template> с атрибутом match, указывающим на корневой элемент. Записывается следующим образом: < xsl: template match="specification"> < /xsl:template>. Объект specification — это название корневого элемента (тега) преобразуемого xml-файла. В том случае, если в качестве первого узла необходимо выбрать не корневой элемент, указывается путь к этому элементу. К примеру, значение атрибута match="specification/table" указывает, что в качестве превого узла выбран тег table. Путь к элементу указывается через символ /.

Для получения данных, относящихся к определённому элементу документа формата XML, необходимо использовть < xsl: value-of> с трабутом select, содержащим имя выделяемого элемента, либо путь к ниму. Например, select="stamp/@RAZRABOTAL". При этом не указывается ранее пройденный путь. Тоесть, если тег с именем stamp находится следующим, по иерархии, за элементом specification, а последний был выбран с помощью xsl: template, то в атрибуте select (элемента xsl: value-of), путь указывается, начиная с выбранного ранее элемента (в данном случае specification) не включительно. Если выделяемые данные принадлежат атрибуту элемента, при записи пути его имя указывается со знаком @ в начале.

Элемент xsl: template и входящий в него шаблон применяются только по отношению к корневому узлу, либо к узлу, с которого начинается преобразование. Можно также применять шаблон к дочерним элементам узла, с которым установлено соответствие. В этих целях применяется элемент < xsl: apply-templates>. В принадлежащем ему атрибуте math указывается узел, с которого необходимо начать обход дерева.

Пример использования xsl: apply-templates приведён ниже.

< ?xml version="1. 0″ encoding="utf-8″?>

< xsl: stylesheet version="1. 0″ xmlns: xsl="http://www. w3. org/1999/XSL/Transform">

< xsl: template match="specification">

< xsl: apply-templates select="*"/>

< /xsl:template>

< xsl: template match="line | section">

… < !-- Данные шаблона -->

< /xsl:template>

< xsl: stylesheet>

Рассмотрим приведённый код. При просмотре текста сверху вниз, первые элементы < xsl: template match="specification"> и < /xsl:template> являются начальным и конечным элементами шаблона корневого узла specification. Элемент xsl: apply-templates, входящий в рассматриваемый шаблон, указывает на то, что к дочерним элементам узла specification будет применён соответствующий шаблон. Атрибут select рассматриваемого объекта содержит путь к дочерним элементам [1]. В данном случае select содержит символ *, который означает установку соответствия со всеми дочерними элементами тега specification. В этом случае элемент select может быть опущен. Шаблон для этих элементов описан так:

< xsl: template match="line | section">

… < !-- Данные шаблона -->

< /xsl:template>

Содержимое атрибута match указывает на выбор тегов с именами line или section (дочерних тегу specification). Символ | означает логический элемент «или» (дизъюнкцию).

В том случае, когда элементов xsl: apply-templates несколько (более одного), а соответственно и шаблонов, указывается имя, идентифицирующее используемый шаблон. Атрибут содержащий имя, называется mode [4]. Демонстрационный пример xsl-файла приведён ниже.

< ?xml version="1. 0″ encoding="utf-8″?>

< xsl: stylesheet version="1. 0″ xmlns: xsl="http://www. w3. org/1999/XSL/Transform">

< xsl: template match="specification">

< xsl: apply-templates select="*[13> position ()]"/>

< xsl: apply-templates select="*[position ()> 11]" mode="page_B"/>

< /xsl:template>

< xsl: template match="line | section">

… < !-- Данные шаблона -->

< /xsl:template>

< xsl: template match="line | section" mode="page_B">

… < !-- Данные шаблона -->

< /xsl:template>

< xsl: stylesheet>

В первом, при чтении сверху вниз, элементе xsl: apply-templates не указывается атрибут с именем используемого шаблона. Принадлежащему ему шаблону, размеченному с помощью тегов xsl: template, имя не присваивается. Для второго и последующих объектов xsl: apply-templates указывается арибут с именем используемого шаблона, если не используется первый шаблон без имени. Любой шаблон может использоваться несколькими элементами xsl: apply-templates.

Для описания условий выбора тех или иных элементов используется язык XPath [1]. Объект position () рассматриваемого языка служит для получения позиции просматриваемого узла в документе. Выражение *[position ()> 11], указывает, что будут выбраны все элементы, позиция которых больше 11. Оператор [ ] применяется для проверки истинности определённого условия. Узлы нумеруются отдельно для потомков каждого предка.

3.3 Разработка шаблона XSL

При разработке xsl-шаблона применяются расширяемые языки таблицы стилей: XSLT и XSL-FO. Первый применяется для трансформации xml-документа (выборки данных из XML), а второй — для описания представления этих данных.

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

Для описания представления страниц в языке XML-FO предусмотрен ряд элементов. Одним из таких элементов является fo: root. Этот объект содержит один элемент fo: layout-master-set и один или несколько элементов fo: page-sequence. В объекте fo: page-sequence размещается основное содержимое документа. Элемент fo: layout-master-set содержит шаблоны создаваемых страниц, которые также именуются мастер-страницами [4]. Мастер-страница, обозначаемая fo: simple-page-master, задаёт общий макет страницы, включая отступы, размеры заголовков, основную область страницы и так далее. Элемент fo: simple-page-master имеет атрибуты, содержащие значения размеров: страницы и отступов. Соответствующие атрибуты и их описание, представлены в таблице 3.3.

Таблица 3. 3

Элемент

Описание

Page-height

Высота страницы

Page-width

Ширина страницы

margin-top

Отступ сверху

Margin-bottom

Отступ снизу

margin-left

Отступ слева

margin-right

Отступ справа

Спецификация XML-FO предусматривает разбиение страницы на пять областей: центральной, заголовка, футера (нижней области), конечной области (правая часть листа) и начальной области. Рассматриваемы области задаются с помощью дочерних элементов объекта fo: simple-page-master, которые представлены в таблице 3.4.

Таблица 3. 4

Элемент

Описание области

region-body

Центральная

Region-before

Заголовок

region-after

Футер

region-start

Начальная

region-end

Конечная

Каждый, из рассматриваемых элементов, кроме region-body, имеет атрибут extent. Для region-before и region-after он определяет высоту области. Для region-start и region-end — ширину. Центральной (основной) области отводится вся страница, кроме отступов [4]. То есть, она занимает пространство других областей. Для неё существуют атрибуты, задающие отступы. Можно задать величины отступов таким образом, чтобы основная область не перекрывала другие. Имена рассматриваемых атрибутов, задающих отступы, соответствуют атрибутам страницы. Они представлены в таблице 3.3.

Демонстрационный пример xsl-файла представлен ниже.

< ?xml version="1. 0″ encoding="utf-8″?>

< xsl: stylesheet version="1. 0″ xmlns: xsl="http://www. w3. org/1999/XSL/Transform"

xmlns: fo="http://www. w3. org/1999/XSL/Format">

< xsl: template match="specification">

< fo: root>

< fo: layout-master-set>

< fo: simple-page-master page-height="210mm"

page-width="297mm"

margin-top="8mm"

margin-bottom="5mm"

margin-left="5mm"

margin-right="5mm">

< fo: region-body margin-top="27mm"

margin-bottom="90mm"

margin-left="0mm"

margin-right="0mm"/>

< fo: region-before extent="27mm"/>

< fo: region-after extent="90mm"/>

< /fo:simple-page-master>

< /fo:layout-master-set>

< fo: page-sequence>

… < !-- Содержимое документа -->

< /fo:page-sequence>

< /fo:root>

< /xsl:template>

< /xsl:stylesheet>

Как уже упоминалось ранее, первая страница спецификации, а точнее, её штамп, отличается от штампа, представленного на второй и последующих страницах. Отсюда можно сделать вывод, что представление этих страниц должно быть описано с помощью разных шаблонов. Для этого необходимо каждому макету страницы присвоить имя, а в элементе fo: simple-page-master указать атрибут master-name с именем данного шаблона. Соответствующий объект fo: page-sequence, содержащий описание представления данных на старнице, должен иметь потомка — атрибут master-reference. Описываемый объект должен указывать на имя одной из мастер-страниц в элементе fo: layout-master-set [1].

При использовании нескольких мастер страниц необходима их группировка в элементе fo: page-sequence-master. Рассматриваемый объект является дочерним элементу fo: layout-master-set, в котором с помощью одного или нескольких дочерних элементов задается порядок, в котором будут инициализироваться конкретные мастер-страницы. Таким образом определяется последовательность расположения описанных страниц. Для задания этой последовательности применяется элемент fo: single-page-master-reference с атрибутом master-reference, указывающим на имя одной из мастер-страниц. Пример соответствующего фрагмента файла XSL, приведён ниже.

< fo: layout-master-set>

< fo: simple-page-master master-name="page1″

page-height="310mm"

page-width="397mm"

margin-top="8mm"

margin-bottom="5mm"

margin-left="5mm"

margin-right="5mm">

< fo: region-body margin-top="37mm"

margin-bottom="90mm"

margin-left="0mm"

margin-right="0mm"/>

< fo: region-before extent="37mm"/>

< fo: region-after extent="90mm"/>

< /fo:simple-page-master>

< fo: simple-page-master master-name="page3″

page-height="310mm"

page-width="397mm"

margin-top="8mm"

margin-bottom="5mm"

margin-left="5mm"

margin-right="5mm">

< fo: region-body

margin-top="37mm"

margin-bottom="15mm"

margin-left="0mm"

margin-right="0mm"/>

< fo: region-before extent="37mm"/>

< fo: region-after extent="15mm"/>

< /fo:simple-page-master>

< fo: page-sequence-master master-name="contents">

< fo: single-page-master-reference master-reference="page1"/>

< fo: single-page-master-reference master-reference="page3"/>

< /fo:page-sequence-master>

< /fo:layout-master-set>

Данные, относящиеся к штампу, как было сказано ранее, статичны. Для описания статичных областей применяется элемент fo: static-content с атрибутом flow-name, указывающим на регион, для которого инициализирована мастер страница [2]. То есть, объект fo: static-content является потомком элемента fo: page-sequence. Значения атрибута flow-name указаны в таблице 3.5.

Таблица 3. 5

Значения атрибута flow-name

Описание области

xsl-region-body

Центральная

xsl-region-before

Заголовок

xsl-region-after

Футер

xsl-region-start

Начальная

xsl-region-end

Конечная

Содержимое же центральной области страницы, напротив, изменяется. Данные, извлечённые с помощью XSLT из xml-документа, «перетекают» с одного листа на другой. То есть fop-процессор, обрабатывая fo-файл, должен помещать данные на основную область страницы до тех пор, пока на ней хватает места. Как только ресурс листа иссякнет, fop-процессор должен создать новый лист и продолжить добавление данных. Этот процесс должен продолжаться до тех пор, пока все данные из fo-файла не будут внесены в файл формата PDF. Соответственно объём данных, расположенных в файле FO, а ранее в файле XML, определит количество страниц в файле PDF. Для реализации поточного метода выборки и представления данных в спецификации языка XSL-FO предусмотрен элемент fo: flow. Рассматриваемый объект хранит реальное содержимое, которое будет размещаться на страницах в соответствии с мастер-страницами. Это содержимое образуется последовательностью элементов: fo: block, fo: block-container, fo: table [1].

Объект fo: block применяется для задания свойств выводимого текста. Свойства задаются с помощью соответствующих атрибутов. С помощью данного элемента задаются видимые или невидимые границы текста. При описании текстовых данных в xsl-шаблоне применение fo: block обязательно. В этом элементе можно не использовать атрибуты форматирования текста, границ блока и так далее. Fop-процессор просто применит значения по умолчанию (черный цвет шрифта, невидимые границы блока и так далее). Возможно также указание атрибуты форматирования текста в некоторых родительских элементах. Атрибуты, используемые при форматировании текста, и их описание представлены в таблице 3.6.

Таблица 3. 6

Атрибут

Описание

font-family

Название шрифта

font-size

Размер шрифта

Text-align

Положение текста в блоке

Start-indent

Отступ слева

end-indent

Отступ справа

Размер шрифта указывается так: font-size="14pt". Атрибут text-align, указывающий положение текста в блоке, может принимать следующие значения: center, left, right. Отступы слева и справа указываются в миллиметрах.

По умолчанию границы блока невидимы, но с помощью специальных атрибутов можно указать fop-процессору, где их необходимо нарисовать. Также можно указать толщину линий, в противном случае она будет принята по умолчанию 3.6 мм. Атрибуты, используемые для задания границ и их толщины, представлены в таблице 3.7.

Таблица 3. 7

Атрибут

Описание

border-style

Границы для всего блока

Border-before-style / border-top-style

Граница перед текстом

border-after-style / border-bottom-style

Граница после текста

Border-start-style / border-left-style

Граница слева

border-end-style / border-right-style

Граница справа

border-width

Толщина границы для всего блока

border-before-width / border-top-width

Толщина границы перед текстом

Border-after-width / border-bottom-width

Толщина границы после текста

Border-start-width / border-left-width

Толщина границы слева

Border-end-width / border-right-width

Толщина границы справа

Объект fo: block-container предназначен для группировки нескольких блоков, либо для задания некоторых свойств конкретного блока. В рассматриваемой спецификации в некоторых ячейках штампа текст располагается вертикально. Для того, чтобы в шаблоне XSL задать поворот текста на 90 градусов, необходимо воспользоваться атрибутом reference-orientation, принадлежащем элементу fo: block-container. При этом нужно разрешить поворот текста с помощью атрибута position, присвоив ему значение absolute [4]. Для того, чтобы опустить или приподнять текст, используют атрибут top. Если необходимо текст опустить, то указывается положительное значение отступа в миллиметрах, в противном случае — отрицательное.

Объект fo: table применяются для описания таблиц. К его прямым потомкам относятся следующие элементы: fo: table-column, fo: table-body, fo: table-row, fo: table-cell [2].

Элемент fo: table-column задаёт колонку в таблице. Последовательность из пяти таких объектов задаёт пять колонок, соответственно. С помощью атрибута column-number указывается порядковый номер колонки. При помощи column-width — её ширина.

Объект fo: table-body включает в себя узлы, описывающие строки и ячейки таблицы. Он задаёт рабочую зону таблицы. То есть в нём находится фактическое содержимое таблицы. В нём, с помощью соответствующих атрибутов, могут быть указаны свойства текста.

Элемент fo: table-row используется для группировки в строки ячеек таблицы. В нём с помощью атрибута line-height указывается высота строк.

Содержимое каждой ячейки размещается в объекте fo: table-cell. Пример использования элементов, описывающих представление таблиц, приведён ниже.

< fo: table>

< fo: table-column column-number="1″ column-width="35mm"/>

< fo: table-column column-number="2″ column-width="35mm"/>

< fo: table-column column-number="3″ column-width="20mm"/>

< fo: table-body font-family="GOST_B" font-size="10pt" text-align="center">

< fo: table-row line-height="5. 75mm" >

< fo: table-cell column-number="1″ border-style="solid">

< fo: block> Инв. № подл. < /fo:block>

< /fo:table-cell>

< fo: table-cell column-number="2″ border-before-style="solid" border-after-style="solid" border-right-style="solid">

< fo: block> Подп. и дата < /fo:block>

< /fo:table-cell>

< fo: table-cell column-number="3″ border-before-style="solid" border-after-style="solid" border-right-style="solid">

< fo: block> Взам. инв. № < /fo:block>

ПоказатьСвернуть
Заполнить форму текущей работой