//============================================================================ //Gios Pdf.NET - A library for exporting Pdf Documents in C# //Copyright (C) 2005 Paolo Gios - www.paologios.com // //This library is free software; you can redistribute it and/or //modify it under the terms of the GNU Lesser General Public //License as published by the Free Software Foundation; either //version 2.1 of the License, or (at your option) any later version. // //This library is distributed in the hope that it will be useful, //but WITHOUT ANY WARRANTY; without even the implied warranty of //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU //Lesser General Public License for more details. // //You should have received a copy of the GNU Lesser General Public //License along with this library; if not, write to the Free Software //Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA //============================================================================= using System; using System.Collections; using System.IO; using System.Text; using System.Drawing; namespace HH.WMS.Utils.Gios.Pdf { /// /// The base Pdf Document. /// public class PdfDocument { internal static bool FlateCompression=true; /// /// sets the page format for the Pdf Documents (default is A4) /// /// public void SetPageFormat(PdfDocumentFormat PdfDocumentFormat) { this.PdfDocumentFormat=PdfDocumentFormat; } internal double PH { get { return this.PdfDocumentFormat.height; } } internal double PW { get { return this.PdfDocumentFormat.width; } } internal PdfDocumentFormat PdfDocumentFormat=PdfDocumentFormat.A4; /// /// gets othe height of the page in points (using 72 dpi depth) /// public double PageHeight { get { return PH; } } /// /// gets the width of the page in points (using 72 dpi depth) /// public double PageWidth { get { return PW; } } #region properties internal int _nextid=0; internal int GetNextId { get { _nextid++; return _nextid; } } internal Hashtable PdfObjects; private PdfObject Header { get { foreach (PdfObject po in this.PdfObjects.Values) if (po.GetType()==typeof(PdfHeader)) return po; return null; } set { foreach (PdfObject po in this.PdfObjects.Values) if (po.GetType()==typeof(PdfHeader)) { this.PdfObjects.Remove(po.HeadObj); break; } this.PdfObjects.Add(value.HeadObj,value); } } internal PdfObject Catalog { get { foreach (PdfObject po in this.PdfObjects.Values) if (po.GetType()==typeof(PdfCatalog)) return po; return null; } } internal PdfObject PdfRoot { get { foreach (PdfObject po in this.PdfObjects.Values) if (po.GetType()==typeof(PdfRoot)) return po; return null; } } /// /// gets the current saved pages number of the document. /// public int PageCount { get { int count=0; foreach (PdfObject po in this.PdfObjects.Values) if (po.GetType()==typeof(PdfPage)) count++; return count; } } internal ArrayList FontList { get { ArrayList al=new ArrayList(); foreach (PdfObject po in this.PdfObjects.Values) if (po.GetType()==typeof(PdfFont)) al.Add(po); return al; } } internal bool ContainsFont(PdfFont pf) { bool r=false; foreach (PdfFont pf2 in this.FontList) { if (pf2.Name==pf.Name) r=true; } return r; } internal ArrayList FontNameList { get { ArrayList al=new ArrayList(); foreach (PdfObject po in this.PdfObjects.Values) if (po.GetType()==typeof(PdfFont)) al.Add((po as PdfFont).Name); return al; } } System.IO.Stream ms; #endregion /// /// set Document Subject and Title. /// public void SetHeaders(string subject,string title,string author) { if (subject==null) throw new Exception("string Subject cannot be null."); if (title==null) throw new Exception("string Title cannot be null."); this.Header=new PdfHeader(this,subject,title,author); } /// /// Creates a new Pdf Document. /// public PdfDocument() { PdfObjects=new Hashtable(); this.AddPdfObject(new PdfHeader(this,"","","")); } public PdfDocument(PdfDocumentFormat DocumentFormat) { this.SetPageFormat(DocumentFormat); PdfObjects=new Hashtable(); this.AddPdfObject(new PdfHeader(this,"","","")); } internal void AddPdfObject(PdfObject po) { po.PdfDocument=this; if (!this.PdfObjects.ContainsKey(po.HeadObj)) { this.PdfObjects.Add(po.HeadObj,po); } } private void Send(string strMsg) { Byte[] buffer=null; buffer=ASCIIEncoding.ASCII.GetBytes(strMsg); ms.Write(buffer,0,buffer.Length); } /// /// Outputs the Complete Pdf Document to a Generic Stream /// /// /// The Generic Stream to Output the Pdf Document /// public void SaveToStream(System.IO.Stream m) { this.AddPdfObject(new PdfCatalog(this)); this.AddPdfObject(new PdfRoot(this)); this.ms=m; try {Send("%PDF-1.4\n");} catch {throw new Exception("Error writing to the output stream.");} string xref="xref\n0 "+this.PdfObjects.Count.ToString()+"\n0000000000 65535 f \n"; long pos=0; for (int x=1;x<=this._nextid;x++) { PdfObject o=this.PdfObjects[x.ToString()+" 0 obj\n"] as PdfObject; if (o!=null) { xref+=Utility.xRefFormatting(pos)+" 00000 n \n"; try {pos+=o.StreamWrite(ms);} catch {throw new Exception("Error generating the document.");} } } long startxref=pos; Send(xref); Send("trailer\n<<\n/Size "+ (PdfObjects.Count)+"\n/Root "+this.Catalog.HeadR+"\n/Info "+this.Header.HeadR+"\n>>\n"); Send("startxref\n" + startxref+"\n"); Send("%%EOF\n"); } /// /// Outputs the complete PDF Document to a file /// /// public void SaveToFile(string file) { System.IO.FileStream fs; try { fs=new FileStream(file,FileMode.Create,FileAccess.Write); } catch {throw new Exception("Error opening destination file");} this.SaveToStream(fs); fs.Close(); } internal void AddFont(System.Drawing.Font f) { string name=PdfFont.FontToPdfType(f); PdfFont pf=new PdfFont(name,name); if (!this.ContainsFont(pf)) { pf.ID=this.GetNextId; this.AddPdfObject(pf); } } /// /// Creates a New Page for the Pdf Document /// /// /// /// public PdfPage NewPage() { PdfPage p=new PdfPage(); p.PdfDocument=this; return p; } /// /// Insert the Image Object into the Document before placing it in a document page /// /// /// the Color 72dpi Jpeg Image to insert into the document /// /// /// /// public PdfImage NewImage(string file) { PdfImage pi; try {pi=new PdfImage(this.GetNextId,file);} catch {throw new Exception("Error opening the Image File");} this.AddPdfObject(pi); return pi; } /// /// Instantiates a new PdfTable setting the default specs. /// /// /// /// /// /// /// /// public PdfTable NewTable(ContentAlignment DefaultContentAlignment,Font DefaultFont,Color DefaultForegroundColor,int Rows ,int Columns,double CellPadding) { if (Rows<=0) throw new Exception("Rows must be grater than zero."); if (Columns<=0) throw new Exception("Columns must be grater than zero."); if (CellPadding<0) throw new Exception("CellPadding must be non-negative."); PdfTable pt=new PdfTable(this,DefaultContentAlignment,DefaultFont,DefaultForegroundColor,Rows ,Columns,CellPadding); pt.header=new PdfTable(this,ContentAlignment.MiddleCenter,DefaultFont,Color.Black,1 ,Columns,CellPadding); return pt; } /// /// Instantiates a new PdfTable setting the default specs. /// /// /// /// /// /// public PdfTable NewTable(Font DefaultFont,int Rows,int Columns,double CellPadding) { if (Rows<=0) throw new Exception("Rows must be grater than zero."); if (Columns<=0) throw new Exception("Columns must be grater than zero."); if (CellPadding<0) throw new Exception("CellPadding must be non-negative."); PdfTable pt=new PdfTable(this,ContentAlignment.TopCenter,DefaultFont,Color.Black,Rows ,Columns,CellPadding); pt.header=new PdfTable(this,ContentAlignment.MiddleCenter,DefaultFont,Color.Black,1 ,Columns,CellPadding); return pt; } } }