ドキュメントの操作
文書の操作
Aspose.Words FOSS for .NET は、すべての Word ファイルを Document クラスをルートとしたインメモリオブジェクトモデルとして表現し、DocumentBuilder はコンテンツ作成のための高レベルなカーソルベースの API を提供します。このガイドでは、ドキュメントの作成と読み込み、DocumentBuilder を使用した執筆、セクション/本文の構造、ノードツリーの走査、ドキュメントの結合、および保護について説明します。
ドキュメントの作成と読み込み
new Document() を使用して空白のドキュメントを作成するか、パスまたは Stream を Document(fileName) または Document(stream) コンストラクタに渡すことで既存のファイルを開きます。LoadOptions 引数を受け取るオーバーロードを使用すれば、暗号化ファイルのパスワードを指定するなど、ロード動作を制御できます。
未知または信頼できないソースからファイルを読み込む前に、FileFormatUtil.DetectFileFormat(fileName)(または Stream オーバーロード)は、検出された LoadFormat を記述した FileFormatInfo を返し、ファイルが IsEncrypted、HasDigitalSignature、または HasMacros かどうかを示します。
DocumentBuilder を使用した執筆
DocumentBuilder は Document をラップし、コンテンツを挿入しながらドキュメント内を移動させるカーソルを公開します。Write(text) と Writeln(text) はカーソル位置にテキストを挿入し、InsertParagraph() は新しい段落を開始します。ビルダー上の書式設定プロパティ — Font、ParagraphFormat、ListFormat、PageSetup — は次に書き込まれるものに適用されます。
カーソルは MoveToDocumentStart()、MoveToDocumentEnd()、MoveToSection(sectionIndex)、MoveToBookmark(bookmarkName)、または MoveToParagraph(paragraphIndex, characterIndex) で移動します。ビルダーの CurrentNode、CurrentParagraph、および CurrentSection プロパティは、ツリー内の現在位置を報告します。
ドキュメント構造: セクションと本文
Document は SectionCollection(Document.Sections、さらに FirstSection / LastSection)を保持します;各 Section は 1 つの Body と、オプションのヘッダー/フッター コレクション、そして独自の PageSetup を持ちます。Section.AppendContent(sourceSection) と PrependContent(sourceSection) はセクション間でコンテンツをコピーし、ClearContent() はドキュメントから削除せずにセクションをリセットします。
Body 内では、コンテンツは Body.Paragraphs(ParagraphCollection)と Body.Tables を通じて公開されます。Range は Document、Section、Paragraph および他のノードから利用可能で、ツリーの連続した領域を表します;Range.Text はそのプレーンテキストを読み取り、Range.Replace(pattern, replacement) はその領域だけで検索置換を実行します。
DocumentVisitor を使用したノードツリーの走査
ドキュメントのすべての部分 — セクション、段落、ラン、テーブル、フィールド、シェイプ、コメント、脚注 — は、Document をルートとする複合ツリー内の Node です。手動で再帰せずに特定のタイプのすべてのノードを処理するには、抽象 DocumentVisitor をサブクラス化し、必要な Visit*Start / Visit*End コールバック(例: VisitParagraphStart(paragraph) や VisitRun(run))をオーバーライドしてから、document.Accept(visitor) を呼び出します。各コールバックは、トラバーサルの進行方法を制御するために VisitorAction(Continue、SkipThisNode、または Stop)を返すことができます。
コンテンツのクローン、インポート、および追加
Document.Clone() は文書全体のディープコピーを生成します。2 つの異なる Document インスタンス間でコンテンツを移動するには、宛先ドキュメントで ImportNode(srcNode, isImportChildren) を呼び出して外部ツリーからノードを取り込み、または Document.AppendDocument(srcDoc, importFormatMode) を呼び出して選択した ImportFormatMode(KeepSourceFormatting、UseDestinationStyles、または KeepDifferentStyles)を使用してある文書のセクションを別の文書に追加します。DocumentBuilder.InsertDocument(srcDoc, importFormatMode) は、宛先の末尾ではなくビルダーのカーソル位置にソース文書のコンテンツを挿入します。
文書の保護
Document.Protect(type, password) は、ProtectionType の値に従って編集を制限します — ReadOnly、AllowOnlyComments、AllowOnlyRevisions、AllowOnlyFormFields、または NoProtection で保護を解除できます。Unprotect()(パスワードの有無にかかわらず)はそれを元に戻します。これは Word が適用する編集制限であり、OoxmlSaveOptions.Password がファイル保存時に適用する OOXML パスワード暗号化とは別物です。
ヒントとベストプラクティス
- 新しいコンテンツを構築する場合は
DocumentBuilderを優先してください;既存のツリーを細かく制御する必要があるときは、直接ノード操作(AppendChild、InsertAfter、Clone)に切り替えます。 - 信頼できない、またはユーザー提供のソースからファイルを読み込む前に
FileFormatUtil.DetectFileFormatを呼び出し、LoadFormatをチェックして、サポートされていないまたは暗号化された入力を早期に拒否できるようにします。 AppendDocumentまたはInsertDocumentを使用して文書を結合する場合、ImportFormatModeを意図的に選択してください —KeepSourceFormattingは元の外観を保持し、UseDestinationStylesは対象文書のスタイルセットに合わせます。- ノードタイプの各インスタンスを一貫して処理する必要がある場合は、手動の再帰的ツリー走査の代わりに
DocumentVisitorサブクラスを使用してください。 Document.Protectは編集制限であり、暗号化ではありません — 保存されたファイル自体が開く際にパスワードを必要とする場合は、OoxmlSaveOptions.Passwordと組み合わせてください。
よくある問題
| 問題 | 原因 | 修正 |
|---|---|---|
Document(fileName) は、Word で正常に開くファイルに対して例外をスローします | ファイルの形式は、このエディションが読み込みに対応しているものではありません | まず FileFormatUtil.DetectFileFormat を呼び出し、読み込む前に返された LoadFormat を確認してください |
| 追加されたコンテンツが誤ったフォントやスタイルを適用します | ImportFormatMode:ソースと宛先のスタイルセットが一致しません | デフォルトに依存せず、KeepSourceFormatting または UseDestinationStyles を明示的に渡してください |
DocumentVisitor の走査が早期に終了したり、コンテンツをスキップしたりします | Visit*Start / Visit*End のオーバーライドが、意図せず SkipThisNode または Stop を返します | スキップまたは停止させる意図が明確でない限り、すべてのオーバーライドから VisitorAction.Continue を返してください |
Unprotect() は効果がありません | ドキュメントはパスワードで保護されていないか、誤ったパスワードが提供されました | Protect がパスワードなしで呼び出された場合は引数なしで Unprotect() を呼び出し、そうでなければ対応するパスワードを渡してください |
FAQ
Document.Clone() と ImportNode の違いは何ですか?
Clone() は文書全体を新しい Document インスタンスにコピーします。ImportNode(srcNode, isImportChildren) は、1つの文書ツリーから単一のノード(必要に応じてその子ノードも)を別の文書に持ち込みます。これは、文書全体ではなく特定のコンテンツを組み合わせる際に使用します。
どのファイル形式を Document(fileName) が読み込めますか?
Document(fileName) は DOCX、DOCM、DOTX、DOTM、Flat OPC(マクロ対応版やテンプレート版を含む)、Markdown、プレーンテキストを読み込みます。このエディションのローダーからは、従来のワードプロセッシング形式やウェブ形式は除外されています。
現在、DocumentBuilder がどこに配置されているかを確認するにはどうすればよいですか?
ビルダーインスタンス上で CurrentNode、CurrentParagraph、または CurrentSection を参照してください。
Document.Protect は保存されたファイルを暗号化しますか?
いいえ — ファイルが開かれたときに Word が適用する編集制限です。ファイルを開く際にパスワードが必要になるようにするには、保存時に OoxmlSaveOptions.Password を設定します。
ドキュメント本文の段落だけを取得するにはどうすればよいですか?
Body.Paragraphs コレクションを使用するか、他のノードタイプの場合は Body.GetChildNodes(nodeType, isDeep) を使用してください。
API Reference 概要
| クラス/メソッド | 説明 |
|---|---|
Document | ドキュメントオブジェクトモデルのルート;コンストラクタはファイルまたはストリームからロードするか、空のドキュメントを作成します。 |
Document.Save | 選択した形式で、ドキュメントをファイル、ストリーム、または HTTP 応答に書き込みます。 |
Document.Clone() | ドキュメント全体のディープコピーを生成します。 |
Document.Protect(type, password) / Unprotect() | 編集制限を適用または解除します. |
Document.AppendDocument(srcDoc, importFormatMode) | 別の文書のセクションをこの文書に追加します。 |
DocumentBuilder | テキストを書き込み、文書にコンテンツを挿入するためのカーソルベースの API。 |
DocumentBuilder.InsertDocument(srcDoc, importFormatMode) | カーソル位置にソース文書のコンテンツを挿入します。 |
Section / SectionCollection | 文書の単一セクションと、すべてのセクションの集合。 |
Body | セクションのメインテキスト(段落と表)を格納するコンテナ。 |
Range | ドキュメントツリーの連続領域で、Text と Replace をサポートします。 |
DocumentVisitor | ドキュメントツリー内のすべてのノードを走査するための抽象基底クラスです。 |
ProtectionType | ドキュメントレベルの編集制限を列挙した Enum です。 |
FileFormatUtil.DetectFileFormat | ファイルまたはストリームの形式を読み込む前に検出します。 |