はじめに
皆さんは、こういう話を聞いたことありますか?
最近のOffice(Word,Excel,Power Pointなど)のファイルの正体はzipファイル
Officeのファイルについて、拡張子をzipにして解凍すると、使用画像を取り出せる
これは事実であり、詳細は下記記事に記載されています。
パワーポイント、ワードから画像を取り出す。
でも、いちいちファイルの拡張子を変えて、解凍して、画像を取り出す…というのは面倒!!
そんなわけで、この処理を自動でおこなうC#コードを作りました。
解説
ソースコートは下記リンクに貼ってあります。
Program.cs
仕様
ドラッグアンドドロップをしたOfficeファイルについて、使用画像を取り出す
複数ファイルのドラッグアンドドロップにも対応
取り出した画像は、ドラッグアンドドロップしたファイルと同じ階層に置く
対応拡張子は下記の通り
Word:".docx",".docm",".dotx",".dotm"
Power Point:".pptx",".pptm",".ppsx",".ppsm",".potx",".potm"
Excel:".xlsx",".xlsm",".xltx",".xltm"
Open Document:".ods",".odt",".odp"
処理の流れ
ファイルの存在チェック
ファイルの拡張子チェック
ファイルを解凍
解凍したフォルダから画像ファイルを取り出す
解凍したフォルダ削除
ファイルの存在チェック
今回のプログラムでは、コマンドライン引数で処理対象ファイルのパスを受け取ります。(fname)
それが実在しないファイルだと困るので、ファイルの存在チェックをします。
Program.cs
// ファイルの存在チェック
if (!File.Exists(fname))
{
Console.WriteLine("ファイルが存在しません。");
continue;
}
ファイルの拡張子チェック
ファイルが存在しても、処理に非対応のファイルでは困ります。
なので、拡張子でファイルが処理に対応しているか確認します。
Program.cs
string type = "", extension = "";
extension = Path.GetExtension(fname);
switch (extension)
{
case ".docx":
/** 中略 **/
case ".dotm":
type = "word";
break;
case ".pptx":
/** 中略 **/
case ".potm":
type = "ppt";
break;
case ".xlsx":
/** 中略 **/
case ".xltm":
type = "xl";
break;
case ".ods":
/** 中略 **/
case ".odp":
type = "";
break;
default:
Console.WriteLine("対応のファイルではありません。");
continue;
}
ファイルを解凍
fnameはzipファイルでなく、コマンドライン引数で受け取ったOfficeのファイルパスです。
解凍元ファイルの拡張子は、zipにせずOfficeのファイルのままでも問題ありません。
Program.cs
// ファイルを展開
/** 中略 **/
ZipFile.ExtractToDirectory(fname, unzipDir);
解凍したフォルダから画像ファイルを取り出す
.netには、フォルダ内の全ファイル・フォルダをコピーする関数がありません。
なので自作する必要があります。
DirectoryUtil.Copyがこれに当たり、このサイトのCopyAndReplace関数と処理は同じです。
Program.cs
// 解凍したフォルダから画像ファイルを取り出す
string mediaDir = unzipDir + "/" + type + "/media";
/** 中略 **/
DirectoryUtil.Copy(mediaDir, directoryName + "/" + fileName + extension + "_media");
解凍したフォルダ削除
最後に、解凍したフォルダを削除します。
Program.cs
// zipファイルと解凍したフォルダ削除
Directory.Delete(unzipDir, true);
蛇足
本当はPDFMergerと同様に実行ファイルを公開したいのですが、Visual Studio Codeで実行ファイルを作成するとどうしても個人情報入りのファイルがないと実行できない状況となり、公開ができません。
どうにかできないかな…
↧