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