/// <summary>
        /// Display media constructor
        /// </summary>
        /// <param name="MediaFile">Embedded media file</param>
        /// <param name="MimeType">Mime type</param>
        /// <remarks>
        /// <para>
        /// If mime type is null the program will try to convert file extension
        /// to mime type. If conversion is not available application exception will be raised.
        /// </para>
        /// </remarks>
        public PdfDisplayMedia
        (
            PdfEmbeddedFile MediaFile,
            string MimeType = null
        ) : base(MediaFile.Document)
        {
            // save media file
            this.MediaFile = MediaFile;

            // save mimetype
            if (MimeType == null)
            {
                MimeType = MediaFile.MimeType;
            }
            if (string.IsNullOrWhiteSpace(MimeType))
            {
                throw new ApplicationException("MIME type is not defined");
            }

            // rendition dictionary page 759 Section 9.1.2 Table 9.1
            Rendition = new PdfDictionary(this);
            Dictionary.AddDictionary("/R", Rendition);

            // media clip
            MediaClip = new PdfDictionary(this);
            Rendition.AddDictionary("/C", MediaClip);

            // Media clip dictionary T 9.9
            TempFilePermissions = new PdfDictionary(this);
            MediaClip.AddDictionary("/P", TempFilePermissions);

            // media play
            MediaPlay = new PdfDictionary(this);
            Rendition.AddDictionary("/P", MediaPlay);

            // media play BE
            MediaPlayBE = new PdfDictionary(this);
            MediaPlay.AddDictionary("/BE", MediaPlayBE);

            // media screen parameters
            MediaScreenParam = new PdfDictionary(this);
            Rendition.AddDictionary("/SP", MediaScreenParam);

            // media screen parameters BE
            MediaScreenParamBE = new PdfDictionary(this);
            MediaScreenParam.AddDictionary("/BE", MediaScreenParamBE);

            // Section 8.5 page 669 table 8.64
            // type of action playing multimedia content
            Dictionary.Add("/S", "/Rendition");

            // media clip data page 762
            Rendition.Add("/S", "/MR");

            // Table 9.6 page 762
            MediaClip.AddPdfString("/CT", MimeType);
            MediaClip.AddIndirectReference("/D", MediaFile);
            MediaClip.Add("/S", "/MCD");
            MediaClip.Add("/Type", "/MediaClip");

            // Operation to perform when action is triggered. Valid options are 0 or 4
            // OP=0 force the Rendition dictionary to take over the annotation
            Dictionary.Add("/OP", "0");

            // allow reader to always create temporary file (other options do not work)
            // Media clip dictionary T 9.10 page 766
            TempFilePermissions.AddPdfString("/TF", "TEMPALWAYS");

            // do not display control
            MediaPlayBE.AddBoolean("/C", false);

            // repeat count of 1
            MediaPlayBE.Add("/RC", "1.0");

            // media scale and position within annotation rectangle PDF default is 5
            // /F=2 strech media to fit annotation
            MediaPlayBE.Add("/F", "2");

            // play rendition in annotation rectangle
            MediaScreenParamBE.Add("/W", "3");

            // exit
            return;
        }
        /// <summary>
        /// Display media constructor
        /// </summary>
        /// <param name="MediaFile">Embedded media file</param>
        /// <param name="MimeType">Mime type</param>
        /// <remarks>
        /// <para>
        /// If mime type is null the program will try to convert file extension
        /// to mime type. If conversion is not available application exception will be raised.
        /// </para>
        /// </remarks>
        public PdfDisplayMedia(
			PdfEmbeddedFile	MediaFile,
			String			MimeType = null
			)
            : base(MediaFile.Document)
        {
            // save media file
            this.MediaFile = MediaFile;

            // save mimetype
            if(MimeType == null) MimeType = MediaFile.MimeType;
            if(String.IsNullOrWhiteSpace(MimeType)) throw new ApplicationException("MIME type is not defined");

            // rendition dictionary page 759 Section 9.1.2 Table 9.1
            Rendition = new PdfDictionary(this);
            Dictionary.AddDictionary("/R", Rendition);

            // media clip
            MediaClip = new PdfDictionary(this);
            Rendition.AddDictionary("/C", MediaClip);

            // Media clip dictionary T 9.9
            TempFilePermissions = new PdfDictionary(this);
            MediaClip.AddDictionary("/P", TempFilePermissions);

            // media play
            MediaPlay = new PdfDictionary(this);
            Rendition.AddDictionary("/P", MediaPlay);

            // media play BE
            MediaPlayBE = new PdfDictionary(this);
            MediaPlay.AddDictionary("/BE", MediaPlayBE);

            // media screen parameters
            MediaScreenParam = new PdfDictionary(this);
            Rendition.AddDictionary("/SP", MediaScreenParam);

            // media screen parameters BE
            MediaScreenParamBE = new PdfDictionary(this);
            MediaScreenParam.AddDictionary("/BE", MediaScreenParamBE);

            // Section 8.5 page 669 table 8.64
            // type of action playing multimedia content
            Dictionary.Add("/S", "/Rendition");

            // media clip data page 762
            Rendition.Add("/S", "/MR");

            // Table 9.6 page 762
            MediaClip.AddPdfString("/CT", MimeType);
            MediaClip.AddIndirectReference("/D", MediaFile);
            MediaClip.Add("/S", "/MCD");
            MediaClip.Add("/Type", "/MediaClip");

            // Operation to perform when action is triggered. Valid options are 0 or 4
            // OP=0 force the Rendition dictionary to take over the annotation
            Dictionary.Add("/OP", "0");

            // allow reader to always create temporary file (other options do not work)
            // Media clip dictionary T 9.10 page 766
            TempFilePermissions.AddPdfString("/TF", "TEMPALWAYS");

            // do not display control
            MediaPlayBE.AddBoolean("/C", false);

            // repeat count of 1
            MediaPlayBE.Add("/RC", "1.0");

            // media scale and position within annotation rectangle PDF default is 5
            // /F=2 strech media to fit annotation
            MediaPlayBE.Add("/F", "2");

            // play rendition in annotation rectangle
            MediaScreenParamBE.Add("/W", "3");

            // exit
            return;
        }
        ////////////////////////////////////////////////////////////////////
        // Write stream object to PDF file
        // Called by PdfDocument.CreateFile(FileName) method
        // to output one indirect stream PDF object.
        ////////////////////////////////////////////////////////////////////
        internal void WriteToPdfFile()
        {
            // already done or not in file object
            if (FilePosition != 0 || XRefType != XRefObjType.InFile)
            {
                return;
            }

            // save file position for this object
            FilePosition = Document.PdfFile.BaseStream.Position;

            // write object header
            Document.PdfFile.WriteFormat("{0} 0 obj\n", ObjectNumber);

            // stream object
            if (ObjectType == ObjectType.Stream)
            {
                // convert byte list to array
                if (ObjectValueList.Count > 0)
                {
                    ObjectValueArray = ObjectValueList.ToArray();
                }

                // object value is empty
                if (ObjectValueArray == null)
                {
                    ObjectValueArray = new byte[0];
                }

                // compress the stream and update dictionary if successful
                if (!NoCompression && PdfDocument.CompressStream(ref ObjectValueArray))
                {
                    Dictionary.Add("/Filter", "/FlateDecode");
                }

                // encryption
                if (Document.Encryption != null)
                {
                    ObjectValueArray = Document.Encryption.EncryptByteArray(ObjectNumber, ObjectValueArray);
                }

                // stream length
                Dictionary.AddInteger("/Length", ObjectValueArray.Length);

                // write dictionary
                Document.PdfFile.Write(Dictionary.ToByteArray());

                // write stream reserved word
                Document.PdfFile.WriteString("stream\n");

                // write content to pdf file
                Document.PdfFile.Write(ObjectValueArray);

                // write end of stream
                Document.PdfFile.WriteString("\nendstream\nendobj\n");
            }

            else
            {
                // write dictionary
                Document.PdfFile.Write(Dictionary.ToByteArray());

                // write end of object
                Document.PdfFile.WriteString("\nendobj\n");
            }

            // this indirect object was written to output file
            // tell the garbage collector that these objects are not used any more
            Dictionary       = null;
            ObjectValueList  = null;
            ObjectValueArray = null;
            return;
        }