Работа със стилове

StyleCollection класът се използва за управление на вградени и прилагане на дефинирани от потребителя настройки към стилове.

Как да извличате съдържание въз основа на стилове

На просто ниво извличането на съдържанието въз основа на стилове от документ Word може да бъде полезно за идентифициране, изброяване и броене на абзаци и тиражи на текст, форматиран с определен стил. Например може да се наложи да идентифицирате определени видове съдържание в документа, като например примери, заглавия, препратки, ключови думи, имена на фигури и казуси.

За да направите това няколко стъпки по-нататък, това може да се използва и за използване на структурата на документа, определена от стиловете, които използва, за повторно насочване на документа за друг изход, като HTML. Това всъщност е начинът, по който се изгражда документацията, поставяйки Aspose.Words на теста. Инструмент, създаден с Aspose.Words, взема документите източник Word и ги разделя на теми на определени нива на заглавия. Файл XML се произвежда, като се използва Aspose.Words, който се използва за изграждане на навигационното дърво, което можете да видите отляво. След това Aspose.Words преобразува всяка тема във HTML.

Решението за извличане на текст, форматиран със специфични стилове в документ Word, обикновено е икономично и лесно, като се използва Aspose.Words.

Решението

За да илюстрираме колко лесно Aspose.Words се справя с извличането на съдържание въз основа на стилове, нека разгледаме един пример. В този пример ще извлечем текст, форматиран с определен стил на абзац и стил на знак от примерен документ Word. На високо ниво това ще включва:

  • Отваряне на документ Word с помощта на клас Document.
  • Получаване на колекции от всички параграфи и всички работи в документа.
  • Изберете Само необходимите параграфи и работи. По-конкретно, ще извлечем текст, форматиран със стила на' Heading 1 ‘абзац и стила на’ интензивен акцент ' от този образец Word документ.

working-with-styles-aspose-words-cpp-1

В този примерен документ текстът, форматиран със стил' Heading 1 ‘абзац, е ‘Вмъкване’, ‘Бързи стилове’ и ‘тема’, а текстът, форматиран със стил ‘интензивен акцент’, е няколко екземпляра на син, курсив, удебелен текст като ‘галерии’и’ цялостен изглед’.

Кодексът

Изпълнението на заявка, базирана на стил, е доста просто в модела Aspose.Words обект на документ, тъй като просто използва инструменти, които вече са налице. За това решение са имплементирани два метода на класа:# ParagraphsByStyleName – този метод извлича масив от онези абзаци в документа, които имат конкретно име на стил.# RunsByStyleName - този метод извлича масив от тези, които се изпълняват в документа, които имат конкретно име на стил. И двата метода са много сходни, като единствените разлики са типовете възли и представянето на информацията за стила в абзаца и стартирайте възли. Това е приложение на ParagraphsByStyleName. По-долу пример Намерете всички абзаци форматирани със зададения стил.

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
std::vector<System::SharedPtr<Paragraph>> ParagraphsByStyleName(System::SharedPtr<Document> doc, System::String const &styleName)
{
// Create an array to collect paragraphs of the specified style.
std::vector<System::SharedPtr<Paragraph>> paragraphsWithStyle;
// Get all paragraphs from the document.
System::SharedPtr<NodeCollection> paragraphs = doc->GetChildNodes(NodeType::Paragraph, true);
// Look through all paragraphs to find those with the specified style.
for (System::SharedPtr<Paragraph> paragraph : System::IterateOver<System::SharedPtr<Paragraph>>(paragraphs))
{
if (paragraph->get_ParagraphFormat()->get_Style()->get_Name() == styleName)
{
paragraphsWithStyle.push_back(paragraph);
}
}
return paragraphsWithStyle;
}

Също така си струва да се отбележи, че събирането на абзаци не създава непосредствени режийни, защото абзаците се зареждат в тази колекция само когато имате достъп до елементи в тях. След това всичко, което трябва да направите, е да преминете през колекцията, като използвате стандарта за всеки оператор и добавите абзаци, които имат зададения стил към масива paragraphsWithStyle. Paragraph името на стила може да се намери в стила. Име на собственост на Paragraph.ParagraphFormat обект. Изпълнението на RunsByStyleName е почти същото, въпреки че очевидно използваме NodeType.Run, за да изтеглим стартовите възли. Свойството Font.Style на Run обект се използва за достъп до стилова информация в Run възлите. Примерът бъдиlow code намери всички писти форматирани със зададения стил.

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
std::vector<System::SharedPtr<Run>> RunsByStyleName(System::SharedPtr<Document> doc, System::String const &styleName)
{
// Create an array to collect runs of the specified style.
std::vector<System::SharedPtr<Run>> runsWithStyle;
// Get all runs from the document.
System::SharedPtr<NodeCollection> runs = doc->GetChildNodes(NodeType::Run, true);
// Look through all runs to find those with the specified style.
for (System::SharedPtr<Run> run : System::IterateOver<System::SharedPtr<Run>>(runs))
{
if (run->get_Font()->get_Style()->get_Name() == styleName)
{
runsWithStyle.push_back(run);
}
}
return runsWithStyle;
}

