Example #1
0
 /// <summary>
 /// Saves the stream position. 2nd Edition.
 /// </summary>
 internal override void WriteObject(PdfWriter writer)
 {
   Debug.Assert(false, "Must not come here!");
   //      Debug.Assert(this.inStreamOffset <= 0);
   //      if (this.inStreamOffset == 0)
   //      {
   //        //this.InStreamOffset = stream.Position;
   //        this.document.xrefTable.AddObject(this);
   //        return Format("{0} {1} obj\n", this.objectID, this.generation);
   //      }
   //      else if (this.inStreamOffset == -1)
   //      {
   //
   //      }
   //      return null;
   //
 }
 /// <summary>
 /// Writes the string literal with encoding DOCEncoded.
 /// </summary>
 internal override void WriteObject(PdfWriter writer)
 {
   writer.WriteBeginObject(this);
   writer.Write(new PdfString(this.value, this.flags));
   writer.WriteEndObject();
 }
Example #3
0
    //internal override void WriteDictionaryElement(PdfSharp.Pdf.IO.PdfWriter writer, PdfName key)
    //{
    //  //if (key == Keys.ID)
    //  //{
    //  //  PdfArray array = Elements[key] as PdfArray;
    //  //  PdfItem item = array.Elements[0];
    //  //  //base.WriteDictionaryElement(writer, key);
    //  //  return;
    //  //}
    //  base.WriteDictionaryElement (writer, key);
    //}

    internal override void WriteObject(PdfWriter writer)
    {
      // Delete /XRefStm entry, if any
      this.elements.Remove(Keys.XRefStm);

      // Don't encypt myself
      PdfStandardSecurityHandler securityHandler = writer.SecurityHandler;
      writer.SecurityHandler = null;
      base.WriteObject(writer);
      writer.SecurityHandler = securityHandler;
    }
Example #4
0
        internal override void WriteObject(PdfWriter writer)
        {
            // HACK: temporarily flip media box if Landscape
            PdfRectangle mediaBox = MediaBox;
            // TODO: Take /Rotate into account
            if (_orientation == PageOrientation.Landscape)
                MediaBox = new PdfRectangle(mediaBox.X1, mediaBox.Y1, mediaBox.Y2, mediaBox.X2);

#if true
            // Add transparency group to prevent rendering problems of Adobe viewer.
            // Update (PDFsharp 1.50 beta 3): Add transparency group only of ColorMode is defined.
            // Rgb is the default for the ColorMode, but if user sets it to Undefined then
            // we respect this and skip the transparency group.
            TransparencyUsed = true; // TODO: check XObjects
            if (TransparencyUsed && !Elements.ContainsKey(Keys.Group) &&
                _document.Options.ColorMode != PdfColorMode.Undefined)
            {
                PdfDictionary group = new PdfDictionary();
                _elements["/Group"] = group;
                if (_document.Options.ColorMode != PdfColorMode.Cmyk)
                    group.Elements.SetName("/CS", "/DeviceRGB");
                else
                    group.Elements.SetName("/CS", "/DeviceCMYK");
                group.Elements.SetName("/S", "/Transparency");
                //False is default: group.Elements["/I"] = new PdfBoolean(false);
                //False is default: group.Elements["/K"] = new PdfBoolean(false);
            }
#endif

#if DEBUG_
            PdfItem item = Elements["/MediaBox"];
            if (item != null)
                item.GetType();
#endif
            base.WriteObject(writer);

            if (_orientation == PageOrientation.Landscape)
                MediaBox = mediaBox;
        }
Example #5
0
    /// <summary>
    /// Writes the object in PDF iref table format.
    /// </summary>
    internal void WriteXRefEnty(PdfWriter writer)
    {
      // PDFsharp does not yet support PDF 1.5 object streams.

      // Each line must be exactly 20 bytes long, otherwise Acrobat repairs the file.
      string text = String.Format("{0:0000000000} {1:00000} n\n",
        this.position, this.objectID.GenerationNumber); // this.InUse ? 'n' : 'f');
      writer.WriteRaw(text);
    }
