用C#实现生成PDF文档(原码)

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 ";
            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.wenhui.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[i]) + " 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();
        }

    }

}
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值