Nahraďte pole statickým textem
Nahrazení polí je často vyžadováno, pokud chcete dokument uložit jako statickou kopii. Například při odesílání jako příloha v e-mailu. Převod polí jako DATE
nebo TIME
na statický text umožní dokumentu zobrazit stejné datum, jako když byl odeslán. V některých situacích také možná budete muset z dokumentu odebrat podmíněná pole IF
a místo toho je nahradit nejnovějším výsledkem textu. Například převod výsledku pole IF
na statický text, takže již nebude dynamicky měnit jeho hodnotu při aktualizaci polí v dokumentu.
Níže uvedený diagram ukazuje, jak je pole IF
uloženo v dokumentu:
- text je obklopen speciálními uzly pole - FieldStart a FieldEnd
- uzel FieldSeparator odděluje text v poli na kód pole a výsledek pole
- kód pole definuje obecné chování pole, zatímco výsledek pole zachovává nejnovější výsledek, když je toto pole aktualizováno pomocí Microsoft Word nebo Aspose.Words
- výsledkem pole je to, co je uloženo v poli a zobrazeno v dokumentu při prohlížení
Strukturu lze také vidět níže v hierarchické podobě pomocí demo projektu “DocumentExplorer”.
Pole, která nelze nahradit textem
Nahrazení pole statickým textem nefunguje správně pro některá pole v záhlaví nebo zápatí.
Například pokus o převod pole PAGE
v záhlaví nebo zápatí na statický text bude mít za následek zobrazení stejné hodnoty na všech stránkách. Je to proto, že záhlaví a zápatí se opakují na více stránkách, a když zůstanou jako pole, jsou zpracovány zejména proto, aby zobrazovaly správný výsledek pro každou stránku.
V záhlaví se však pole PAGE
dobře překládá na statický běh textu. Tento běh textu bude vyhodnocen, jako by to byla poslední stránka v sekci, což způsobí, že jakékoli pole PAGE
v záhlaví zobrazí poslední stránku na všech stránkách.
Následující příklad kódu ukazuje, jak nahradit pole jeho nejnovějším výsledkem:
//For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
auto doc = MakeObject<Document>(MyDir + u"Linked fields.docx"); | |
doc->UnlinkFields(); |
Převést určité typy polí v konkrétních částech dokumentu
Protože metoda ConvertFieldsToStaticText přijímá dva parametry – vlastnosti CompositeNode a výčet FieldType, je možné této metodě předat jakýkoli složený uzel. To umožňuje převést pole na statický text pouze v určitých částech dokumentu.
Můžete například předat objekt Document a převést pole zadaného typu z celého dokumentu na statický text, nebo můžete předat objekt Body sekce a převést pouze pole nalezená v tomto těle.
Výčet FieldType předaný metodě ConvertFieldsToStaticText určuje, jaký typ polí má být převeden na statický text. Jakýkoli jiný typ pole nalezený v dokumentu zůstane nezměněn.
Následující příklad kódu ukazuje, jak vybrat pole konkrétního typu - targetFieldType v konkrétním uzlu - compositeNode a poté je převést na statický text:
//For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
void ConvertFieldsToStaticText(System::SharedPtr<CompositeNode> compositeNode, FieldType targetFieldType) | |
{ | |
for (const auto& field : System::IterateOver(compositeNode->get_Range()->get_Fields())) | |
{ | |
if (field->get_Type() == targetFieldType) | |
{ | |
field->Unlink(); | |
} | |
} | |
} |
Následující příklad kódu ukazuje, jak převést všechna pole IF
v dokumentu na statický text:
//For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
auto doc = MakeObject<Document>(MyDir + u"Linked fields.docx"); | |
// Pass the appropriate parameters to convert all IF fields encountered in the document (including headers and footers) to text. | |
doc->get_Range() | |
->get_Fields() | |
->LINQ_Where([](SharedPtr<Field> f) { return f->get_Type() == FieldType::FieldIf; }) | |
->LINQ_ToList() | |
->ForEach(std::function<void(SharedPtr<Field> f)>([](SharedPtr<Field> f) { f->Unlink(); })); | |
doc->Save(ArtifactsDir + u"WorkingWithFields.ConvertFieldsInDocument.docx"); |
Následující příklad kódu ukazuje, jak převést všechna pole PAGE
v těle dokumentu na statický text:
//For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
auto doc = MakeObject<Document>(MyDir + u"Linked fields.docx"); | |
// Pass the appropriate parameters to convert all IF fields encountered in the document (including headers and footers) to text. | |
doc->get_Range() | |
->get_Fields() | |
->LINQ_Where([](SharedPtr<Field> f) { return f->get_Type() == FieldType::FieldIf; }) | |
->LINQ_ToList() | |
->ForEach(std::function<void(SharedPtr<Field> f)>([](SharedPtr<Field> f) { f->Unlink(); })); | |
doc->Save(ArtifactsDir + u"WorkingWithFields.ConvertFieldsInDocument.docx"); |
Následující příklad kódu ukazuje, jak převést všechna pole IF
v posledním odstavci na statický text:
//For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
auto doc = MakeObject<Document>(MyDir + u"Linked fields.docx"); | |
// Pass the appropriate parameters to convert all IF fields encountered in the document (including headers and footers) to text. | |
doc->get_Range() | |
->get_Fields() | |
->LINQ_Where([](SharedPtr<Field> f) { return f->get_Type() == FieldType::FieldIf; }) | |
->LINQ_ToList() | |
->ForEach(std::function<void(SharedPtr<Field> f)>([](SharedPtr<Field> f) { f->Unlink(); })); | |
doc->Save(ArtifactsDir + u"WorkingWithFields.ConvertFieldsInDocument.docx"); |