Example #6
0
    /// <summary>
    /// Writes a key/value pair of this dictionary. This function is intended to be overridden
    /// in derived classes.
    /// </summary>
    internal virtual void WriteDictionaryElement(PdfWriter writer, PdfName key)
    {
      if (key == null)
        throw new ArgumentNullException("key");
      PdfItem item = Elements[key];
#if DEBUG
      // TODO: simplify PDFsharp
      if (item is PdfObject && ((PdfObject)item).IsIndirect)
      {
        // Replace an indirect object by its Reference
        item = ((PdfObject)item).Reference;
        Debug.Assert(false, "Check when we come here.");
      }
#endif
      key.WriteObject(writer);
      item.WriteObject(writer);
      writer.NewLine();
    }
 /// <summary>
 /// Writes the real literal.
 /// </summary>
 internal override void WriteObject(PdfWriter writer)
 {
   writer.WriteBeginObject(this);
   writer.Write(this.value);
   writer.WriteEndObject();
 }
Example #8
0
 /// <summary>
 /// Writes the value in the PDF date format.
 /// </summary>
 internal override void WriteObject(PdfWriter writer)
 {
   writer.WriteDocString(ToString());
 }
Example #9
0
        internal override void WriteObject(PdfWriter writer)
        {
            PdfPage dest = null;
            //pdf.AppendFormat(CultureInfo.InvariantCulture,
            //  "{0} 0 obj\n<<\n/Type/Annot\n/Subtype/Link\n" +
            //  "/Rect[{1} {2} {3} {4}]\n/BS<</Type/Border>>\n/Border[0 0 0]\n/C[0 0 0]\n",
            //  ObjectID.ObjectNumber, rect.X1, rect.Y1, rect.X2, rect.Y2);

            // Older Adobe Reader versions uses a border width of 0 as default value if neither Border nor BS are present.
            // But the PDF Reference specifies:
            // "If neither the Border nor the BS entry is present, the border is drawn as a solid line with a width of 1 point."
            // After this issue was fixed in newer Reader versions older PDFsharp created documents show an ugly solid border.
            // The following hack fixes this by specifying a 0 width border.
            if (Elements[PdfAnnotation.Keys.BS] == null)
                Elements[PdfAnnotation.Keys.BS] = new PdfLiteral("<</Type/Border/W 0>>");

            // May be superfluous. See comment above.
            if (Elements[PdfAnnotation.Keys.Border] == null)
                Elements[PdfAnnotation.Keys.Border] = new PdfLiteral("[0 0 0]");

            switch (_linkType)
            {
                case LinkType.None:
                    break;

                case LinkType.Document:
                    // destIndex > Owner.PageCount can happen when rendering pages using PDFsharp directly.
                    int destIndex = _destPage;
                    if (destIndex > Owner.PageCount)
                        destIndex = Owner.PageCount;
                    destIndex--;
                    dest = Owner.Pages[destIndex];
                    //pdf.AppendFormat("/Dest[{0} 0 R/XYZ null null 0]\n", dest.ObjectID);
                    Elements[Keys.Dest] = new PdfLiteral("[{0} 0 R/XYZ null null 0]", dest.ObjectNumber);
                    break;

                case LinkType.Web:
                    //pdf.AppendFormat("/A<</S/URI/URI{0}>>\n", PdfEncoders.EncodeAsLiteral(url));
                    Elements[PdfAnnotation.Keys.A] = new PdfLiteral("<</S/URI/URI{0}>>", //PdfEncoders.EncodeAsLiteral(url));
                        PdfEncoders.ToStringLiteral(_url, PdfStringEncoding.WinAnsiEncoding, writer.SecurityHandler));
                    break;

                case LinkType.File:
                    //pdf.AppendFormat("/A<</Type/Action/S/Launch/F<</Type/Filespec/F{0}>> >>\n", 
                    //  PdfEncoders.EncodeAsLiteral(url));
                    Elements[PdfAnnotation.Keys.A] = new PdfLiteral("<</Type/Action/S/Launch/F<</Type/Filespec/F{0}>> >>",
                        //PdfEncoders.EncodeAsLiteral(url));
                        PdfEncoders.ToStringLiteral(_url, PdfStringEncoding.WinAnsiEncoding, writer.SecurityHandler));
                    break;
            }
            base.WriteObject(writer);
        }
