Obsah (TOC) je důležitou součástí dokumentu aplikace Word. Poskytuje přehled o obsahu dokumentu a umožňuje rychle přejít do požadované sekce. Můžete se ocitnout ve scénářích, kdy potřebujete přidat, extrahovat, aktualizovat nebo odebrat obsah z dokumentů aplikace Word programově. Za tímto účelem vás tento článek naučí, jak pracovat s obsahem v souborech Word pomocí C++.
- C++ API pro práci s obsahem v dokumentech aplikace Word
- Přidejte obsah do dokumentu aplikace Word
- Extrahujte obsah z dokumentu aplikace Word
- Aktualizujte obsah v dokumentu aplikace Word
- Odebrat obsah z dokumentu aplikace Word
C++ API pro práci s obsahem v dokumentech aplikace Word
Aspose.Words for C++ je nativní knihovna C++, která umožňuje vytvářet, číst, upravovat a převádět dokumenty Microsoft Word. Kromě toho také podporuje práci s obsahem v souborech aplikace Word. Rozhraní API můžete nainstalovat buď prostřednictvím NuGet, nebo si jej stáhnout přímo ze sekce Downloads.
PM> Install-Package Aspose.Words.Cpp
Přidejte obsah do dokumentu aplikace Word
Následují kroky k přidání obsahu do dokumentu aplikace Word.
- Načtěte soubor aplikace Word pomocí třídy Document.
- Vytvořte instanci třídy DocumentBuilder pomocí dříve vytvořeného objektu Document.
- Obsah vložte pomocí metody DocumentBuilder->InsertTableOfContents(System::String switche).
- Naplňte obsah pomocí metody Document->UpdateFields().
- Uložte dokument aplikace Word pomocí metody Document->Save(System::String fileName).
Následující ukázkový kód ukazuje, jak přidat obsah do dokumentu aplikace Word pomocí C++.
// Cesty zdrojového a výstupního adresáře.
System::String sourceDataDir = u"SourceDirectory\\";
System::String outputDataDir = u"OutputDirectory\\";
// Načtěte soubor aplikace Word
System::SharedPtr<Document> doc = System::MakeObject<Document>(sourceDataDir + u"Sample 5.docx");
// Vytvořte instanci třídy DocumentBuilder
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc);
// Na začátek dokumentu vložte obsah.
builder->InsertTableOfContents(u"\\o \"1-3\" \\h \\z \\u");
// Nově vložený obsah bude zpočátku prázdný.
// Je třeba jej vyplnit aktualizací polí v dokumentu.
doc->UpdateFields();
// Cesta k výstupnímu souboru
System::String outputPath = outputDataDir + u"AddTOC.docx";
// Uložte soubor aplikace Word
doc->Save(outputPath);
Extrahujte obsah z dokumentu aplikace Word
Následují kroky k extrahování obsahu z dokumentu aplikace Word.
- Načtěte soubor aplikace Word pomocí třídy Document.
- Získejte pole pomocí metody Document->getRange()->getFields() a opakujte je.
- Zkontrolujte, zda je pole typu FieldType::FieldHyperlink.
- Zkontrolujte, zda pole patří do obsahu.
- Načtěte a vytiskněte informace o poli.
Následující ukázkový kód ukazuje, jak extrahovat obsah z dokumentu aplikace Word pomocí C++.
// Zdrojový adresář
System::String inputDataDir = u"SourceDirectory\\";
// Načtěte soubor aplikace Word
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"SampleTOC.docx");
// Projděte pole
for (System::SharedPtr<Field> field : System::IterateOver(doc->get_Range()->get_Fields()))
{
// Získejte pole FieldHyperlink
if (field->get_Type() == FieldType::FieldHyperlink)
{
System::SharedPtr<FieldHyperlink> hyperlink = System::DynamicCast<FieldHyperlink>(field);
// Zkontrolujte, zda pole patří do obsahu
if (hyperlink->get_SubAddress() != nullptr && hyperlink->get_SubAddress().StartsWith(u"_Toc"))
{
System::SharedPtr<Paragraph> tocItem = System::DynamicCast<Paragraph>(field->get_FieldStart()->GetAncestor(NodeType::Paragraph));
std::cout << System::StaticCast<Node>(tocItem)->ToString(SaveFormat::Text).Trim().ToUtf8String() << std::endl;
std::cout << "------------------" << std::endl;
if (tocItem != nullptr)
{
System::SharedPtr<Bookmark> bm = doc->get_Range()->get_Bookmarks()->idx_get(hyperlink->get_SubAddress());
// Získejte umístění, na které ukazuje tato položka TOC
System::SharedPtr<Paragraph> pointer = System::DynamicCast<Paragraph>(bm->get_BookmarkStart()->GetAncestor(NodeType::Paragraph));
std::cout << System::StaticCast<Node>(pointer)->ToString(SaveFormat::Text).ToUtf8String() << std::endl;
}
}
}
}
Aktualizujte obsah v dokumentu aplikace Word
Pokud byl obsah dokumentu aktualizován a vy potřebujete zohlednit tyto změny v obsahu, stačí načíst soubor aplikace Word a zavolat metodu Document->UpdateFields(). Tato metoda aktualizuje obsah podle upraveného obsahu. Poté uložte aktualizovaný dokument aplikace Word.
Odebrat obsah z dokumentu aplikace Word
Následují kroky k odebrání obsahu z dokumentu aplikace Word.
- Načtěte soubor aplikace Word pomocí třídy Document.
- Načtěte a uložte seznam uzlů FieldStart.
- Procházejte uzly, dokud nedosáhnete uzlu typu NodeType::FieldEnd, který označuje konec obsahu.
- Odstraňte obsah pomocí metody Node->Remove().
- Uložte dokument aplikace Word pomocí metody Document->Save(System::String fileName).
Následující ukázkový kód ukazuje, jak odebrat obsah z dokumentu aplikace Word pomocí C++.
void RemoveTableOfContents(const System::SharedPtr<Document>& doc, int32_t index)
{
// Uložte uzly FieldStart polí obsahu v dokumentu pro rychlý přístup.
std::vector<System::SharedPtr<FieldStart>> fieldStarts;
// Toto je seznam pro uložení uzlů nalezených uvnitř zadaného obsahu. Budou odstraněny
// na konci této metody.
std::vector<System::SharedPtr<Node>> nodeList;
for (System::SharedPtr<FieldStart> start : System::IterateOver<System::SharedPtr<FieldStart>>(doc->GetChildNodes(NodeType::FieldStart, true)))
{
if (start->get_FieldType() == FieldType::FieldTOC)
{
// Přidejte všechny FieldStarty, které jsou typu FieldTOC.
fieldStarts.push_back(start);
}
}
// Ujistěte se, že TOC určený předaným indexem existuje.
if (index > fieldStarts.size() - 1)
{
throw System::ArgumentOutOfRangeException(u"TOC index is out of range");
}
bool isRemoving = true;
// Získejte FieldStart zadaného obsahu.
System::SharedPtr<Node> currentNode = fieldStarts[index];
while (isRemoving)
{
// Je bezpečnější tyto uzly uložit a později je všechny najednou smazat.
nodeList.push_back(currentNode);
currentNode = currentNode->NextPreOrder(doc);
// Jakmile narazíme na uzel FieldEnd typu FieldTOC, pak víme, že jsme na konci
// aktuálního TOC a zde se můžeme zastavit.
if (currentNode->get_NodeType() == NodeType::FieldEnd)
{
System::SharedPtr<FieldEnd> fieldEnd = System::DynamicCast<FieldEnd>(currentNode);
if (fieldEnd->get_FieldType() == FieldType::FieldTOC)
{
isRemoving = false;
}
}
}
// Odeberte všechny uzly nalezené v zadaném obsahu.
for (System::SharedPtr<Node> node : nodeList)
{
node->Remove();
}
}
int main()
{
// Cesty zdrojového a výstupního adresáře.
System::String sourceDataDir = u"SourceDirectory\\";
System::String outputDataDir = u"OutputDirectory\\";
// Otevřete dokument aplikace Word
System::SharedPtr<Document> doc = System::MakeObject<Document>(sourceDataDir + u"SampleTOC.docx");
// Odeberte z dokumentu první obsah.
RemoveTableOfContents(doc, 0);
// Cesta k výstupnímu souboru
System::String outputPath = outputDataDir + u"RemoveTOC.docx";
// Uložte soubor aplikace Word
doc->Save(outputPath);
}
Získejte bezplatnou licenci
Rozhraní API můžete vyzkoušet bez omezení hodnocení tím, že požádáte o bezplatnou dočasnou licenci.
Závěr
V tomto článku jste se naučili pracovat s obsahem v dokumentech Word pomocí C++. Viděli jste kroky a ukázkový kód potřebný k přidání, extrahování, aktualizaci a odebrání obsahu z dokumentů aplikace Word. Aspose.Words for C++ poskytuje mnoho dalších funkcí pro práci se soubory aplikace Word. Rozhraní API můžete podrobně prozkoumat na oficiální dokumentaci. V případě jakýchkoli dotazů nás neváhejte kontaktovat na našem bezplatném fóru podpory.