C# библиотека для сборки документа Word
Цель проекта - создать C# библиотеку, которая будет частью приложения для помощи преподавателям в создании тестов для студентов. Допустим, у преподавателя есть документ с 200 вопросами для тестов. Преподаватель хочет сделать тест из 40 вопросов. Задача библиотеки - автоматизировать копирование и вставку этих вопросов из .docx файла, содержащего все вопросы, в .docx файл для конкретного теста из 40 вопросов.
Оригинальный .docx документ размечен так:
***begin:question1
content (mostly text, but including images, text boxes, drawings, equations, etc.)
***end:question1
***begin:question2
more content
***end:question2
и т.д.
Библиотека будет использована в программе для сборки .docx документов. Работа с библиотекой должна выглядеть примерно так:
string[] partsToInclude = new string[] { "titlepage", "instructions", "question1", "question3", "question5", "footer" };
DocumentAssembler myDoc = new DocumentAssembler(@"c:\master.docx");
myDoc.CreateSubDocument(partsToInclude, @"c:\newdocument.docx");
... для создания newdocument.docx, который содержит части master.docx между ***begin:xxx и ***end:xxx заголовками, указанными в массиве partsToInclude.
Мы можем немного изменять формат разметки документа, например, если будет нужно, все ***begin и ***end разделители могут быть в каком-то определенном стиле.
Важно, чтобы класс DocumentAssembler копировал ВСЕ содержимое исходного документа, включая картинки, рисунки, формулы, поля для ввода, и т.п. Все форматирование, разрывы страниц и т.п. должны быть сохранены. Свойства нового документа (отступы, заголовки, колонтитулы и т.п.) должны быть такими же, как в исходном документе.
Кроме основного копирование, желательно иметь еще одну вещь в классе DocumentAssembler. Может быть 2 типа содержимого для копирования из оригинального документа в новый - части, обозначенные как "question" и части, обозначенные по-другому (титульный лист, инструкции, и т.п.)
Желательно, чтобы DocumentAssembler отслеживал "текущий номер вопроса", и заменял текст "###" внутри блока содержимого на этот номер вопроса. Нумерация вопросов начинается с 1 и увеличивается после каждого блока "question".
То есть, для примера, если в оригинальном документе есть блок:
***begin:question78
###. What color is the sky?
A. red B. blue C. green D. purple
***end:question78
и создан тест, использующий блоки "titlepage", "question60", "question78", то ### в вопросе 78 будет заменено на строку "2", так как это второй блок в результирующем документе, имя которого начинается с "question".
Приемлимо (и желательно) использовать готовые библиотеки для этого проекта, например Open XML SDK от Microsoft.
Пример файла с вопросами - в приложении.