Example #10
0
    /// <summary>
    /// Implements saving a PDF file.
    /// </summary>
    void DoSave(PdfWriter writer)
    {
      if (this.pages == null || this.pages.Count == 0)
        throw new InvalidOperationException("Cannot save a PDF document with no pages.");

      try
      {
        bool encrypt = this.securitySettings.DocumentSecurityLevel != PdfDocumentSecurityLevel.None;
        if (encrypt)
        {
          PdfStandardSecurityHandler securityHandler = this.securitySettings.SecurityHandler;
          if (securityHandler.Reference == null)
            this.irefTable.Add(securityHandler);
          else
            Debug.Assert(this.irefTable.Contains(securityHandler.ObjectID));
          this.trailer.Elements[PdfTrailer.Keys.Encrypt] = this.securitySettings.SecurityHandler.Reference;
        }
        else
          this.trailer.Elements.Remove(PdfTrailer.Keys.Encrypt);

        PrepareForSave();

        if (encrypt)
          this.securitySettings.SecurityHandler.PrepareEncryption();

        writer.WriteFileHeader(this);
        PdfReference[] irefs = this.irefTable.AllReferences;
        int count = irefs.Length;
        for (int idx = 0; idx < count; idx++)
        {
          PdfReference iref = irefs[idx];
#if DEBUG_
          if (iref.ObjectNumber == 378)
            GetType();
#endif
          iref.Position = writer.Position;
          iref.Value.WriteObject(writer);
        }
        int startxref = writer.Position;
        this.irefTable.WriteObject(writer);
        writer.WriteRaw("trailer\n");
        this.trailer.Elements.SetInteger("/Size", count + 1);
        this.trailer.WriteObject(writer);
        writer.WriteEof(this, startxref);

        //if (encrypt)
        //{
        //  this.state &= ~DocumentState.SavingEncrypted;
        //  //this.securitySettings.SecurityHandler.EncryptDocument();
        //}
      }
      finally
      {
        if (writer != null)
        {
          writer.Stream.Flush();
          // DO NOT CLOSE WRITER HERE
          //writer.Close();
        }
      }
    }
Example #11
0
 /// <summary>
 /// Writes a key/value pair of this dictionary. This function is intended to be overridden
 /// in derived classes.
 /// </summary>
 internal virtual void WriteDictionaryElement(PdfWriter writer, PdfName key)
 {
   if (key == null)
     throw new ArgumentNullException("key");
   PdfItem item = Elements[key];
   key.WriteObject(writer);
   item.WriteObject(writer);
   writer.NewLine();
 }
Example #12
0
    /// <summary>
    /// Saves the document to the specified stream.
    /// </summary>
    public void Save(Stream stream, bool closeStream)
    {
        if (!CanModify)
            throw new InvalidOperationException(PSSR.CannotModify);

      // TODO: more diagnostic checks
      string message = "";
      if (!CanSave(ref message))
        throw new PdfSharpException(message);

      // Get security handler if document gets encrypted
      PdfStandardSecurityHandler securityHandler = null;
      if (SecuritySettings.DocumentSecurityLevel != PdfDocumentSecurityLevel.None)
        securityHandler = SecuritySettings.SecurityHandler;

      PdfWriter writer = new PdfWriter(stream, securityHandler);
      try
      {
        DoSave(writer);
      }
      finally
      {
        if (stream != null)
        {
          if (closeStream)
            stream.Close();
          else
            stream.Position = 0; // Reset the stream position if the stream is left open.
        }
        if (writer != null)
          writer.Close(closeStream);
      }
    }
Example #13
0
    /// <summary>
    /// Closes this instance.
    /// </summary>
    public void Close()
    {
      if (!CanModify)
        throw new InvalidOperationException(PSSR.CannotModify);

      if (this.outStream != null)
      {
        // Get security handler if document gets encrypted
        PdfStandardSecurityHandler securityHandler = null;
        if (SecuritySettings.DocumentSecurityLevel != PdfDocumentSecurityLevel.None)
          securityHandler = SecuritySettings.SecurityHandler;

        PdfWriter writer = new PdfWriter(this.outStream, securityHandler);
        try
        {
          DoSave(writer);
        }
        finally
        {
          writer.Close();
        }
      }
    }
