docx Word 文書から画像を取得する

シナリオ

この記事では、Microsoft Docx 形式のドキュメントからすべての画像を取得するための ASP.NET Web アプリケーションを作成する方法を説明します。

ASP.NET Web アプリケーションの準備

Visual Studio を使用して、Razor Pages で単純な ASP.NET Core Web アプリケーションを作成します。 NuGet パッケージ マネージャーを使用して、プロジェクトの 2 つのパッケージを参照します。解凍用の Aspose.Zip とイメージ検証用の Aspose.Imaging です。
ソリューション エクスプローラー内でページ「Index.cshtml」を見つけます。ここで、<form> タグ内の enctype="multipart/form-data" 属性を使用して、そのページにフォームを追加します。 Word文書をWebサーバーに転送する必要がありました。次に、アップロードされた docx ファイル用にタイプ「file」の入力フィールドを追加します。 フォームの完全な HTML マークアップは次のとおりです。

1<form method="post" enctype="multipart/form-data">
2    <span>Microsoft *.docx document: </span>
3    <input type="file" name="uploadedFile" required="required" accept=".docx" />   
4    <br />
5    <input type="submit" value="Upload" />
6</form>

ユーザーの便宜のために Accept 属性が追加されました。

Docx の構造

Docx documet は zip アーカイブそのものです。画像が埋め込まれている場合は、解凍後に「word/media」フォルダー内にあります。したがって、ユーザーは docx ファイルを提供し、フォームを送信します。サーバー側では、「Index.cshtml.cs」ソースに適切な OnPost メソッドを作成する必要があります。このメソッド内では、 適切なコンストラクター を使用して zip アーカイブ を抽出します。 メソッドの草案は次のとおりです。

 1    public void OnPost(IFormFile uploadedFile) {
 2        using (Archive archive = new Archive(uploadedFile.OpenReadStream())) {
 3            using (Archive archive = new Archive(uploadedFile.OpenReadStream()))
 4            {
 5                foreach (var entry in archive.Entries.Where(e => e.Name.StartsWith(@"word/media", StringComparison.InvariantCultureIgnoreCase)))
 6                {
 7                ...
 8                }
 9            }	
10        }
11    }

ページモデルと画像のレンダリング

抽出後、抽出されたエントリが実際に画像であることを確認する必要があります。この目的のために、 Image.CanLoad メソッドを使用できます。有効な画像が承認された場合は、その画像をレンダリングするためにページ モデル内に画像のバイトを格納する必要があります。プロパティ public List<byte[]> ImageBytes { get; private set; }IndexModel に変換します。 このリストに抽出された画像バイトを入力します。それらを Web ページに表示するには、画像バイトを Base64 文字列に変換する data URI を使用します。
これは、Index.cshtml にある Razor コードのレンダリングです。

1    @{
2    if (Model.ImageBytes != null && Model.ImageBytes.Count > 0) {
3            <h4>Images within document:</h4>
4            foreach (byte[] image in Model.ImageBytes) {
5                <img src="data:image;base64,@Convert.ToBase64String(image)"/>
6            }
7        }
8    }

応答を終了します

それで、すべてをまとめてください。アーカイブの各エントリは解凍され、これらのバイトからイメージが構成されます。
このサンプルではユーザー ファイルは検証されません。実際のアプリケーションでは、アップロードされたアーカイブとそのコンテンツを検証する必要があります。
以下は最後の OnPost メソッドです。

 1public void OnPost(IFormFile uploadedFile)
 2{
 3    ImageBytes = new List<byte[]>();
 4
 5    using (Archive archive = new Archive(uploadedFile.OpenReadStream()))
 6    {
 7        foreach (var entry in archive.Entries.Where(e => e.Name.StartsWith(@"word/media", StringComparison.InvariantCultureIgnoreCase)))
 8        {
 9            using (MemoryStream extracted = new MemoryStream())
10            {
11                entry.Open().CopyTo(extracted);
12                extracted.Seek(0, SeekOrigin.Begin);
13
14                if (Aspose.Imaging.Image.CanLoad(extracted))
15                    ImageBytes.Add(extracted.ToArray());
16             }
17         }
18     }
19}
Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.