PPTFontsExtractor.cs



using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Data;
using System.Data.SqlClient;
using System.Text;
using System.Xml.Linq;
using System.Windows.Forms;
using Microsoft.Win32;
using PowerPoint = Microsoft.Office.Interop.PowerPoint;
using Office = Microsoft.Office.Core;

namespace FontsExtractor
{
    /// <summary>
    /// This extractor class opens a PowerPoint file and extracts all the fonts used
    /// in it.
    /// These font files will be saved on ".\fonts" directory with respect to the input
    /// PowerPoint file.
    /// An install.bat file will be generated in the same directory for easy installing
    /// of these extracted font files. Just run it on the target PC!
    /// </summary>
    class PPTFontsExtractor
    {
        // The input ppt file's name.
        private string _fileName;
        // The input ppt file's path.
        private string _path;
        // The output path for extracted font files.
        private string _fontOutputPath;

        // The font names used in the input file.
        private List<string> _fontNames = new List<string>();
        // The corresponding font files of the used fonts.
        private List<string> _fontFileNames = new List<string>();

        /// <summary>
        /// Initializes the input ppt file name and path.
        /// Makes a new directory for font files extracted.
        /// </summary>
        /// <param name="fileName">The input ppt file's name.</param>
        PPTFontsExtractor(string fileName)
        {
            _fileName = fileName;
            
            int splitIndex = fileName.LastIndexOf('\\');
            _path = fileName.Substring(0, splitIndex);
            
            _fontOutputPath = _path + @"\fonts";
            Directory.CreateDirectory(_fontOutputPath);
        }

        /// <summary>
        /// Extracts the fonts used in the input ppt file and saves the corresponding
        /// font files to the output directory.
        /// A .bat file for fonts installing will also be generated in the same directory.
        /// </summary>
        public void ExtractFonts()
        {
            Console.WriteLine("parsing fonts...");
            GetAllUsedFontNames();
            GetCorrespondingFontFiles();

            Console.WriteLine("extracting fonts...");
            ExportFontFilesOut();

            Console.WriteLine("generating intalling script...");
            GenerateInstallingScript();
        }

        /// <summary>
        /// Exports all the corresponding font files out from system's fonts directory.
        /// </summary>
        private void ExportFontFilesOut()
        {
            string fontDir = Environment.GetEnvironmentVariable("systemroot") + @"\fonts";
            _fontFileNames.ForEach(s => File.Copy(fontDir + '\\' + s, _fontOutputPath + '\\' + s, true));
        }