Example #14
0
 /// <summary>
 /// Writes the name including the leading slash.
 /// </summary>
 internal override void WriteObject(PdfWriter writer)
 {
   // TODO: what if unicode character are part of the name? 
   writer.Write(this);
 }
Example #15
0
    internal override void WriteObject(PdfWriter writer)
    {
      // HACK: temporarily flip media box if Landscape
      PdfRectangle mediaBox = MediaBox;
      // TODO: Take /Rotate into account
      if (this.orientation == PageOrientation.Landscape)
        MediaBox = new PdfRectangle(mediaBox.X1, mediaBox.Y1, mediaBox.Y2, mediaBox.X2);

#if true
      // Add transparency group to prevent rendering problems of Adobe viewer
      this.transparencyUsed = true; // TODO: check XObjects
      if (this.transparencyUsed && !Elements.Contains(Keys.Group))
      {
        PdfDictionary group = new PdfDictionary();
        this.elements["/Group"] = group;
        if (this.document.Options.ColorMode != PdfColorMode.Cmyk)
          group.Elements.SetName("/CS", "/DeviceRGB");
        else
          group.Elements.SetName("/CS", "/DeviceCMYK");
        group.Elements.SetName("/S", "/Transparency");
        group.Elements["/I"] = new PdfBoolean(false);
        group.Elements["/K"] = new PdfBoolean(false);
      }
#endif

#if DEBUG_
      PdfItem item = Elements["/MediaBox"];
      if (item != null)
        item.GetType();
#endif
      base.WriteObject(writer);

      if (this.orientation == PageOrientation.Landscape)
        MediaBox = mediaBox;
    }
Example #16
0
    internal override void WriteObject(PdfWriter writer)
    {
      // TODO: Take /Rotate into account
//#warning THHO4STLA: warum nicht new PdfRectangle(mediaBox.Y1, mediaBox.X1, mediaBox.Y2, mediaBox.X2)? - siehe auch Orientation
//#warning THHO4STLA: CropBox, BleedBox etc. auch drehen?

#if true
      // Add transparency group to prevent rendering problems of Adobe viewer
      this.transparencyUsed = true; // TODO: check XObjects
      if (this.transparencyUsed && !Elements.ContainsKey(Keys.Group))
      {
        PdfDictionary group = new PdfDictionary();
        this.elements["/Group"] = group;
        if (this.document.Options.ColorMode != PdfColorMode.Cmyk)
          group.Elements.SetName("/CS", "/DeviceRGB");
        else
          group.Elements.SetName("/CS", "/DeviceCMYK");
        group.Elements.SetName("/S", "/Transparency");
        group.Elements["/I"] = new PdfBoolean(false);
        group.Elements["/K"] = new PdfBoolean(false);
      }
#endif

#if DEBUG_
      PdfItem item = Elements["/MediaBox"];
      if (item != null)
        item.GetType();
#endif
      base.WriteObject(writer);
    }
Example #17
0
    internal override void WriteObject(PdfWriter writer)
    {
      writer.WriteBeginObject(this);
      //int count = Elements.Count;
      PdfName[] keys = Elements.KeyNames;

#if DEBUG
      // TODO: automatically set length
      if (this.stream != null)
        Debug.Assert(Elements.Contains(PdfDictionary.PdfStream.Keys.Length), "Dictionary has a stream but no length is set.");
#endif

#if DEBUG
      // Sort keys for debugging purposes. Comparing PDF files with for example programms like
      // Araxis Merge is easier with sorted keys.
      if (writer.Layout == PdfWriterLayout.Verbose)
      {
        ArrayList list = new ArrayList(keys);
        list.Sort(PdfName.Comparer);
        list.CopyTo(keys, 0);
      }
#endif

      foreach (PdfName key in keys)
        WriteDictionaryElement(writer, key);
      if (Stream != null)
        WriteDictionaryStream(writer);
      writer.WriteEndObject();
    }
