Stillerle Çalışma

StyleCollection sınıfı, yerleşik ayarları yönetmek ve stillere kullanıcı tanımlı ayarları uygulamak için kullanılır.

Stillere Dayalı İçerik Nasıl Çıkarılır

Basit bir düzeyde, içeriği bir Word belgesinden stillere göre almak, paragrafları ve belirli bir stille biçimlendirilmiş metin akışlarını tanımlamak, listelemek ve saymak için yararlı olabilir. Örneğin, belgedeki örnekler, başlıklar, referanslar, anahtar kelimeler, şekil adları ve vaka çalışmaları gibi belirli içerik türlerini tanımlamanız gerekebilir.

Bunu birkaç adım daha ileri götürmek için, bu, belgeyi HTML gibi başka bir çıktı için yeniden amaçlamak için kullandığı stillerle tanımlanan belgenin yapısından yararlanmak için de kullanılabilir. Bu aslında Aspose belgelerinin nasıl oluşturulduğudur ve Aspose.Words ‘ı teste tabi tutar. Aspose.Words kullanılarak oluşturulan bir araç, kaynak Word belgelerini alır ve bunları belirli başlık düzeylerindeki konulara böler. Solda görebileceğiniz gezinme ağacını oluşturmak için kullanılan Aspose.Words kullanılarak bir XML dosyası oluşturulur. Ve sonra Aspose.Words her konuyu HTML ‘e dönüştürür.

Bir Word belgesinde belirli stillerle biçimlendirilmiş metni alma çözümü genellikle Aspose.Words kullanılarak ekonomik ve basittir.

Çözüm

Aspose.Words ‘ın stillere dayalı içerik almayı ne kadar kolay işlediğini göstermek için bir örneğe bakalım. Bu örnekte, örnek bir Word belgesinden belirli bir paragraf stili ve karakter stili ile biçimlendirilmiş metni alacağız. Yüksek düzeyde, bu şunları içerecektir:

  • Document sınıfını kullanarak bir Word belgesi açma.
  • Tüm paragrafların ve hepsinin koleksiyonlarını almak belgede çalışır.
  • Yalnızca gerekli paragrafları ve çalıştırmaları seçme. Özellikle, bu örnek Word belgesinden ‘Başlık 1’ paragraf stili ve ‘Yoğun Vurgu’ karakter stili ile biçimlendirilmiş metni alacağız.

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

Bu örnek belgede, ‘Başlık 1’ paragraf stili ile biçimlendirilmiş metin ‘Sekme Ekle’, ‘Hızlı Stiller’ ve ‘Tema’ ve ‘Yoğun vurgu’ karakter stili ile biçimlendirilmiş metin, ‘galeriler’ gibi mavi, italik, kalın metnin birkaç örneğidir’ ve ‘genel bakış’.

Kod

Aspose.Words belge nesnesi modelinde stil tabanlı bir sorgunun uygulanması oldukça basittir, çünkü zaten yerinde olan araçları kullanır. Bu çözüm için iki sınıf yöntemi uygulanır: ParagraphsByStyleName - Bu yöntem, belgede belirli bir stil adına sahip paragraflardan oluşan bir dizi alır. RunsByStyleName - Bu yöntem, belgede belirli bir stil adına sahip olan çalıştırmalardan oluşan bir dizi alır. Bu yöntemlerin her ikisi de çok benzerdir, tek fark düğüm türleri ve paragraf ve çalıştırma düğümleri içindeki stil bilgilerinin gösterimidir. İşte ParagraphsByStyleName ‘nin bir uygulaması. Aşağıda, belirtilen stille biçimlendirilmiş tüm paragrafları bulabilirsiniz.

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;
}

Paragraflar koleksiyonunun hemen bir ek yük oluşturmadığını da belirtmekte fayda var çünkü paragraflar yalnızca bu koleksiyondaki öğelere eriştiğinizde bu koleksiyona yüklenir. Ardından, yapmanız gereken tek şey, her operatör için standardı kullanarak koleksiyondan geçmek ve paragraphsWithStyle dizisine belirtilen stile sahip paragraflar eklemektir. Paragraph Stil adı Stilde bulunabilir. Paragraph.ParagraphFormat nesnesinin Name özelliği. RunsByStyleName’nin uygulanması hemen hemen aynıdır, ancak açıkça çalıştırma düğümlerini almak için NodeType.Run kullanıyoruz. Run nesnesinin Font.Style özelliği, Run düğümlerindeki stil bilgilerine erişmek için kullanılır. Below code örneği, belirtilen stille biçimlendirilmiş tüm çalıştırmaları bulur.

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;
}

