このトピックでは、Open XML SDK for Office のクラスを使用して、プログラムによってワープロ ドキュメントから非表示のテキストを削除する方法について説明します。
WordProcessingML ドキュメントの構造
WordProcessingML
ドキュメントの基本的なドキュメント構造は、document
要素とbody
要素で構成され、その後に段落を表す p
などの 1 つ以上のブロック レベル要素が続きます。 段落には、1 つ以上の r
要素が含まれています。
r
は、書式設定などのプロパティの共通セットを持つテキストの領域である run を表します。 実行には、1 つ以上の t
要素が含まれています。
t
要素には、テキストの範囲が含まれています。 次のコード例は、"テキストの例" というテキストを含むドキュメントの WordprocessingML
マークアップを示しています。
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:body>
<w:p>
<w:r>
<w:t>Example text.</w:t>
</w:r>
</w:p>
</w:body>
</w:document>
Open XML SDK を使用すると、 WordprocessingML
要素に対応する厳密に型指定されたクラスを使用して、ドキュメント構造とコンテンツを作成できます。 これらのクラスは、 DocumentFormat.OpenXml.Wordprocessing 名前空間にあります。 次の表に、 document
、 body
、 p
、 r
、 t
の各要素に対応するクラスのクラス名を示します。
WordprocessingML 要素 | Open XML SDK クラス | 説明 |
---|---|---|
<document/> |
Document | メイン ドキュメント パーツのルート要素。 |
<body/> |
Body | ISO/IEC 29500 仕様で指定されている、段落、表、注釈などのブロック レベル構造のコンテナー |
<p/> |
Paragraph | 段落 |
<r/> |
Run | セクション |
<t/> |
Text | さまざまなテキスト |
WordprocessingML ドキュメントのパーツと要素の全体的な構造の詳細については、「 WordprocessingML ドキュメントの構造」を参照してください。
Vanish 要素の構造
vanish
要素は、Word ファイル内のテキストを非表示にする上で重要な役割を果たします。
Hidden
書式設定プロパティはトグル プロパティです。これは、スタイル定義内で使用することと、直接書式設定として使用する場合の動作が異なることを意味します。 スタイル定義の一部として使用する場合、このプロパティを設定すると現在の状態が切り替わります。
false
(または同等) に設定すると、現在の設定は変更されません。 ただし、直接書式設定として使用する場合は、 true
または false
に設定すると、結果のプロパティの絶対状態が設定されます。
ISO/IEC 29500 仕様の次の情報では、vanish
要素について説明します。
vanish (隠し文字)
この要素は、表示時にこのセクションのコンテンツをドキュメント内で非表示にするかどうかを指定します。 [メモ: この設定はテキストの通常の表示に影響を与えますが、アプリケーションの設定によって隠し文字を強制的に表示できます。 メモの終了]
この書式設定プロパティは、トグル プロパティ (§17.7.3) です。
この要素が存在しない場合、既定値は スタイル階層の前のレベルで書式設定を適用したままにします。 この要素がスタイル階層に適用されない場合、このテキストはドキュメントに表示されるときに非表示になりません。
[例: あるテキスト セクションのコンテンツに対して、隠し文字プロパティをオンにする必要があるとします。 次の WordprocessingML を使用して、この制約を指定します。
<w:rPr>
<w:vanish />
</w:rPr>
This run declares that the vanish property is set for the contents of this run, so the contents of this run will be hidden when the document contents are displayed. 例終わり]
© ISO/IEC 29500: 2016
次の XML スキーマ セグメントは、この要素の内容を定義しています。
<complexType name="CT_OnOff">
<attribute name="val" type="ST_OnOff"/>
</complexType>
上記のコードの val
プロパティは、オンまたはオフにできるバイナリ値です。
on
、1
、または true
の値を指定すると、プロパティがオンになります。 値に off
、 0
、またはプロパティがオフになっている false
が指定されている場合。
コードの動作のしくみ
WDDeleteHiddenText
メソッドは、指定したドキュメントで動作し、非表示になっているすべてのrun
要素を削除し、余分なvanish
要素を削除します。 コードはまず、 Open メソッドを使用してドキュメントを開き、読み取り/書き込みアクセス (最後の true パラメーター) のためにドキュメントを開く必要があることを示します。 開いているドキュメントでは、MainDocumentPart プロパティを使用してメイン ドキュメントに移動し、参照を変数に格納します。
using (WordprocessingDocument doc = WordprocessingDocument.Open(docName, true))
{
消えた要素のリストを取得する
コードはまず、 doc.MainDocumentPart
と doc.MainDocumentPart.Document.Body
が null ではないことを確認し、存在しない場合は例外をスローします。 次に、Descendants()を使用してVanish型を渡して、Vanish
要素のIEnumerable
を取得し、リストにキャストします。
if (doc.MainDocumentPart is null || doc.MainDocumentPart.Document.Body is null)
{
throw new ArgumentNullException("MainDocumentPart and/or Body is null.");
}
// Get a list of all the Vanish elements
List<Vanish> vanishes = doc.MainDocumentPart.Document.Body.Descendants<Vanish>().ToList();
非表示のテキストと余分な消失要素を含む実行を削除する
非表示のテキストを削除するには、次に、Vanish
要素のList
をループします。
Vanish
要素はRunPropertiesの子ですが、RunProperties
は、Runまたは xref:DocumentFormat.OpenXml.Wordprocessing.ParagraphProperties> の子であるため、各Vanish
の親と祖父母を取得し、その型をチェックします。 次に、祖父母が Run
である場合は、その実行を削除し、そうでない場合は親から Vanish
子要素を削除します。
// Loop over the list of Vanish elements
foreach (Vanish vanish in vanishes)
{
var parent = vanish?.Parent;
var grandparent = parent?.Parent;
// If the grandparent is a Run remove it
if (grandparent is Run)
{
grandparent.Remove();
}
// If it's not a run remove the Vanish
else if (parent is not null)
{
parent.RemoveAllChildren<Vanish>();
}
}
サンプル コード
注:
この例では、開いているファイルに非表示のテキストが含まれていることを前提としています。 ファイル テキストの一部を非表示にするには、そのテキストを選択し、CTRL + D をクリックして、[ フォント] ダイアログ ボックスを表示します。 [ 非表示] ボックスを選択し、[ OK] をクリックします。
以下は、C# および Visual Basic の完全なサンプル コードです。
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System;
using System.Collections.Generic;
using System.Linq;
static void WDDeleteHiddenText(string docName)
{
// Given a document name, delete all the hidden text.
using (WordprocessingDocument doc = WordprocessingDocument.Open(docName, true))
{
if (doc.MainDocumentPart is null || doc.MainDocumentPart.Document.Body is null)
{
throw new ArgumentNullException("MainDocumentPart and/or Body is null.");
}
// Get a list of all the Vanish elements
List<Vanish> vanishes = doc.MainDocumentPart.Document.Body.Descendants<Vanish>().ToList();
// Loop over the list of Vanish elements
foreach (Vanish vanish in vanishes)
{
var parent = vanish?.Parent;
var grandparent = parent?.Parent;
// If the grandparent is a Run remove it
if (grandparent is Run)
{
grandparent.Remove();
}
// If it's not a run remove the Vanish
else if (parent is not null)
{
parent.RemoveAllChildren<Vanish>();
}
}
}
}