Example #18
0
 internal override void WriteObject(PdfWriter writer)
 {
   writer.WriteBeginObject(this);
   int count = Elements.Count;
   for (int idx = 0; idx < count; idx++)
   {
     PdfItem value = Elements[idx];
     value.WriteObject(writer);
   }
   writer.WriteEndObject();
 }
Example #19
0
 /// <summary>
 /// Writes the stream of this dictionary. This function is intended to be overridden
 /// in a derived class.
 /// </summary>
 internal virtual void WriteDictionaryStream(PdfWriter writer)
 {
   writer.WriteStream(this, (writer.Options & PdfWriterOptions.OmitStream) == PdfWriterOptions.OmitStream);
 }
Example #20
0
 /// <summary>
 /// When overridden in a derived class, appends a raw string representation of this object
 /// to the specified PdfWriter.
 /// </summary>
 internal abstract void WriteObject(PdfWriter writer);
Example #21
0
        /// <summary>
        /// Writes the xref section in pdf stream.
        /// </summary>
        internal void WriteObject(PdfWriter writer)
        {
            writer.WriteRaw("xref\n");

            PdfReference[] irefs = AllReferences;

            int count = irefs.Length;
            writer.WriteRaw(String.Format("0 {0}\n", count + 1));
            writer.WriteRaw(String.Format("{0:0000000000} {1:00000} {2} \n", 0, 65535, "f"));
            //PdfEncoders.WriteAnsi(stream, text);

            for (int idx = 0; idx < count; idx++)
            {
                PdfReference iref = irefs[idx];

                // Acrobat is very pedantic; it must be exactly 20 bytes per line.
                writer.WriteRaw(String.Format("{0:0000000000} {1:00000} {2} \n", iref.Position, iref.GenerationNumber, "n"));
            }
        }
 internal override void WriteObject(PdfWriter writer)
 {
   // Don't encypt myself
   PdfStandardSecurityHandler securityHandler = writer.SecurityHandler;
   writer.SecurityHandler = null;
   base.WriteObject(writer);
   writer.SecurityHandler = securityHandler;
 }
Example #23
0
    internal override void WriteObject(PdfWriter writer)
    {
      if (this.pdfRenderer != null)
      {
        // GetContent also disposes the underlying XGraphics object, if one exists
        //Stream = new PdfStream(PdfEncoders.RawEncoding.GetBytes(this.pdfRenderer.GetContent()), this);
        this.pdfRenderer.Close();
        Debug.Assert(this.pdfRenderer == null);
      }

      if (Stream != null)
      {
        if (this.Owner.Options.CompressContentStreams)
        {
          Stream.Value = Filtering.FlateDecode.Encode(Stream.Value);
          Elements["/Filter"] = new PdfName("/FlateDecode");
        }
        Elements.SetInteger("/Length", Stream.Length);
      }

      base.WriteObject(writer);
    }