Her iki sorgu da uygulandığında, tek yapmanız gereken bir belge nesnesini iletmek ve almak istediğiniz içeriğin stil adlarını belirtmektir: Aşağıda örnek sorguları çalıştır ve sonuçları görüntüle. Bu örneğin şablon dosyasını buradan indirebilirsiniz.

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;
}

Sonuç

Her şey bittiğinde, numuneyi çalıştırmak aşağıdaki çıktıyı gösterecektir:

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

Gördüğünüz gibi bu, toplanan paragrafların sayısını ve metnini gösteren ve örnek Word belgesinde çalışan çok basit bir örnektir.

İçindekiler Alanı Nasıl Eklenir ve Çalışılır

Genellikle bir içindekiler tablosu (TOC) içeren belgelerle çalışırsınız. Aspose.Words kullanarak kendi içindekiler tablonuzu ekleyebilir veya yalnızca birkaç satır kod kullanarak belgedeki mevcut içindekiler tablosunu tamamen yeniden oluşturabilirsiniz. Bu makalede, içindekiler alanıyla nasıl çalışılacağı özetlenmekte ve:

  • Yeni bir TOC nasıl eklenir
  • Belgedeki yeni veya mevcut TOCs öğesini güncelleyin.
  • TOC ile biçimlendirmeyi ve genel yapıyı denetlemek için anahtarları belirtin.
  • İçindekiler tablosunun stilleri ve görünümü nasıl değiştirilir.
  • Belgedeki tüm girdilerle birlikte TOC alanının tamamı nasıl kaldırılır.

TC Alanları Ekle

Genellikle TOC için belirli bir metin satırı belirtilir ve TC alanıyla işaretlenir. Bunu MS Word’de yapmanın en kolay yolu metni vurgulamak ve ALT+SHIFT+O tuşuna basmaktır. Bu, seçilen metni kullanarak otomatik olarak bir TC alanı oluşturur. Aynı teknik kod aracılığıyla da gerçekleştirilebilir. Aşağıdaki kod, girişle eşleşen metni bulacak ve metinle aynı konuma bir TC alanı ekleyecektir. Kod, makalede kullanılan aynı tekniğe dayanmaktadır. Aşağıdaki örnek, bir belgedeki metinde TC alanının nasıl bulunacağını ve ekleneceğini gösterir.

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;
}

İçindekiler Tablosunu Değiştirme

Stillerin Biçimlendirmesini Değiştirme

TOC içindeki girdilerin biçimlendirilmesi, işaretli girdilerin orijinal stillerini kullanmaz, bunun yerine her seviye eşdeğer bir TOC stili kullanılarak biçimlendirilir. Örneğin, TOC içindeki ilk düzey TOC1 stiliyle, ikinci düzey TOC2 stiliyle vb. Biçimlendirilir. Bu, TOC ‘in görünümünü değiştirmek için bu stillerin değiştirilmesi gerektiği anlamına gelir. Aspose.Words ‘da bu stiller yerel ayardan bağımsız StyleIdentifier.TOC1 ile StyleIdentifier.TOC9 arasında temsil edilir ve bu tanımlayıcılar kullanılarak Document.Styles koleksiyonundan alınabilir. Belgenin uygun stili alındıktan sonra, bu stilin biçimlendirmesi değiştirilebilir. Bu stillerdeki herhangi bir değişiklik, belgedeki TOCs öğesine otomatik olarak yansıtılacaktır. Below code örneği, birinci düzey TOC stilinde kullanılan bir biçimlendirme özelliğini değiştirir.

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 eklenecek şekilde işaretlenmiş bir paragrafın (stilde değil paragrafın kendisinde tanımlanmış) herhangi bir doğrudan biçimlendirmesinin TOC’teki girişe kopyalanacağını da not etmekte fayda vardır. Örneğin, TOC öğesinin içeriğini işaretlemek için 1 stili başlığı kullanılıyorsa ve bu stil Kalın biçimlendirmeye sahipken paragrafa doğrudan italik biçimlendirme de uygulanmışsa. Ortaya çıkan TOC girdisi, stil biçimlendirmesinin bir parçası olduğu için kalın olmayacak, ancak paragrafta doğrudan biçimlendirildiği için italik olacaktır. Her giriş ile sayfa numarası arasında kullanılan ayırıcıların biçimlendirmesini de kontrol edebilirsiniz. Varsayılan olarak, bu, bir sekme karakteri ve sağ kenar boşluğuna yakın dizilmiş bir sağ sekme durağı kullanılarak sayfa numaralandırmasına yayılmış noktalı bir çizgidir.

