C#生成pdf的源代码

此博客展示了使用C#语言生成PDF文档的代码。定义了页面尺寸、边距、字体大小等参数,通过StreamWriter和MemoryStream进行操作,将字符串转换为字节并添加到流中,最终完成PDF文档头信息、描述、版本信息等内容的写入,生成PDF文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
//write  by  wenhui.org  
using  System;  
using  System.IO;  
using  System.Text;  
using  System.Collections;  
 
namespace  PDFGenerator  
{  
 
public  class  PDFGenerator  
{  
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/n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
 
xRefs.Add(mPDF.Length);  
strPDFMessage="1  0  obj/n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
strPDFMessage="<<  /Length  2  0  R  >>/n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
strPDFMessage="stream/n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
////////PDF文档描述  
streamStart=mPDF.Length;  
//字体  
strPDFMessage="BT/n/F0  "  +  fontSize  +"  Tf/n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
//PDF文档实体高度  
yPos  =  pageDepth  -  pageMargin;  
strPDFMessage=pageMargin  +  "  "  +  yPos  +"  Td/n"  ;  
ConvertToByteAndAddtoStream(strPDFMessage);  
strPDFMessage=  leadSize+"  TL/n"  ;  
ConvertToByteAndAddtoStream(strPDFMessage);  
 
//实体内容  
strPDFMessage=  "(http://www.wenhui.org)Tj/n"  ;  
ConvertToByteAndAddtoStream(strPDFMessage);  
strPDFMessage=  "ET/n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
streamEnd=mPDF.Length;  
 
streamLen=streamEnd-streamStart;  
strPDFMessage=  "endstream/nendobj/n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
//PDF文档的版本信息  
xRefs.Add(mPDF.Length);  
strPDFMessage="2  0  obj/n"+  streamLen  +  "/nendobj/n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
 
xRefs.Add(mPDF.Length);  
strPDFMessage="3  0  obj/n<</Type/Page/Parent  4  0  R/Contents  1  0  R>>/nendobj/n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
 
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);  
 
xRefs.Add(mPDF.Length);  
strPDFMessage="5  0  obj/n<</Type/Font/Subtype/Type1/BaseFont/Courier/Encoding/WinAnsiEncoding>>/nendobj/n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
 
xRefs.Add(mPDF.Length);  
strPDFMessage="6  0  obj/n<</Type/Catalog/Pages  4  0  R>>/nendobj/n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
 
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);  
strPDFMessage="trailer/n<</n/Size  "+  (xRefs.Count+1)+"/n/Root  6  0  R/n>>/n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
 
strPDFMessage="startxref/n"  +  streamStart+"/n%%EOF/n";  
ConvertToByteAndAddtoStream(strPDFMessage);  
mPDF.WriteTo(pPDF.BaseStream);  
 
mPDF.Close();  
pPDF.Close();  
}  
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值