        /// <summary>
        /// Generates the installing script for the extracted fonts.
        /// </summary>
        private void GenerateInstallingScript()
        {
            StreamWriter writer = File.CreateText(_fontOutputPath + @"\install.bat");
            _fontFileNames.ForEach(s => writer.WriteLine("copy \"" + s + "\"" + @" %systemroot%\fonts\"));
            writer.Close();
        }

        /// <summary>
        /// Gets all the corresponding font file names through windows registry.
        /// </summary>
        private void GetCorrespondingFontFiles()
        {
            RegistryKey fonts = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\Windows NT\CurrentVersion\Fonts");
            string[] valueNames = fonts.GetValueNames();

            List<KeyValuePair<string, string>> fontMappingTable = valueNames
                .Select(s => new KeyValuePair<string, string>(s, (string)fonts.GetValue(s)))
                .ToList();

            foreach (string fontName in _fontNames)
            {
                _fontFileNames.AddRange(fontMappingTable
                    .FindAll(p => p.Key.Contains(fontName))
                    .Select(p => p.Value)
                    .ToList());
            }
        }

        /// <summary>
        /// Gets all the font names used in the input ppt file.
        /// Each character in the text will be checked for integrity.
        /// </summary>
        private void GetAllUsedFontNames()
        {
            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);

            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);
                        }
                    }
                }
            }

            presentation.Close();
            pptApplication.Quit();
        }

        [STAThread]
        static void Main(string[] args)
        {
            //OpenFileDialog dlg = new OpenFileDialog();
            //if (dlg.ShowDialog() == DialogResult.OK)
            //{
            //    PPTFontsExtractor fontExtractor = new PPTFontsExtractor(dlg.FileName);
            //    fontExtractor.ExtractFonts();
            //}


            DirectoryInfo di = new DirectoryInfo("D://My Documents//EfficientPIM AutoBackup");
                FileInfo[] fi = di.GetFiles();

                foreach (FileInfo fiTmp in fi)
                {

                    String fileName =  fiTmp.Name.ToString();
                    fileName = fileName.Substring(0, fileName.Length - 4);
                    PPTFontsExtractor.Parse("D://My Documents//EfficientPIM AutoBackup//" + fiTmp.Name.ToString(), fileName);
                    //PptReader("F://tttttttt//" + fiTmp.Name.ToString(), fileName);
            
                }
        }



        //public string PptReader(string DocPath,string filename)
        //{
        //    string fullname = DocPath + filename; //绝对路径
        //    PowerPoint.Application papp = new PowerPoint.Application();
        //    PowerPoint.Presentation ppr = papp.Presentations.Open(fullname, Microsoft.Office.Core.MsoTriState.msoCTrue,
        //    Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoFalse);
        //    string doc = "";
        //    foreach (PowerPoint.Slide slide in ppr.Slides)
        //    {
        //        foreach (PowerPoint.Shape shape in slide.Shapes)
        //        {
        //            if (shape.HasTextFrame == Microsoft.Office.Core.MsoTriState.msoTrue)
        //            {
        //                if (shape.TextFrame.HasText == Microsoft.Office.Core.MsoTriState.msoTrue)
        //                {
        //                    doc += shape.TextFrame.TextRange.Text.ToString();
        //                    doc += "\n";
        //                }
        //            }

        //        }
        //    }

        //    ppr.Close();
        //    System.Runtime.InteropServices.Marshal.ReleaseComObject(ppr);
        //    ppr = null;
        //    papp.Quit();
        //    System.Runtime.InteropServices.Marshal.ReleaseComObject(papp);
        //    papp = null;
        //    Console.WriteLine(doc);
        //    return doc;
        //}

        public static  void Parse(String fileName,string pptName)
        {
            SqlConnection con = new SqlConnection(@"Data Source=.;Initial Catalog=WordProject;Integrated Security=True");
            con.Open();
            try
            {
                PowerPoint.Application pa = new PowerPoint.ApplicationClass();
                PowerPoint.Presentation pp = pa.Presentations.Open(fileName,
                      Microsoft.Office.Core.MsoTriState.msoTrue,
                      Microsoft.Office.Core.MsoTriState.msoFalse,
                      Microsoft.Office.Core.MsoTriState.msoFalse);
                Console.WriteLine("Open Success");
                PowerPoint.TextFrame frame;

                String text="";

                foreach (PowerPoint.Slide slide in pp.Slides)
                {
                    foreach (PowerPoint.Shape shape in slide.Shapes)
                    {
                        if (shape.HasTextFrame == Microsoft.Office.Core.MsoTriState.msoTrue)
                        {
                            frame = shape.TextFrame;
                            if (frame.HasText == Microsoft.Office.Core.MsoTriState.msoTrue)
                            {
                                text += frame.TextRange.Text.ToString();
                                text += "\n";
                            }
                        }

                    }
    
                }
                string sqlins = @"Insert into Word_Content(Title,Content,Remark) values ('" + pptName + "','" + text + "','jjj')";
                SqlCommand cmd = new SqlCommand(sqlins, con);
                cmd.ExecuteNonQuery();
                con.Close();

            }

            catch (Exception e)
            {
                Console.WriteLine(e.Message);

            }
           
        }  
        


    }

}
原文地址:https://www.cnblogs.com/shihao/p/2498641.html