/// <summary>
        /// get emf stream
        /// </summary>
        /// <param name="spoolFileStream"></param>
        /// <returns></returns>
        public List <Stream> GetEmfStreams(Stream spoolFileStream)
        {
            List <Stream> emfStreams        = new List <Stream>();
            BinaryReader  spoolBinaryReader = new BinaryReader(spoolFileStream, System.Text.Encoding.Unicode);
            Int32         iFoo = spoolBinaryReader.ReadInt32();

            while (iFoo != (int)SpoolerRecordTypes.SRT_DEVMODE && iFoo != (int)SpoolerRecordTypes.SRT_PAGE && iFoo != (int)SpoolerRecordTypes.SRT_EXT_PAGE)
            {
                iFoo = spoolBinaryReader.ReadInt32();
            }
            spoolBinaryReader.BaseStream.Seek(-4, SeekOrigin.Current);

            //Read the spooler records and count the total pages
            EMFMetaRecordHeader recNext = NextHeader(spoolBinaryReader);

            while (recNext.iType != SpoolerRecordTypes.SRT_EOF)
            {
                if (recNext.iType == SpoolerRecordTypes.SRT_PAGE)
                {
                    _Pages += 1;
                }

                var emfStream = SkipAHeader(recNext, spoolBinaryReader);
                if (emfStream != null)
                {
                    emfStreams.Add(emfStream);
                }

                recNext = NextHeader(spoolBinaryReader);
            }
            spoolBinaryReader.Close();
            spoolFileStream.Close();

            return(emfStreams);
        }
        public int GetTruePageCount(string spoolFilename)
        {
            string ShadowFilename;

            ShadowFilename = spoolFilename;
            // Open a binary reader for the spool file;
            FileStream   SpoolFileStream   = new System.IO.FileStream(spoolFilename, FileMode.Open, FileAccess.Read);
            BinaryReader SpoolBinaryReader = new BinaryReader(SpoolFileStream, System.Text.Encoding.Unicode);
            Int32        iFoo;

            iFoo = SpoolBinaryReader.ReadInt32();
            while (iFoo != (int)SpoolerRecordTypes.SRT_DEVMODE && iFoo != (int)SpoolerRecordTypes.SRT_PAGE && iFoo != (int)SpoolerRecordTypes.SRT_EXT_PAGE)
            {
                iFoo = SpoolBinaryReader.ReadInt32();
            }
            SpoolBinaryReader.BaseStream.Seek(-4, SeekOrigin.Current);
            //Read the spooler records and count the total pages
            EMFMetaRecordHeader recNext = NextHeader(SpoolBinaryReader);

            while (recNext.iType != SpoolerRecordTypes.SRT_EOF)
            {
                if (recNext.iType == SpoolerRecordTypes.SRT_PAGE)
                {
                    _Pages += 1;
                }

                SkipAHeader(recNext, SpoolBinaryReader);
                recNext = NextHeader(SpoolBinaryReader);
            }
            SpoolBinaryReader.Close();
            SpoolFileStream.Close();
            return(_Pages * _Copies);
        }
        public Stream SkipAHeader(EMFMetaRecordHeader header, BinaryReader spoolBinaryReader)
        {
            Stream emfStream = null;

            if (header.nSize <= 0)
            {
                header.nSize = 8;
            }
            if (header.iType == SpoolerRecordTypes.SRT_JOB_INFO)
            {
                byte[] JobInfo;
                JobInfo = spoolBinaryReader.ReadBytes(header.nSize);
                spoolBinaryReader.BaseStream.Seek(header.Seek + header.nSize, SeekOrigin.Begin);
            }
            else if (header.iType == SpoolerRecordTypes.SRT_EOF)
            {
                // End of file reached..do nothing
            }
            else if (header.iType == SpoolerRecordTypes.SRT_DEVMODE)
            {
                // Spool job DEVMODE
                DevMode _dmThis = new DevMode(spoolBinaryReader);
                _Copies = _dmThis.Copies;
                spoolBinaryReader.BaseStream.Seek(header.Seek + 8 + header.nSize, SeekOrigin.Begin);
            }
            else if (header.iType == SpoolerRecordTypes.SRT_PAGE || header.iType == SpoolerRecordTypes.SRT_EXT_PAGE)
            {
                emfStream = GetEMFStream(spoolBinaryReader);
            }
            else if (header.iType == SpoolerRecordTypes.SRT_EOPAGE1 || header.iType == SpoolerRecordTypes.SRT_EOPAGE2)
            {
                // int plus long
                if (header.nSize == 0x8)
                {
                    spoolBinaryReader.BaseStream.Seek(header.Seek + header.nSize + 8, SeekOrigin.Begin);
                }
            }
            else if (header.iType == SpoolerRecordTypes.SRT_UNKNOWN)
            {
                spoolBinaryReader.BaseStream.Seek(header.Seek + 4, SeekOrigin.Begin);
            }
            else
            {
                spoolBinaryReader.BaseStream.Seek(header.Seek + header.nSize, SeekOrigin.Begin);
            }

            return(emfStream);
        }
        public EMFMetaRecordHeader NextHeader(BinaryReader spoolBinaryReader)
        {
            EMFMetaRecordHeader recRet = new EMFMetaRecordHeader();

            // get the record type
            recRet.Seek = (int)spoolBinaryReader.BaseStream.Position;
            try
            {
                recRet.iType = (SpoolerRecordTypes)spoolBinaryReader.ReadInt32();
            }
            catch (EndOfStreamException e)
            {
                recRet.iType = SpoolerRecordTypes.SRT_EOF;
                return(new EMFMetaRecordHeader());
            }
            // Get the record size
            recRet.nSize = spoolBinaryReader.ReadInt32();
            return(recRet);
        }