using
System.Drawing;
using
System.Collections;
using
System.ComponentModel;
using
System.Windows.Forms;
using
System.Data;
using
System.IO;
using
System.Text;
namespace
PDFGenerator
{
/**//// <summary>
/// Form1 的摘要说明。
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
/**//// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;
public Form1()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();
//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}

/**//// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null) 
{
components.Dispose();
}
}
base.Dispose( disposing );
}

Windows 窗体设计器生成的代码#region Windows 窗体设计器生成的代码
/**//// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.Size = new System.Drawing.Size(300,300);
this.Text = "Form1";
}
#endregion

static float pageWidth = 594.0f;
static float pageDepth = 828.0f;
static float pageMargin = 30.0f;
static float fontSize = 20.0f;
static float leadSize = 10.0f; 

static StreamWriter pPDF=new StreamWriter("E:/myPDF.pdf"); 
static MemoryStream mPDF= new MemoryStream(); 
static void ConvertToByteAndAddtoStream(string strMsg) 
{
Byte[] buffer=null;
buffer=ASCIIEncoding.ASCII.GetBytes(strMsg);
mPDF.Write(buffer,0,buffer.Length);
buffer=null;
} 
static string xRefFormatting(long xValue) 
{
string strMsg =xValue.ToString();
int iLen=strMsg.Length;
if (iLen<10) 
{
StringBuilder s=new StringBuilder();
int i=10-iLen;
s.Append('0',i);
strMsg=s.ToString() + strMsg;
}
return strMsg;
} 
static void Main(string[] args) 
{
ArrayList xRefs=new ArrayList();
//Byte[] buffer=null;
float yPos =0f;
long streamStart=0;
long streamEnd=0;
long streamLen =0;
string strPDFMessage=null;
//PDF文档头信息
strPDFMessage="%PDF-1.1 ";
ConvertToByteAndAddtoStream(strPDFMessage); 
xRefs.Add(mPDF.Length);
strPDFMessage="1 0 obj ";
ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage="<< /Length 2 0 R >> ";
ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage="stream ";
ConvertToByteAndAddtoStream(strPDFMessage); 
/**/////////PDF文档描述
streamStart=mPDF.Length;
//字体
strPDFMessage="BT /F0 " + fontSize +" Tf ";
ConvertToByteAndAddtoStream(strPDFMessage);
//PDF文档实体高度
yPos = pageDepth - pageMargin;
strPDFMessage=pageMargin + " " + yPos +" Td " ;
ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage= leadSize+" TL " ;
ConvertToByteAndAddtoStream(strPDFMessage); 
//实体内容
strPDFMessage= "(http://www.wen***.org)Tj " ;
ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage= "ET ";
ConvertToByteAndAddtoStream(strPDFMessage);
streamEnd=mPDF.Length; 
streamLen=streamEnd-streamStart;
strPDFMessage= "endstream endobj ";
ConvertToByteAndAddtoStream(strPDFMessage);
//PDF文档的版本信息
xRefs.Add(mPDF.Length);
strPDFMessage="2 0 obj "+ streamLen + " endobj ";
ConvertToByteAndAddtoStream(strPDFMessage); 
xRefs.Add(mPDF.Length);
strPDFMessage="3 0 obj <</Type/Page/Parent 4 0 R/Contents 1 0 R>> endobj ";
ConvertToByteAndAddtoStream(strPDFMessage); 
xRefs.Add(mPDF.Length);
strPDFMessage="4 0 obj <</Type /Pages /Count 1 ";
ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage="/Kids[ 3 0 R ] ";
ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage="/Resources<</ProcSet[/PDF/Text]/Font<</F0 5 0 R>> >> ";
ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage="/MediaBox [ 0 0 "+ pageWidth + " " + pageDepth + " ] >> endobj ";
ConvertToByteAndAddtoStream(strPDFMessage); 
xRefs.Add(mPDF.Length);
strPDFMessage="5 0 obj <</Type/Font/Subtype/Type1/BaseFont/Courier/Encoding/WinAnsiEncoding>> endobj ";
ConvertToByteAndAddtoStream(strPDFMessage); 
xRefs.Add(mPDF.Length);
strPDFMessage="6 0 obj <</Type/Catalog/Pages 4 0 R>> endobj ";
ConvertToByteAndAddtoStream(strPDFMessage); 
streamStart=mPDF.Length;
strPDFMessage="xref 0 7 0000000000 65535 f ";
for(int i=0;i<xRefs.Count;i++) 
{
strPDFMessage+=xRefFormatting((long) xRefs)+" 00000 n ";
}
ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage="trailer << /Size "+ (xRefs.Count+1)+" /Root 6 0 R >> ";
ConvertToByteAndAddtoStream(strPDFMessage); 
strPDFMessage="startxref " + streamStart+" %%EOF ";
ConvertToByteAndAddtoStream(strPDFMessage);
mPDF.WriteTo(pPDF.BaseStream); 
mPDF.Close();
pPDF.Close();
}
}//form
}
此博客展示了使用C#生成PDF文档的代码。通过引入多个命名空间,定义了页面尺寸、字体大小等参数,编写了将字符串转换为字节并添加到流的方法,以及处理交叉引用格式的方法,最终完成PDF文档头信息、描述、版本信息等内容的生成。