Когато се изпълняват и двете заявки, всичко, което трябва да направите, е да подадете обект на документ и да зададете имената на стила на съдържанието, което искате да извлечете: по-долу пример изпълнение на заявки и показване на резултатите. Можете да изтеглите шаблонния файл на този пример от тук.

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
// The path to the documents directory.
System::String inputDataDir = GetInputDataDir_WorkingWithStyles();
// Open the document.
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"TestFile.doc");
// Define style names as they are specified in the Word document.
const System::String paraStyle = u"Heading 1";
const System::String runStyle = u"Intense Emphasis";
// Collect paragraphs with defined styles.
// Show the number of collected paragraphs and display the text of this paragraphs.
std::vector<System::SharedPtr<Paragraph>> paragraphs = ParagraphsByStyleName(doc, paraStyle);
std::cout << "Paragraphs with \"" << paraStyle.ToUtf8String() << "\" styles (" << paragraphs.size() << "):" << std::endl;
for (System::SharedPtr<Paragraph> paragraph : paragraphs)
{
std::cout << paragraph->ToString(SaveFormat::Text).ToUtf8String();
}
std::cout << std::endl;
// Collect runs with defined styles.
// Show the number of collected runs and display the text of this runs.
std::vector<System::SharedPtr<Run>> runs = RunsByStyleName(doc, runStyle);
std::cout << "Runs with \"" << runStyle.ToUtf8String() << "\" styles (" << runs.size() << "):" << std::endl;
for (System::SharedPtr<Run> run : runs)
{
std::cout << run->get_Range()->get_Text().ToUtf8String() << std::endl;
}

Краен Резултат

Когато всичко е направено, изпълнението на пробата ще покаже следния изход:

working-with-styles-aspose-words-cpp-2

Както можете да видите, това е много прост пример, показващ броя и текста на събраните параграфи и се изпълнява в примерния документ Word.

Как да вмъкнете и работите с полето Съдържание

Често ще работите с документи, съдържащи съдържание (TOC). Използвайки Aspose.Words можете да вмъкнете свое собствено съдържание или напълно да възстановите съществуващото съдържание в документа, като използвате само няколко реда код. Тази статия очертава как да работите с полето съдържание и демонстрира:

  • Как да вмъкнете чисто нов TOC
  • Актуализиране на нов или съществуващ TOCs в документа.
  • Задайте превключватели, за да контролирате форматирането и цялостната структура на TOC.
  • Как да промените стиловете и външния вид на съдържанието.
  • Как да премахнете цяло поле TOC заедно с всички записи от документа.

Въведете TC Полета

Често определен ред от текста е обозначен за TOC и е маркиран с поле TC. Лесният начин да направите това в MS Word е да маркирате текста и да натиснете ALT+SHIFT+O. Това автоматично създава поле TC, като използва избрания текст. Същата техника може да се постигне чрез код. Кодът по-долу ще намери текст, който съответства на въведеното и ще вмъкне поле TC в същата позиция като текста. Кодът се основава на същата техника, използвана в статията. По-долу пример показва как да намерите и вмъкнете поле TC в текста в документ.

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
System::SharedPtr<Document> doc = System::MakeObject<Document>();
System::SharedPtr<FindReplaceOptions> options = System::MakeObject<FindReplaceOptions>();
// Highlight newly inserted content.
options->get_ApplyFont()->set_HighlightColor(System::Drawing::Color::get_DarkOrange());
options->set_ReplacingCallback(System::MakeObject<InsertTCFieldHandler>(u"Chapter 1", u"\\l 1"));
// Insert a TC field which displays "Chapter 1" just before the text "The Beginning" in the document.
doc->get_Range()->Replace(System::MakeObject<System::Text::RegularExpressions::Regex>(u"The Beginning"), u"", options);
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
class InsertTCFieldHandler : public IReplacingCallback
{
typedef InsertTCFieldHandler ThisType;
typedef IReplacingCallback BaseType;
typedef ::System::BaseTypesInfo<BaseType> ThisTypeBaseTypesInfo;
public:
InsertTCFieldHandler(const System::String& text, const System::String& switches)
: mFieldText(text), mFieldSwitches(switches) {}
InsertTCFieldHandler(const System::String& switches)
: mFieldText(System::String::Empty), mFieldSwitches(switches) {}
ReplaceAction Replacing(System::SharedPtr<ReplacingArgs> args) override;
private:
System::String mFieldText;
System::String mFieldSwitches;
};
ReplaceAction InsertTCFieldHandler::Replacing(System::SharedPtr<ReplacingArgs> args)
{
// Create a builder to insert the field.
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(System::DynamicCast<Document>(args->get_MatchNode()->get_Document()));
// Move to the first node of the match.
builder->MoveTo(args->get_MatchNode());
// If the user specified text to be used in the field as display text then use that, otherwise use the
// Match string as the display text.
System::String insertText;
if (!System::String::IsNullOrEmpty(mFieldText))
{
insertText = mFieldText;
}
else
{
insertText = args->get_Match()->get_Value();
}
// Insert the TC field before this node using the specified string as the display text and user defined switches.
builder->InsertField(System::String::Format(u"TC \"{0}\" {1}", insertText, mFieldSwitches));
// We have done what we want so skip replacement.
return ReplaceAction::Skip;
}

