Belgedeki Düğümler Arasındaki İçeriği Çıkarma
Belgelerle çalışırken, belge içindeki belirli bir aralıktan içeriği kolayca çıkarabilmek önemlidir. Ancak içerik paragraf, tablo, resim vb. gibi karmaşık unsurlardan oluşabilir.
Hangi içeriğin çıkarılması gerektiğine bakılmaksızın, bu içeriği çıkarma yöntemi her zaman, aralarında içerik çıkarmak için hangi düğümlerin seçildiğine göre belirlenecektir. Bunlar tüm metin gövdeleri veya basit metin çalıştırmaları olabilir.
İçerik çıkarırken dikkate alınması gereken birçok olası durum ve dolayısıyla birçok farklı düğüm türü vardır. Örneğin, aşağıdakiler arasında içerik çıkarmak isteyebilirsiniz:
- İki özel paragraf
- Belirli metin dizileri
- Birleştirme alanları gibi çeşitli türlerdeki alanlar
- Bir yer işaretinin veya yorumun başlangıç ve bitiş aralıkları
- Ayrı bölümlerde bulunan çeşitli metin gövdeleri
Bazı durumlarda, bir paragraf ile alan arasında veya bir çalıştırma ile yer imi arasında içerik çıkarmak gibi farklı düğüm türlerini birleştirmeniz bile gerekebilir.
Bu makalede, farklı düğümler arasında metin çıkarmaya yönelik kod uygulamasının yanı sıra yaygın senaryo örnekleri de sağlanmaktadır.
Neden İçeriği Çıkartın?
Çoğu zaman içeriği çıkarmanın amacı onu çoğaltmak veya yeni bir belgeye ayrı olarak kaydetmektir. Örneğin, içerik çıkarabilir ve şunları yapabilirsiniz:
- Ayrı bir belgeye kopyalayın
- Belgenin belirli bir bölümünü PDF’ye veya resme dönüştürün
- Belgedeki içeriği birçok kez çoğaltın
- Belgenin geri kalanından ayrı olarak çıkarılan içerikle çalışın
Bu, Aspose.Words ve aşağıdaki kod uygulaması kullanılarak kolayca başarılabilir.
İçerik Algoritmasını Çıkarma
Bu bölümdeki kod, yukarıda açıklanan tüm olası durumları genelleştirilmiş ve yeniden kullanılabilir bir yöntemle ele almaktadır. Bu tekniğin genel taslağı şunları içerir:
- Belgenizden çıkarılacak içerik alanını belirleyen düğümleri toplamak. Bu düğümlerin alınması, çıkarmak istedikleri şeye bağlı olarak kullanıcı tarafından kendi kodunda gerçekleştirilir.
- Bu düğümleri aşağıda verilen ExtractContent yöntemine geçirmek. Ayrıca, işaretçi görevi gören bu düğümlerin çıkarma işlemine dahil edilip edilmeyeceğini belirten bir boolean parametresi de iletmelisiniz.
- Çıkarılması belirtilen klonlanmış içeriğin (kopyalanan düğümler) listesinin alınması. Bu düğüm listesini uygun herhangi bir şekilde kullanabilirsiniz; örneğin yalnızca seçilen içeriği içeren yeni bir belge oluşturmak gibi.
İçerik Nasıl Çıkarılır
İçeriği belgenizden çıkarmak için aşağıdaki ExtractContent yöntemini çağırmanız ve uygun parametreleri iletmeniz gerekir. Bu yöntemin temelindeki temel, blok düzeyindeki düğümlerin (paragraflar ve tablolar) bulunmasını ve bunların aynı kopyaları oluşturacak şekilde klonlanmasını içerir. Geçilen işaretleyici düğümler blok düzeyindeyse, yöntem yalnızca bu düzeydeki içeriği kopyalayabilir ve diziye ekleyebilir.
Bununla birlikte, işaretleyici düğümler satır içiyse (paragrafın çocuğu) durum daha karmaşık hale gelir, çünkü paragrafı satır içi düğümde bölmek gerekir; bir çalıştırma, yer imi alanları vb. olsun. Klonlanmış ana düğümlerdeki içerik, İşaretleyiciler arasında mevcut olanlar kaldırılır. Bu işlem, satır içi düğümlerin hala ana paragrafın biçimlendirmesini koruyacağından emin olmak için kullanılır. Yöntem aynı zamanda parametre olarak iletilen düğümler üzerinde de denetimler çalıştıracak ve düğümlerden herhangi birinin geçersiz olması durumunda bir istisna oluşturacaktır. Bu yönteme iletilecek parametreler şunlardır:
- StartNode ve EndNode. İlk iki parametre, içeriğin çıkarılmasının sırasıyla nerede başlayacağını ve biteceğini tanımlayan düğümlerdir. Bu düğümler hem blok düzeyinde (Paragraph, Table) hem de satır içi düzeyde (örn. Run, FieldStart, BookmarkStart vb.) olabilir:
- Bir alanı iletmek için ilgili FieldStart nesnesini iletmelisiniz
- Yer imlerini iletmek için BookmarkStart ve BookmarkEnd düğümlerinin iletilmesi gerekir
- Yorumları iletmek için CommentRangeStart ve CommentRangeEnd düğümleri kullanılmalıdır 1.IsInclusive. İşaretleyicilerin ekstraksiyona dahil edilip edilmeyeceğini tanımlar. Bu seçenek false olarak ayarlanırsa ve aynı düğüm veya ardışık düğümler aktarılırsa boş bir liste döndürülür:
- Bir FieldStart düğümü aktarılırsa bu seçenek tüm alanın dahil edileceğini veya hariç tutulacağını tanımlar
- Bir BookmarkStart veya BookmarkEnd düğümü aktarılırsa bu seçenek, yer iminin mi yoksa yalnızca yer imi aralığı arasındaki içeriğin mi dahil edileceğini tanımlar.
- Bir CommentRangeStart veya CommentRangeEnd düğümü aktarılırsa bu seçenek, yorumun kendisinin mi yoksa yalnızca yorum aralığındaki içeriğin mi dahil edileceğini tanımlar.
ExtractContent yönteminin uygulanmasını Aspose.Words GitHub’de‘de bulabilirsiniz. Bu makaledeki senaryolarda bu yönteme değinilecektir.
Çıkarılan düğümlerden kolayca belge oluşturmak için özel bir yöntem de tanımlayacağız. Bu yöntem aşağıdaki senaryoların çoğunda kullanılır ve yalnızca yeni bir belge oluşturur ve çıkarılan içeriği bu belgeye aktarır.
Aşağıdaki kod örneği, düğüm listesinin nasıl alınacağını ve bunların yeni bir belgeye nasıl ekleneceğini gösterir:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
public static Document GenerateDocument(Document srcDoc, List<Node> nodes) | |
{ | |
Document dstDoc = new Document(); | |
// Remove the first paragraph from the empty document. | |
dstDoc.FirstSection.Body.RemoveAllChildren(); | |
// Import each node from the list into the new document. Keep the original formatting of the node. | |
NodeImporter importer = new NodeImporter(srcDoc, dstDoc, ImportFormatMode.KeepSourceFormatting); | |
foreach (Node node in nodes) | |
{ | |
Node importNode = importer.ImportNode(node, true); | |
dstDoc.FirstSection.Body.AppendChild(importNode); | |
} | |
return dstDoc; | |
} |
Paragraflar Arasındaki İçeriği Çıkartın
Bu, belirli paragraflar arasındaki içeriği çıkarmak için yukarıdaki yöntemin nasıl kullanılacağını gösterir. Bu durumda belgenin ilk yarısında bulunan mektubun gövdesini çıkarmak istiyoruz. Bunun 7. ve 11. paragraflar arasında olduğunu söyleyebiliriz.
Aşağıdaki kod bu görevi yerine getirir. Uygun paragraflar belge üzerinde GetChild yöntemi kullanılarak ve belirtilen indekslerden geçirilerek çıkarılır. Daha sonra bu düğümleri ExtractContent yöntemine aktarıyoruz ve bunların da ekstraksiyona dahil edilmesi gerektiğini belirtiyoruz. Bu yöntem, daha sonra yeni bir belgeye eklenen bu düğümler arasında kopyalanan içeriği döndürür.
Aşağıdaki kod örneği, yukarıdaki ExtractContent
yöntemini kullanarak belirli paragraflar arasındaki içeriğin nasıl çıkarılacağını gösterir:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
Document doc = new Document(MyDir + "Extract content.docx"); | |
Paragraph startPara = (Paragraph) doc.FirstSection.Body.GetChild(NodeType.Paragraph, 6, true); | |
Paragraph endPara = (Paragraph) doc.FirstSection.Body.GetChild(NodeType.Paragraph, 10, true); | |
// Extract the content between these nodes in the document. Include these markers in the extraction. | |
List<Node> extractedNodes = ExtractContentHelper.ExtractContent(startPara, endPara, true); | |
Document dstDoc = ExtractContentHelper.GenerateDocument(doc, extractedNodes); | |
dstDoc.Save(ArtifactsDir + "ExtractContent.ExtractContentBetweenParagraphs.docx"); |
Farklı Düğüm Türleri Arasında İçerik Çıkarma
Blok düzeyi veya satır içi düğümlerin herhangi bir kombinasyonu arasından içerik çıkarabiliriz. Aşağıdaki bu senaryoda, ilk paragraf ile ikinci bölümdeki tablo arasındaki içeriği kapsamlı bir şekilde çıkaracağız. Uygun Paragraph ve Table düğümlerini almak için belgenin ikinci bölümünde FirstParagraph ve GetChild yöntemlerini çağırarak işaretçi düğümlerini alıyoruz. Küçük bir değişiklik için bunun yerine içeriği kopyalayıp orijinalin altına ekleyelim.
Aşağıdaki kod örneği, ExtractContent yöntemini kullanarak bir paragraf ile tablo arasındaki içeriğin nasıl çıkarılacağını gösterir:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
Document doc = new Document(MyDir + "Extract content.docx"); | |
Paragraph startPara = (Paragraph) doc.LastSection.GetChild(NodeType.Paragraph, 2, true); | |
Table endTable = (Table) doc.LastSection.GetChild(NodeType.Table, 0, true); | |
// Extract the content between these nodes in the document. Include these markers in the extraction. | |
List<Node> extractedNodes = ExtractContentHelper.ExtractContent(startPara, endTable, true); | |
// Let's reverse the array to make inserting the content back into the document easier. | |
extractedNodes.Reverse(); | |
foreach (Node extractedNode in extractedNodes) | |
endTable.ParentNode.InsertAfter(extractedNode, endTable); | |
doc.Save(ArtifactsDir + "ExtractContent.ExtractContentBetweenBlockLevelNodes.docx"); |
Stile Göre Paragraflar Arasındaki İçeriği Çıkarın
Başlık stilleriyle işaretlenmiş paragraflar arasında olduğu gibi, aynı veya farklı stildeki paragraflar arasındaki içeriği çıkarmanız gerekebilir. Aşağıdaki kod bunun nasıl başarılacağını gösterir. “Başlık 1” ve “Başlık 3” stillerinin ilk örneği arasındaki içeriği, başlıkları da çıkarmadan çıkaracak basit bir örnektir. Bunu yapmak için son parametreyi, işaretleyici düğümlerin dahil edilmemesi gerektiğini belirten false olarak ayarladık.
Uygun bir uygulamada, bu stillerin tüm paragrafları arasındaki içeriği belgeden çıkarmak için bu bir döngü içinde çalıştırılmalıdır. Çıkarılan içerik yeni bir belgeye kopyalanır.
Aşağıdaki kod örneği, ExtractContent yöntemini kullanarak belirli stillere sahip paragraflar arasındaki içeriğin nasıl çıkarılacağını gösterir:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
Document doc = new Document(MyDir + "Extract content.docx"); | |
// Gather a list of the paragraphs using the respective heading styles. | |
List<Paragraph> parasStyleHeading1 = ParagraphsByStyleName(doc, "Heading 1"); | |
List<Paragraph> parasStyleHeading3 = ParagraphsByStyleName(doc, "Heading 3"); | |
// Use the first instance of the paragraphs with those styles. | |
Node startPara = parasStyleHeading1[0]; | |
Node endPara = parasStyleHeading3[0]; | |
// Extract the content between these nodes in the document. Don't include these markers in the extraction. | |
List<Node> extractedNodes = ExtractContentHelper.ExtractContent(startPara, endPara, false); | |
Document dstDoc = ExtractContentHelper.GenerateDocument(doc, extractedNodes); | |
dstDoc.Save(ArtifactsDir + "ExtractContent.ExtractContentBetweenParagraphStyles.docx"); |
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
public List<Paragraph> ParagraphsByStyleName(Document doc, string styleName) | |
{ | |
// Create an array to collect paragraphs of the specified style. | |
List<Paragraph> paragraphsWithStyle = new List<Paragraph>(); | |
NodeCollection paragraphs = doc.GetChildNodes(NodeType.Paragraph, true); | |
// Look through all paragraphs to find those with the specified style. | |
foreach (Paragraph paragraph in paragraphs) | |
{ | |
if (paragraph.ParagraphFormat.Style.Name == styleName) | |
paragraphsWithStyle.Add(paragraph); | |
} | |
return paragraphsWithStyle; | |
} |
Belirli Çalıştırmalar Arasında İçerik Çıkarma
Run gibi satır içi düğümler arasında da içerik çıkarabilirsiniz. Farklı paragraflardaki Runs işaretçiler olarak aktarılabilir. Aşağıdaki kod, aynı Paragraph düğümü arasında belirli bir metnin nasıl çıkarılacağını gösterir.
Aşağıdaki kod örneği, ExtractContent yöntemini kullanarak aynı paragrafın belirli çalıştırmaları arasındaki içeriğin nasıl çıkarılacağını gösterir:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
Document doc = new Document(MyDir + "Extract content.docx"); | |
Paragraph para = (Paragraph) doc.GetChild(NodeType.Paragraph, 7, true); | |
Run startRun = para.Runs[1]; | |
Run endRun = para.Runs[4]; | |
// Extract the content between these nodes in the document. Include these markers in the extraction. | |
List<Node> extractedNodes = ExtractContentHelper.ExtractContent(startRun, endRun, true); | |
foreach (Node extractedNode in extractedNodes) | |
Console.WriteLine(extractedNode.ToString(SaveFormat.Text)); |
Bir Alanı Kullanarak İçeriği Çıkarma
Bir alanı işaretleyici olarak kullanmak için FieldStart
düğümünün iletilmesi gerekir. ExtractContent
yönteminin son parametresi tüm alanın dahil edilip edilmeyeceğini tanımlayacaktır. Belgedeki “FullName” birleştirme alanı ile bir paragraf arasındaki içeriği çıkaralım. DocumentBuilder sınıfının MoveToMergeField yöntemini kullanıyoruz. Bu, kendisine iletilen birleştirme alanının adından FieldStart düğümünü döndürecektir.
Bizim durumumuzda alanı çıkarma işleminin dışında bırakmak için ExtractContent yöntemine iletilen son parametreyi false olarak ayarlayalım. Çıkarılan içeriği PDF’ye dönüştüreceğiz.
Aşağıdaki kod örneği, ExtractContent yöntemini kullanarak belgedeki belirli bir alan ile paragraf arasındaki içeriğin nasıl çıkarılacağını gösterir:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
Document doc = new Document(MyDir + "Extract content.docx"); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
// Pass the first boolean parameter to get the DocumentBuilder to move to the FieldStart of the field. | |
// We could also get FieldStarts of a field using GetChildNode method as in the other examples. | |
builder.MoveToMergeField("Fullname", false, false); | |
// The builder cursor should be positioned at the start of the field. | |
FieldStart startField = (FieldStart) builder.CurrentNode; | |
Paragraph endPara = (Paragraph) doc.FirstSection.GetChild(NodeType.Paragraph, 5, true); | |
// Extract the content between these nodes in the document. Don't include these markers in the extraction. | |
List<Node> extractedNodes = ExtractContentHelper.ExtractContent(startField, endPara, false); | |
Document dstDoc = ExtractContentHelper.GenerateDocument(doc, extractedNodes); | |
dstDoc.Save(ArtifactsDir + "ExtractContent.ExtractContentUsingField.docx"); |
Bir Yer İşaretinden İçerik Çıkarma
Bir belgede, bir yer imi içinde tanımlanan içerik, BookmarkStart
ve BookmarkEnd düğümleri tarafından kapsüllenir. Bu iki düğüm arasında bulunan içerik yer imini oluşturur. Başlangıç işaretçisi belgedeki bitiş işaretçisinden önce göründüğü sürece, bu düğümlerden herhangi birini, farklı yer imlerinden olanlar da dahil olmak üzere herhangi bir işaretçi olarak geçirebilirsiniz. Aşağıdaki kodu kullanarak bu içeriği yeni bir belgeye çıkaracağız. IsInclusive parametre seçeneği, yer iminin nasıl tutulacağını veya atılacağını gösterir.
Aşağıdaki kod örneği, ExtractContent yöntemini kullanarak bir yer işaretine başvurulan içeriğin nasıl çıkarılacağını gösterir:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
Document doc = new Document(MyDir + "Extract content.docx"); | |
Bookmark bookmark = doc.Range.Bookmarks["Bookmark1"]; | |
BookmarkStart bookmarkStart = bookmark.BookmarkStart; | |
BookmarkEnd bookmarkEnd = bookmark.BookmarkEnd; | |
// Firstly, extract the content between these nodes, including the bookmark. | |
List<Node> extractedNodesInclusive = ExtractContentHelper.ExtractContent(bookmarkStart, bookmarkEnd, true); | |
Document dstDoc = ExtractContentHelper.GenerateDocument(doc, extractedNodesInclusive); | |
dstDoc.Save(ArtifactsDir + "ExtractContent.ExtractContentBetweenBookmark.IncludingBookmark.docx"); | |
// Secondly, extract the content between these nodes this time without including the bookmark. | |
List<Node> extractedNodesExclusive = ExtractContentHelper.ExtractContent(bookmarkStart, bookmarkEnd, false); | |
dstDoc = ExtractContentHelper.GenerateDocument(doc, extractedNodesExclusive); | |
dstDoc.Save(ArtifactsDir + "ExtractContent.ExtractContentBetweenBookmark.WithoutBookmark.docx"); |
Bir Yorumdan İçerik Çıkarma
Bir yorum CommentRangeStart, CommentRangeEnd ve Comment düğümlerinden oluşur. Bu düğümlerin tümü satır içidir. İlk iki düğüm, aşağıdaki ekran görüntüsünde görüldüğü gibi, yorumun referans verdiği belgedeki içeriği kapsar.
Comment düğümünün kendisi paragraflar ve çalıştırmalar içerebilen bir InlineStory‘dir. İnceleme bölmesinde bir yorum balonu olarak görülen yorumun mesajını temsil eder. Bu düğüm satır içi olduğundan ve bir gövdenin soyundan geldiğinden, içeriği bu mesajın içinden de çıkarabilirsiniz.
Yorum, başlığı, ilk paragrafı ve ikinci bölümdeki tabloyu kapsar. Bu yorumu yeni bir belgeye çıkaralım. IsInclusive seçeneği, yorumun kendisinin tutulacağını veya atılacağını belirler.
Aşağıdaki kod örneği bunun nasıl yapılacağını gösterir:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
Document doc = new Document(MyDir + "Extract content.docx"); | |
CommentRangeStart commentStart = (CommentRangeStart) doc.GetChild(NodeType.CommentRangeStart, 0, true); | |
CommentRangeEnd commentEnd = (CommentRangeEnd) doc.GetChild(NodeType.CommentRangeEnd, 0, true); | |
// Firstly, extract the content between these nodes including the comment as well. | |
List<Node> extractedNodesInclusive = ExtractContentHelper.ExtractContent(commentStart, commentEnd, true); | |
Document dstDoc = ExtractContentHelper.GenerateDocument(doc, extractedNodesInclusive); | |
dstDoc.Save(ArtifactsDir + "ExtractContent.ExtractContentBetweenCommentRange.IncludingComment.docx"); | |
// Secondly, extract the content between these nodes without the comment. | |
List<Node> extractedNodesExclusive = ExtractContentHelper.ExtractContent(commentStart, commentEnd, false); | |
dstDoc = ExtractContentHelper.GenerateDocument(doc, extractedNodesExclusive); | |
dstDoc.Save(ArtifactsDir + "ExtractContent.ExtractContentBetweenCommentRange.WithoutComment.docx"); |
DocumentVisitor Kullanarak İçerik Nasıl Çıkarılır
Bu kullanım senaryosunu uygulamak için DocumentVisitor sınıfını kullanın. Bu sınıf, iyi bilinen Ziyaretçi tasarım modeline karşılık gelir. DocumentVisitor , ile belge ağacı üzerinde numaralandırma gerektiren özel işlemleri tanımlayabilir ve yürütebilirsiniz.
DocumentVisitor, belirli bir belge öğesiyle (düğüm) karşılaşıldığında çağrılan bir dizi VisitXXX yöntemi sağlar. Örneğin, bir metin paragrafının başlangıcı bulunduğunda VisitParagraphStart çağrılır ve bir metin paragrafının sonu bulunduğunda VisitParagraphEnd çağrılır. Her DocumentVisitor.VisitXXX yöntemi karşılaştığı ilgili nesneyi kabul eder, böylece onu gerektiği gibi kullanabilirsiniz (örneğin, biçimlendirmeyi geri alın), örneğin hem DocumentVisitor.VisitParagraphStart hem de DocumentVisitor.VisitParagraphEnd bir Paragraph nesnesini kabul eder.
Her DocumentVisitor.VisitXXX yöntemi, düğümlerin numaralandırılmasını kontrol eden bir VisitorAction değeri döndürür. Numaralandırmaya devam etmeyi, geçerli düğümü atlamayı (ancak numaralandırmaya devam etmeyi) veya düğümlerin numaralandırmasını durdurmayı talep edebilirsiniz.
Bir belgenin çeşitli bölümlerini programlı olarak belirlemek ve çıkarmak için izlemeniz gereken adımlar şunlardır:
- DocumentVisitor‘ten türetilmiş bir sınıf oluşturun
- Bazı özel işlemleri gerçekleştirmek için DocumentVisitor.VisitXXX yöntemlerinin bir kısmı veya tamamı için uygulamaları geçersiz kılın ve sağlayın
- Numaralandırmayı başlatmak istediğiniz düğümde Node.Accept‘i arayın; örneğin, belgenin tamamını numaralandırmak istiyorsanız Document.Accept‘yi kullanın
DocumentVisitor, tüm DocumentVisitor.VisitXXX yöntemleri için varsayılan uygulamaları sağlar. Bu, yalnızca belirli bir ziyaretçi için gereken yöntemlerin geçersiz kılınması gerektiğinden, yeni belge ziyaretçileri oluşturmayı kolaylaştırır. Tüm ziyaretçi yöntemlerinin geçersiz kılınması gerekli değildir.
Aşağıdaki örnek, Aspose.Words nesne modeline yeni işlemler eklemek için Ziyaretçi modelinin nasıl kullanılacağını gösterir. Bu durumda, metin formatına basit bir belge dönüştürücü oluşturuyoruz:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
Document doc = new Document(MyDir + "Extract content.docx"); | |
ConvertDocToTxt convertToPlainText = new ConvertDocToTxt(); | |
// Note that every node in the object model has the accept method so the visiting | |
// can be executed not only for the whole document, but for any node in the document. | |
doc.Accept(convertToPlainText); | |
// Once the visiting is complete, we can retrieve the result of the operation, | |
// That in this example, has accumulated in the visitor. | |
Console.WriteLine(convertToPlainText.GetText()); |
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
/// <summary> | |
/// Simple implementation of saving a document in the plain text format. Implemented as a Visitor. | |
/// </summary> | |
internal class ConvertDocToTxt : DocumentVisitor | |
{ | |
public ConvertDocToTxt() | |
{ | |
mIsSkipText = false; | |
mBuilder = new StringBuilder(); | |
} | |
/// <summary> | |
/// Gets the plain text of the document that was accumulated by the visitor. | |
/// </summary> | |
public string GetText() | |
{ | |
return mBuilder.ToString(); | |
} | |
/// <summary> | |
/// Called when a Run node is encountered in the document. | |
/// </summary> | |
public override VisitorAction VisitRun(Run run) | |
{ | |
AppendText(run.Text); | |
// Let the visitor continue visiting other nodes. | |
return VisitorAction.Continue; | |
} | |
/// <summary> | |
/// Called when a FieldStart node is encountered in the document. | |
/// </summary> | |
public override VisitorAction VisitFieldStart(FieldStart fieldStart) | |
{ | |
// In Microsoft Word, a field code (such as "MERGEFIELD FieldName") follows | |
// after a field start character. We want to skip field codes and output field. | |
// Result only, therefore we use a flag to suspend the output while inside a field code. | |
// Note this is a very simplistic implementation and will not work very well. | |
// If you have nested fields in a document. | |
mIsSkipText = true; | |
return VisitorAction.Continue; | |
} | |
/// <summary> | |
/// Called when a FieldSeparator node is encountered in the document. | |
/// </summary> | |
public override VisitorAction VisitFieldSeparator(FieldSeparator fieldSeparator) | |
{ | |
// Once reached a field separator node, we enable the output because we are | |
// now entering the field result nodes. | |
mIsSkipText = false; | |
return VisitorAction.Continue; | |
} | |
/// <summary> | |
/// Called when a FieldEnd node is encountered in the document. | |
/// </summary> | |
public override VisitorAction VisitFieldEnd(FieldEnd fieldEnd) | |
{ | |
// Make sure we enable the output when reached a field end because some fields | |
// do not have field separator and do not have field result. | |
mIsSkipText = false; | |
return VisitorAction.Continue; | |
} | |
/// <summary> | |
/// Called when visiting of a Paragraph node is ended in the document. | |
/// </summary> | |
public override VisitorAction VisitParagraphEnd(Paragraph paragraph) | |
{ | |
// When outputting to plain text we output Cr+Lf characters. | |
AppendText(ControlChar.CrLf); | |
return VisitorAction.Continue; | |
} | |
public override VisitorAction VisitBodyStart(Body body) | |
{ | |
// We can detect beginning and end of all composite nodes such as Section, Body, | |
// Table, Paragraph etc and provide custom handling for them. | |
mBuilder.Append("*** Body Started ***\r\n"); | |
return VisitorAction.Continue; | |
} | |
public override VisitorAction VisitBodyEnd(Body body) | |
{ | |
mBuilder.Append("*** Body Ended ***\r\n"); | |
return VisitorAction.Continue; | |
} | |
/// <summary> | |
/// Called when a HeaderFooter node is encountered in the document. | |
/// </summary> | |
public override VisitorAction VisitHeaderFooterStart(HeaderFooter headerFooter) | |
{ | |
// Returning this value from a visitor method causes visiting of this | |
// Node to stop and move on to visiting the next sibling node | |
// The net effect in this example is that the text of headers and footers | |
// Is not included in the resulting output | |
return VisitorAction.SkipThisNode; | |
} | |
/// <summary> | |
/// Adds text to the current output. Honors the enabled/disabled output flag. | |
/// </summary> | |
private void AppendText(string text) | |
{ | |
if (!mIsSkipText) | |
mBuilder.Append(text); | |
} | |
private readonly StringBuilder mBuilder; | |
private bool mIsSkipText; | |
} |
Yalnızca Metin Nasıl Çıkarılır
Belgeden metin almanın yolları şunlardır:
- Bir dosyaya veya akışa düz metin olarak kaydetmek için Document.Save‘i SaveFormat.Text ile kullanın
- Node.ToString kullanın ve SaveFormat.Text parametresini iletin. Dahili olarak bu, bir bellek akışına metin olarak kaydetmeyi çağırır ve elde edilen dizeyi döndürür
- Alan kodları dahil tüm Microsoft Word kontrol karakterlerini içeren metni almak için Node.GetText‘i kullanın
- Özelleştirilmiş çıkarma gerçekleştirmek için özel bir DocumentVisitor uygulayın
Node.GetText
ve Node.ToString
‘yi kullanma
Bir Word belgesi, alan, hücre sonu, bölüm sonu vb. gibi özel öğeleri belirten kontrol karakterlerini içerebilir. Olası Word kontrol karakterlerinin tam listesi ControlChar sınıfında tanımlanır. Node.GetText yöntemi, düğümde bulunan tüm kontrol karakter karakterlerini içeren metni döndürür.
ToString‘in çağrılması, belgenin yalnızca kontrol karakterleri olmadan düz metin gösterimini döndürür. Düz metin olarak dışa aktarma hakkında daha fazla bilgi için aşağıdaki “SaveFormat.Text Kullanılıyor” bölümüne bakın.
Aşağıdaki kod örneği, bir düğümde GetText ve ToString yöntemlerini çağırmak arasındaki farkı gösterir:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
builder.InsertField("MERGEFIELD Field"); | |
// When converted to text it will not retrieve fields code or special characters, | |
// but will still contain some natural formatting characters such as paragraph markers etc. | |
// This is the same as "viewing" the document as if it was opened in a text editor. | |
Console.WriteLine("Convert to text result: " + doc.ToString(SaveFormat.Text)); |
SaveFormat.Text
‘i kullanma
Bu örnek belgeyi şu şekilde kaydeder:
- Alan karakterlerini ve alan kodlarını, şekli, dipnotu, son notu ve yorum referanslarını filtreler
- Paragraf sonu ControlChar.Cr karakterlerini ControlChar.CrLf kombinasyonlarıyla değiştirir
- UTF8 kodlamasını kullanır
Aşağıdaki kod örneği, bir belgenin TXT biçiminde nasıl kaydedileceğini gösterir:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
Document doc = new Document(MyDir + "Document.docx"); | |
doc.Save(ArtifactsDir + "BaseConversions.DocxToTxt.txt"); |
Şekillerden Görüntü Çıkarma
Bazı görevleri gerçekleştirmek için belge resimlerini çıkarmanız gerekebilir. Aspose.Words bunu da yapmanıza olanak sağlar.
Aşağıdaki kod örneği, bir belgeden görüntülerin nasıl çıkarılacağını gösterir:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
Document doc = new Document(MyDir + "Images.docx"); | |
NodeCollection shapes = doc.GetChildNodes(NodeType.Shape, true); | |
int imageIndex = 0; | |
foreach (Shape shape in shapes) | |
{ | |
if (shape.HasImage) | |
{ | |
string imageFileName = | |
$"Image.ExportImages.{imageIndex}_{FileFormatUtil.ImageTypeToExtension(shape.ImageData.ImageType)}"; | |
// Note, if you have only an image (not a shape with a text and the image), | |
// you can use shape.GetShapeRenderer().Save(...) method to save the image. | |
shape.ImageData.Save(ArtifactsDir + imageFileName); | |
imageIndex++; | |
} | |
} |