Asp.NET Tutorials
Home > 文件操作 > 用C#代码生成一个简单的PDF文件
用C#代码生成一个简单的PDF文件


摘自《程序员大本营2001.net版》

 

using System;

using System.IO;

using System.Text;

using System.Collections;

 

namespace PDFGenerator

{

    /// <summary>

    /// Application : Generation of PDF file from text

    /// Author        : Pramod Kumar Singh

    /// Date        : 25th July 2001

    ///</summary>

       

    public class PDFGenerator

    {

        static float pageWidth = 594.0f;

        static float pageDepth = 828.0f;

        static float pageMargin = 30.0f;

        static float fontSize = 10.0f;

        static float leadSize = 10.0f;

       

        //Create a PDF file.

        //PDF on Disk

        static StreamWriter pPDF=new StreamWriter("F:\\Temp\\myPDF.pdf");

        //PDF in Memory

        static MemoryStream mPDF= new MemoryStream();

       

        //Convert the Text Data to PDF format and write back to

        //Memory Stream

        static void ConvertToByteAndAddtoStream(string strMsg)

        {

            Byte[] buffer=null;

            buffer=ASCIIEncoding.ASCII.GetBytes(strMsg);

            mPDF.Write(buffer,0,buffer.Length); 

            buffer=null;

        }

       

        //Format the data length in xRef Format

        static string xRefFormatting(long xValue)

        {

            string strMsg =xValue.ToString();

            int iLen=strMsg.Length;

            if (iLen<10)

            {

                StringBuilder s=new StringBuilder();

                //string s=null;

                int i=10-iLen;

                s.Append('0',i);

                strMsg=s.ToString() + strMsg;

            }

            return strMsg;

        }

 

        //Entry Point

        static void Main(string[] args)

        {

            //Create a ArrayList for xRefs of PDF Document

            ArrayList xRefs=new ArrayList();

            Byte[] buffer=null;

            float yPos =0f;

            long streamStart=0;

            long streamEnd=0;

            long streamLen =0;

            string strPDFMessage=null;

            //PDF Header Message

            strPDFMessage="%PDF-1.1\n";

            ConvertToByteAndAddtoStream(strPDFMessage);

           

            //ID 1 For Containt

            //ID 2 For Length of the Stream

            //write the Text

           

            //1> Start a new Page

            xRefs.Add(mPDF.Length);

            strPDFMessage="1 0 obj\n";

            ConvertToByteAndAddtoStream(strPDFMessage);

            strPDFMessage="<< /Length 2 0 R >>\n";

            ConvertToByteAndAddtoStream(strPDFMessage);

            strPDFMessage="stream\n";

            ConvertToByteAndAddtoStream(strPDFMessage);

           

            //Get the start of the stream

            streamStart=mPDF.Length;

            strPDFMessage="BT\n/F0 " + fontSize +" Tf\n";

            ConvertToByteAndAddtoStream(strPDFMessage);

            yPos = pageDepth - pageMargin;

            strPDFMessage=pageMargin + " " + yPos +" Td\n" ;

            ConvertToByteAndAddtoStream(strPDFMessage);

            strPDFMessage= leadSize+" TL\n" ;

            ConvertToByteAndAddtoStream(strPDFMessage);

           

            //Add the text data to the PDF memory stream

            strPDFMessage= "(Pramod Kumar Singh)Tj\n" ;

            ConvertToByteAndAddtoStream(strPDFMessage);

            strPDFMessage= "ET\n";

            ConvertToByteAndAddtoStream(strPDFMessage);

            //Get the End of the stream

            streamEnd=mPDF.Length;

            //Get the Length of the stream

            streamLen=streamEnd-streamStart;

            strPDFMessage= "endstream\nendobj\n";

            ConvertToByteAndAddtoStream(strPDFMessage);

                   

            //Add 2 object to xRef

            xRefs.Add(mPDF.Length);

            strPDFMessage="2 0 obj\n"+ streamLen + "\nendobj\n";

            ConvertToByteAndAddtoStream(strPDFMessage);

                       

            //Add Page to xRefs

            xRefs.Add(mPDF.Length);

            strPDFMessage="3 0 obj\n<</Type/Page/Parent 4 0 R/Contents 1 0 R>>\nendobj\n";

            ConvertToByteAndAddtoStream(strPDFMessage);

           

            //Build the Pages

            xRefs.Add(mPDF.Length);

            strPDFMessage="4 0 obj\n<</Type /Pages /Count 1\n";

            ConvertToByteAndAddtoStream(strPDFMessage);

            strPDFMessage="/Kids[\n3 0 R\n]\n";

            ConvertToByteAndAddtoStream(strPDFMessage);

            strPDFMessage="/Resources<</ProcSet[/PDF/Text]/Font<</F0 5 0 R>> >>\n";

            ConvertToByteAndAddtoStream(strPDFMessage);

            strPDFMessage="/MediaBox [ 0 0 "+ pageWidth + " " + pageDepth + " ]\n>>\nendobj\n";

            ConvertToByteAndAddtoStream(strPDFMessage);

           

            //Add font to xRefs

            xRefs.Add(mPDF.Length);

            strPDFMessage="5 0 obj\n<</Type/Font/Subtype/Type1/BaseFont/Courier/Encoding/WinAnsiEncoding>>\nendobj\n";

            ConvertToByteAndAddtoStream(strPDFMessage);

                   

            //Add the catalog to xRefs

            xRefs.Add(mPDF.Length);

            strPDFMessage="6 0 obj\n<</Type/Catalog/Pages 4 0 R>>\nendobj\n";

            ConvertToByteAndAddtoStream(strPDFMessage);

                       

            //xRefs Entry

            streamStart=mPDF.Length;

            strPDFMessage="xref\n0 7\n0000000000 65535 f \n";

            for(int i=0;i<xRefs.Count;i++)

            {

                strPDFMessage+=xRefFormatting((long) xRefs[i])+" 00000 n \n";

            }

            ConvertToByteAndAddtoStream(strPDFMessage);

            //Trailer for the PDF

            strPDFMessage="trailer\n<<\n/Size "+ (xRefs.Count+1)+"\n/Root 6 0 R\n>>\n";

            ConvertToByteAndAddtoStream(strPDFMessage);

            //xRef location entry

            strPDFMessage="startxref\n" + streamStart+"\n%%EOF\n";

            ConvertToByteAndAddtoStream(strPDFMessage);

            //Write the PDF from Memory Stream to File Stream

            mPDF.WriteTo(pPDF.BaseStream);

            //Close the Stream

            mPDF.Close();

            pPDF.Close();

        }

    }

}
 

Add by : Huobazi (2005-9-03:07:01)