Değiştirmek istediğiniz belirli TOC düzeyi için alınan Style sınıfını kullanarak bunların belgede nasıl görüneceğini de değiştirebilirsiniz. Bunun nasıl göründüğünü değiştirmek için öncelikle stilin paragraf biçimlendirmesini almak için Style.ParagraphFormat çağrılmalıdır. Bundan, sekme durakları ParagraphFormat.TabStops çağrılarak alınabilir ve uygun sekme durağı değiştirilebilir. Aynı tekniği kullanarak sekmenin kendisi tamamen taşınabilir veya kaldırılabilir. Below code örneği, TOC ilgili paragraflarda sağ sekme durağının konumunun nasıl değiştirileceğini gösterir. Bu örneğin şablon dosyasını buradan indirebilirsiniz.

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);

İçindekiler Tablosunu Belgeden Kaldırma

İçindekiler tablosu, TOC alanının FieldStart ve FieldEnd düğümü arasında bulunan tüm düğümler kaldırılarak belgeden kaldırılabilir. Aşağıdaki kod bunu göstermektedir. TOC alanının kaldırılması, iç içe geçmiş alanları takip etmediğimiz için normal bir alandan daha basittir. Bunun yerine, FieldEnd düğümünün FieldType.FieldTOC türünde olduğunu kontrol ediyoruz, bu da mevcut TOC ‘nın sonuyla karşılaştığımız anlamına geliyor. Bu teknik, bu durumda herhangi bir iç içe geçmiş alan hakkında endişelenmeden kullanılabilir, çünkü düzgün oluşturulmuş herhangi bir belgenin başka bir TOC alanın içinde tam olarak iç içe geçmiş TOC alanı olmayacağını varsayabiliriz. İlk olarak, her TOC ‘ün FieldStart düğümleri toplanır ve saklanır. Belirtilen TOC daha sonra numaralandırılır, böylece alandaki tüm düğümler ziyaret edilir ve saklanır. Düğümler daha sonra belgeden kaldırılır. Below code örneği, belirtilen bir TOC‘ün bir belgeden nasıl kaldırılacağını gösterir. Bu örneğin şablon dosyasını buradan indirebilirsiniz.

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);

Farklı Paragraf Stilleri Koymak için Stil Ayırıcı Ekleyin

Stil ayırıcı, MS Kelimesine Ctrl + Alt + Enter Klavye Kısayolunu kullanarak paragrafın sonuna eklenebilir. Bu özellik, bir mantıksal yazdırılan paragrafta kullanılan iki farklı paragraf stiline izin verir. Belirli bir başlığın başından itibaren bir metnin İçindekiler Tablosunda görünmesini istiyorsanız ancak başlığın tamamının İçindekiler Tablosunda görünmesini istemiyorsanız bu özelliği kullanabilirsiniz. Below code örneği, farklı paragraf stilleri koymak için bir stil ayırıcısının nasıl ekleneceğini gösterir.

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);

Şablondan Tüm Stilleri Kopyala

Tüm stilleri bir belgeden diğerine kopyalamak istediğiniz durumlar vardır. Stilleri belirtilen şablondan bir belgeye kopyalamak için Document.CopyStylesFromTemplate yöntemini kullanabilirsiniz. Stiller şablondan belgeye kopyalandığında, belgedeki benzer adlandırılmış stiller şablondaki stil açıklamalarıyla eşleşecek şekilde yeniden tanımlanır. Şablondan benzersiz stiller belgeye kopyalanır. Belgedeki benzersiz stiller bozulmadan kalır. Below code örneği, stillerin bir belgeden diğerine nasıl kopyalanacağını gösterir.

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);