很多人工作學習中經常需要做演示報告,如果自己沒有筆記本,那么準備好的PPT文件就得手動轉移了。這個過程中如果不能將文件中使用的特殊字體一起帶走,到演示機器上的效果可能會讓你的精心準備大打折扣。正是因為自己碰到過這個問題,所以希望做個簡單的小工具將 PPT文件中使用到的字體都提取出來,方便攜帶到其他機器上安裝。
簡單介紹一下這個小工具制作的過程~
工作原理設想
很簡單,分三步:
1. 解析PPT文件,收集其中的所有文字使用到的字體名稱;
2. 通過這些字體名稱,去系統的字體文件存放目錄將相應的字體文件導出;
3. 生成一個字體安裝腳本,以便在目標機器安裝這些字體。
具體實現
有了這個簡單設計,就用c#去著手實現了,可即使設計這么簡單了,還是碰到一些問題:)
1. PPT文件解析
由于.net對office應用已經做了良好封裝,這步做起來沒有什么困難,基本只要查一查需要的查詢接口就可以。只有一點需要注意一下,因為PPT文字格式的任意性,每一個文字都可以設置字體,所以我們需要讓字體提取的粒度保持在單個的字符上,這樣才不會有所遺漏。
首先在后臺模式打開PPT文件:
PowerPoint.Application pptApplication = new PowerPoint.ApplicationClass();
PowerPoint.Presentation presentation = pptApplication.Presentations.Open2007(
_fileName,
Office.MsoTriState.msoTrue,
Office.MsoTriState.msoTrue,
Office.MsoTriState.msoFalse,
Office.MsoTriState.msoFalse);
然后遍歷文字取得字體名,層次順序是 slide > shape > text > character:
foreach (PowerPoint.Slide slide in presentation.Slides)
{
foreach (PowerPoint.Shape shape in slide.Shapes)
{
if (shape.HasTextFrame == Office.MsoTriState.msoTrue &&
shape.TextFrame.HasText == Office.MsoTriState.msoTrue)
{
PowerPoint.TextRange textRange = shape.TextFrame.TextRange;
for (int i = 0; i < textRange.Length; ++i)
{
PowerPoint.Font font = textRange.Characters(i, 1).Font;
if (!_fontNames.Contains(font.Name))
_fontNames.Add(font.Name);
}
}
}
}
這樣就可以獲得各種PPT文件中各種形式文本使用的每一個字體名(smartart形式的除外,因為微軟沒有開放相應的模型數據)。
別忘了關閉文件和PPT程序:
presentation.Close();
pptApplication.Quit();