很多人工作學(xué)習(xí)中經(jīng)常需要做演示報(bào)告,如果自己沒有筆記本,那么準(zhǔn)備好的PPT文件就得手動(dòng)轉(zhuǎn)移了。這個(gè)過程中如果不能將文件中使用的特殊字體一起帶走,到演示機(jī)器上的效果可能會(huì)讓你的精心準(zhǔn)備大打折扣。正是因?yàn)樽约号龅竭^這個(gè)問題,所以希望做個(gè)簡(jiǎn)單的小工具將 PPT文件中使用到的字體都提取出來,方便攜帶到其他機(jī)器上安裝。
簡(jiǎn)單介紹一下這個(gè)小工具制作的過程~
工作原理設(shè)想
很簡(jiǎn)單,分三步:
1. 解析PPT文件,收集其中的所有文字使用到的字體名稱;
2. 通過這些字體名稱,去系統(tǒng)的字體文件存放目錄將相應(yīng)的字體文件導(dǎo)出;
3. 生成一個(gè)字體安裝腳本,以便在目標(biāo)機(jī)器安裝這些字體。
具體實(shí)現(xiàn)
有了這個(gè)簡(jiǎn)單設(shè)計(jì),就用c#去著手實(shí)現(xiàn)了,可即使設(shè)計(jì)這么簡(jiǎn)單了,還是碰到一些問題:)
1. PPT文件解析
由于.net對(duì)office應(yīng)用已經(jīng)做了良好封裝,這步做起來沒有什么困難,基本只要查一查需要的查詢接口就可以。只有一點(diǎn)需要注意一下,因?yàn)镻PT文字格式的任意性,每一個(gè)文字都可以設(shè)置字體,所以我們需要讓字體提取的粒度保持在單個(gè)的字符上,這樣才不會(huì)有所遺漏。
首先在后臺(tái)模式打開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文件中各種形式文本使用的每一個(gè)字體名(smartart形式的除外,因?yàn)槲④洓]有開放相應(yīng)的模型數(shù)據(jù))。
別忘了關(guān)閉文件和PPT程序:
presentation.Close();
pptApplication.Quit();