/// <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(); }
//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; }
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; }
/// <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); }
/// <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(); }
/// <summary> /// Writes the value in the PDF date format. /// </summary> internal override void WriteObject(PdfWriter writer) { writer.WriteDocString(ToString()); }
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); }
/// <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(); } } }
/// <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(); }
/// <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); } }
/// <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(); } } }
/// <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); }
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; }
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); }
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(); }
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(); }
/// <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); }
/// <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);
/// <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; }
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); }
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(); }
internal override void WriteObject(PdfWriter writer) { if (_outline != null && _outline.Outlines.Count > 0) { if (Elements[Keys.PageMode] == null) PageMode = PdfPageMode.UseOutlines; } base.WriteObject(writer); }
internal override void WriteObject(PdfWriter writer) { // Implementet because it must be overridden. writer.WriteRaw(" null "); }
/// <summary> /// Writes 'true' or 'false'. /// </summary> internal override void WriteObject(PdfWriter writer) { writer.Write(this); }
/// <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); }