Промяна на съдържание

Промяна на форматирането на стилове

Форматирането на записите в TOC не използва оригиналните стилове на маркираните записи, вместо това всяко ниво се форматира с еквивалентен стил TOC. Например първото ниво в TOC е форматирано със стил TOC1, второто ниво е форматирано със стил TOC2 и така нататък. Това означава, че за да промените външния вид на TOC тези стилове трябва да бъдат променени. В Aspose.Words тези стилове са представени от независими от локала StyleIdentifier.TOC1 до StyleIdentifier.TOC9 и могат да бъдат извлечени от колекцията Document.Styles с помощта на тези идентификатори. След като съответният стил на документа бъде извлечен, форматирането за този стил може да бъде променено. Всички промени в тези стилове ще бъдат отразени автоматично в TOCs в документа. Примерът бъдиlow code променя свойството форматиране, използвано в стила на първо ниво TOC.

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
System::SharedPtr<Document> doc = System::MakeObject<Document>();
// Retrieve the style used for the first level of the TOC and change the formatting of the style.
doc->get_Styles()->idx_get(StyleIdentifier::Toc1)->get_Font()->set_Bold(true);

Също така е полезно да се отбележи, че всяко директно форматиране на абзац (дефинирано в самия абзац, а не в стила), маркирано да бъде включено TOC, ще бъде копирано в записа в TOC. Например ако стилът Heading 1 се използва за маркиране на съдържание за TOC и този стил има удебелено форматиране, докато абзакът също има курсив форматиране директно приложено към него. Полученият TOC запис няма да бъде получер, тъй като това е част от форматирането на стил, но ще бъде курсив, тъй като това е директно форматирано в абзаца. Можете също да контролирате форматирането на разделителите, използвани между всеки запис и номера на страницата. По подразбиране това е пунктирана линия, която е разпределена в номерирането на страници с помощта на знак за табулация и десен табулатор, подредени близо до дясното поле.

Използвайки клас Style, извлечен за конкретното ниво TOC, което искате да промените, можете също да промените как те се показват в документа. За да промените начина, по който това се появява, първо трябва да се извика Style.ParagraphFormat, за да извлечете форматирането на абзаца за стила. От това табулаторите могат да бъдат извлечени чрез обаждане ParagraphFormat.TabStops и промяна на съответния табулатор. Използвайки същата тази техника, самият раздел може да бъде преместен или премахнат напълно. Примерът беlow code показва как да промените позицията на десния табулатор в параграфи TOC. Можете да изтеглите шаблонния файл на този пример от тук.

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
// The path to the documents directories.
System::String inputDataDir = GetInputDataDir_WorkingWithStyles();
System::String outputDataDir = GetOutputDataDir_WorkingWithStyles();
// Open the document.
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"Document.TableOfContents.doc");
// Iterate through all paragraphs in the document
for (System::SharedPtr<Paragraph> para : System::IterateOver<System::SharedPtr<Paragraph>>(doc->GetChildNodes(NodeType::Paragraph, true)))
{
// Check if this paragraph is formatted using the TOC result based styles. This is any style between TOC and TOC9.
if (para->get_ParagraphFormat()->get_Style()->get_StyleIdentifier() >= StyleIdentifier::Toc1 && para->get_ParagraphFormat()->get_Style()->get_StyleIdentifier() <= StyleIdentifier::Toc9)
{
// Get the first tab used in this paragraph, this should be the tab used to align the page numbers.
System::SharedPtr<TabStop> tab = para->get_ParagraphFormat()->get_TabStops()->idx_get(0);
// Remove the old tab from the collection.
para->get_ParagraphFormat()->get_TabStops()->RemoveByPosition(tab->get_Position());
// Insert a new tab using the same properties but at a modified position.
// We could also change the separators used (dots) by passing a different Leader type
para->get_ParagraphFormat()->get_TabStops()->Add(tab->get_Position() - 50, tab->get_Alignment(), tab->get_Leader());
}
}
System::String outputPath = outputDataDir + u"ChangeTOCTabStops.doc";
doc->Save(outputPath);

