ドキュメントの操作

ドキュメントの操作

文書の操作

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ファイルまたはストリームの形式を読み込む前に検出します。

参照

 日本語