Example #24
0
    internal override void WriteObject(PdfWriter writer)
    {
      PdfPage dest = null;
      //pdf.AppendFormat(CultureInfo.InvariantCulture,
      //  "{0} 0 obj\n<<\n/Type/Annot\n/Subtype/Link\n" +
      //  "/Rect[{1} {2} {3} {4}]\n/BS<</Type/Border>>\n/Border[0 0 0]\n/C[0 0 0]\n",
      //  this.ObjectID.ObjectNumber, rect.X1, rect.Y1, rect.X2, rect.Y2);

      if (Elements[Keys.BS] == null)
        Elements[Keys.BS] = new PdfLiteral("<</Type/Border>>");

      if (Elements[Keys.Border] == null)
        Elements[Keys.Border] = new PdfLiteral("[0 0 0]");

      switch (this.linkType)
      {
        case LinkType.Document:
          // destIndex > Owner.PageCount can happen rendering pages using PDFsharp directly
          int destIndex = this.destPage;
          if (destIndex > Owner.PageCount)
            destIndex = Owner.PageCount;
          destIndex--;
          dest = this.Owner.Pages[destIndex];
          //pdf.AppendFormat("/Dest[{0} 0 R/XYZ null null 0]\n", dest.ObjectID);
          Elements[Keys.Dest] = new PdfLiteral("[{0} 0 R/XYZ null null 0]", dest.ObjectNumber);
          break;

        case LinkType.Web:
          //pdf.AppendFormat("/A<</S/URI/URI{0}>>\n", PdfEncoders.EncodeAsLiteral(this.url));
          Elements[Keys.A] = new PdfLiteral("<</S/URI/URI{0}>>", //PdfEncoders.EncodeAsLiteral(this.url));
            PdfEncoders.ToStringLiteral(this.url, PdfStringEncoding.WinAnsiEncoding, writer.SecurityHandler));
          break;

        case LinkType.File:
          //pdf.AppendFormat("/A<</Type/Action/S/Launch/F<</Type/Filespec/F{0}>> >>\n", 
          //  PdfEncoders.EncodeAsLiteral(this.url));
          Elements[Keys.A] = new PdfLiteral("<</Type/Action/S/Launch/F<</Type/Filespec/F{0}>> >>",
            //PdfEncoders.EncodeAsLiteral(this.url));
            PdfEncoders.ToStringLiteral(this.url, PdfStringEncoding.WinAnsiEncoding, writer.SecurityHandler));
          break;
      }
      base.WriteObject(writer);
    }
    /// <summary>
    /// Writes the iref section in pdf stream.
    /// </summary>
    internal void WriteObject(PdfWriter writer)
    {
      writer.WriteRaw("xref\n");

      //      PdfObjectID[] objectIDs2 = AllObjectIDs;
      PdfReference[] irefs = AllReferences;
      //      PdfObjectID id1 = objectIDs2[0];
      //      PdfReference     xref1 = irefs[0];
      //      id1.GetType();
      //      xref1.GetType();
      //ArrayList list = new ArrayList(AllObjectIDs);
      //list.Sort();
      //list.CopyTo(objectIDs);

      int count = irefs.Length;
      writer.WriteRaw(String.Format("0 {0}\n", count + 1));
      writer.WriteRaw(String.Format("{0:0000000000} {1:00000} {2} \n", 0, 65535, "f"));
      //PdfEncoders.WriteAnsi(stream, text);

      for (int idx = 0; idx < count; idx++)
      {
        PdfReference iref = irefs[idx];

        //text = String.Format("{0} {1}\n", iref.ObjectID.ObjectNumber, 1);
        //PdfEncoders.WriteAnsi(stream, text);

        // Acrobat is very pedantic; it must be exactly 20 bytes per line.
        writer.WriteRaw(
          String.Format("{0:0000000000} {1:00000} {2} \n", iref.Position, iref.GenerationNumber, "n"));
        //PdfEncoders.WriteAnsi(stream, text);
      }
    }
 /// <summary>
 /// Writes the keyword «null».
 /// </summary>
 internal override void WriteObject(PdfWriter writer)
 {
   writer.WriteBeginObject(this);
   writer.WriteRaw(" null ");
   writer.WriteEndObject();
 }
Example #27
0
 internal override void WriteObject(PdfWriter writer)
 {
     if (_outline != null && _outline.Outlines.Count > 0)
     {
         if (Elements[Keys.PageMode] == null)
             PageMode = PdfPageMode.UseOutlines;
     }
     base.WriteObject(writer);
 }
Example #28
0
 internal override void WriteObject(PdfWriter writer)
 {
     // Implementet because it must be overridden.
     writer.WriteRaw(" null ");
 }
Example #29
0
 /// <summary>
 /// Writes 'true' or 'false'.
 /// </summary>
 internal override void WriteObject(PdfWriter writer)
 {
   writer.Write(this);
 }
Example #30
0
 /// <summary>
 /// Writes a PdfItem into the specified stream.
 /// </summary>
 // This function exists to keep PdfWriter and PdfItem.WriteObject internal.
 public void WriteObject(Stream stream, PdfItem item)
 {
   // Never write an encrypted object
   PdfWriter writer = new PdfWriter(stream, null);
   writer.Options = PdfWriterOptions.OmitStream;
   item.WriteObject(writer);
 }