Премахване на съдържание от документа

Съдържанието може да бъде премахнато от документа, като се премахнат всички възли между FieldStart и FieldEnd на полето TOC. Кодът по-долу показва това. Премахването на полето TOC е по-просто от нормалното поле, тъй като не следим вложените полета. Вместо това проверяваме FieldEnd възела е от тип FieldType.FieldTOC, което означава, че сме срещнали края на текущия TOC. Тази техника може да се използва в този случай, без да се притеснявате за вложени полета, тъй като можем да приемем, че всеки правилно оформен документ няма да има напълно вложено поле TOC в друго поле TOC. На първо място се събират и съхраняват възлите FieldStart на всеки TOC. Посоченият TOC след това се изброява, така че всички възли в полето се посещават и съхраняват. След това възлите се премахват от документа. Примерът беlow code показва как да премахнете определен TOC от документ. Можете да изтеглите шаблонния файл на този пример от тук.

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
// The path to the documents directories.
System::String inputDataDir = GetInputDataDir_WorkingWithStyles();
System::String outputDataDir = GetOutputDataDir_WorkingWithStyles();
// Open a document which contains a TOC.
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"Document.TableOfContents.doc");
// Remove the first table of contents from the document.
RemoveTableOfContents(doc, 0);
System::String outputPath = outputDataDir + u"RemoveTOCFromDocument.doc";
// Save the output.
doc->Save(outputPath);

Вмъкване на разделител на стилове, за да поставите различни стилове на абзаци

Разделителят на стил може да бъде добавен в края на абзац, като се използва клавишната комбинация MS Word. Тази функция позволява два различни стила на абзаца, използвани в един логически отпечатан абзац. Ако искате част от текста от началото на определено заглавие да се показва в съдържание, но не искате цялото заглавие в съдържанието, можете да използвате тази функция. Примерът бъдиlow code показва как да вмъкнете разделител на стил, за да поставите различни стилове на абзаци.

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
System::SharedPtr<Document> doc = System::MakeObject<Document>();
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc);
System::SharedPtr<Style> paraStyle = builder->get_Document()->get_Styles()->Add(StyleType::Paragraph, u"MyParaStyle");
paraStyle->get_Font()->set_Bold(false);
paraStyle->get_Font()->set_Size(8);
paraStyle->get_Font()->set_Name(u"Arial");
// Append text with "Heading 1" style.
builder->get_ParagraphFormat()->set_StyleIdentifier(StyleIdentifier::Heading1);
builder->Write(u"Heading 1");
builder->InsertStyleSeparator();
// Append text with another style.
builder->get_ParagraphFormat()->set_StyleName(paraStyle->get_Name());
builder->Write(u"This is text with some other formatting ");
System::String outputPath = outputDataDir + u"InsertStyleSeparator.doc";
// Save the document to disk.
doc->Save(outputPath);

Копиране на всички стилове от шаблона

Има случаи, когато искате да копирате всички стилове от един документ в друг. Можете да използвате метода Document.CopyStylesFromTemplate, за да копирате стилове от зададения шаблон в документ. Когато стиловете се копират от шаблон в документ, стиловете с имена като тези в документа се предефинират, за да съответстват на описанията на стила в шаблона. Уникалните стилове от шаблона се копират в документа. Уникалните стилове в документа остават непокътнати. Примерът бъдиlow code показва как да копирате стилове от един документ в друг.

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
System::String fileName = inputDataDir + u"template.docx";
System::SharedPtr<Document> doc = System::MakeObject<Document>(fileName);
// Open the document.
System::SharedPtr<Document> target = System::MakeObject<Document>(inputDataDir + u"TestFile.doc");
target->CopyStylesFromTemplate(doc);
System::String outputPath = outputDataDir + u"CopyStyles.doc";
doc->Save(outputPath);