转载:Asp.net 2.0 用C# 创建 PDF文件[引用] (示例代码下载)
原文:http://blog.csdn.net/ChengKing/archive/2006/12/21/1452134.aspx
(一). 功能
(一). 功能
创建PDF文件
(二). 代码
1
using System;
2
using System.Data;
3
using System.Configuration;
4
using System.Web;
5
using System.Web.Security;
6
using System.Web.UI;
7
using System.Web.UI.WebControls;
8
using System.Web.UI.WebControls.WebParts;
9
using System.Web.UI.HtmlControls;
10
using System.IO;
11
using System.Text;
12
using System.Collections;
13![]()
14
public partial class _Default : System.Web.UI.Page
15
{
16
static float pageWidth = 594.0f;
17
static float pageDepth = 828.0f;
18
static float pageMargin = 30.0f;
19
static float fontSize = 10.0f;
20
static float leadSize = 10.0f;
21![]()
22
//指定要生成PDF文件的路径
23
static StreamWriter pPDF = new StreamWriter("E:\\net\\WebSites\\Create_PDF_File\\test.pdf");//指定生成的路径
24
25
static MemoryStream mPDF = new MemoryStream();
26![]()
27
//Convert the Text Data to PDF format and write back to
28
//Memory Stream
29
static void ConvertToByteAndAddtoStream(string strMsg)
30
{
31
Byte[] buffer = null;
32
buffer = ASCIIEncoding.ASCII.GetBytes(strMsg);
33
mPDF.Write(buffer, 0, buffer.Length);
34
buffer = null;
35
}
36![]()
37
//Format the data length in xRef Format
38
static string xRefFormatting(long xValue)
39
{
40
string strMsg = xValue.ToString();
41
int iLen = strMsg.Length;
42
if (iLen < 10)
43
{
44
StringBuilder s = new StringBuilder();
45
int i = 10 - iLen;
46
s.Append('0', i);
47
strMsg = s.ToString() + strMsg;
48
}
49
return strMsg;
50
}
51
protected void Page_Load(object sender, EventArgs e)
52
{
53![]()
54
}
55
protected void Button1_Click(object sender, EventArgs e)
56
{
57
//Create a ArrayList for xRefs of PDF Document
58
ArrayList xRefs = new ArrayList();
59
float yPos = 0f;
60
long streamStart = 0;
61
long streamEnd = 0;
62
long streamLen = 0;
63
string strPDFMessage = null;
64
//PDF Header Message
65
strPDFMessage = "%PDF-1.1\n";
66
ConvertToByteAndAddtoStream(strPDFMessage);
67![]()
68
//ID 1 For Containt
69
//ID 2 For Length of the Stream
70
//write the Text
71![]()
72
//1> Start a new Page
73
xRefs.Add(mPDF.Length);
74
strPDFMessage = "1 0 obj\n";
75
ConvertToByteAndAddtoStream(strPDFMessage);
76
strPDFMessage = "<< /Length 2 0 R >>\n";
77
ConvertToByteAndAddtoStream(strPDFMessage);
78
strPDFMessage = "stream\n";
79
ConvertToByteAndAddtoStream(strPDFMessage);
80![]()
81
//Get the start of the stream
82
streamStart = mPDF.Length;
83
strPDFMessage = "BT\n/F0 " + fontSize + " Tf\n";
84
ConvertToByteAndAddtoStream(strPDFMessage);
85
yPos = pageDepth - pageMargin;
86
strPDFMessage = pageMargin + " " + yPos + " Td\n";
87
ConvertToByteAndAddtoStream(strPDFMessage);
88
strPDFMessage = leadSize + " TL\n";
89
ConvertToByteAndAddtoStream(strPDFMessage);
90![]()
91
//Add the text data to the PDF memory stream
92
strPDFMessage = "(Do a test)Tj\n";
93
ConvertToByteAndAddtoStream(strPDFMessage);
94
strPDFMessage = "ET\n";
95
ConvertToByteAndAddtoStream(strPDFMessage);
96
//Get the End of the stream
97
streamEnd = mPDF.Length;
98
//Get the Length of the stream
99
streamLen = streamEnd - streamStart;
100
strPDFMessage = "endstream\nendobj\n";
101
ConvertToByteAndAddtoStream(strPDFMessage);
102![]()
103
//Add 2 object to xRef
104
xRefs.Add(mPDF.Length);
105
strPDFMessage = "2 0 obj\n" + streamLen + "\nendobj\n";
106
ConvertToByteAndAddtoStream(strPDFMessage);
107![]()
108
//Add Page to xRefs
109
xRefs.Add(mPDF.Length);
110
strPDFMessage = "3 0 obj\n<</Type/Page/Parent 4 0 R/Contents 1 0 R>>\nendobj\n";
111
ConvertToByteAndAddtoStream(strPDFMessage);
112![]()
113
//Build the Pages
114
xRefs.Add(mPDF.Length);
115
strPDFMessage = "4 0 obj\n<</Type /Pages /Count 1\n";
116
ConvertToByteAndAddtoStream(strPDFMessage);
117
strPDFMessage = "/Kids[\n3 0 R\n]\n";
118
ConvertToByteAndAddtoStream(strPDFMessage);
119
strPDFMessage = "/Resources<</ProcSet[/PDF/Text]/Font<</F0 5 0 R>> >>\n";
120
ConvertToByteAndAddtoStream(strPDFMessage);
121
strPDFMessage = "/MediaBox [ 0 0 " + pageWidth + " " + pageDepth + " ]\n>>\nendobj\n";
122
ConvertToByteAndAddtoStream(strPDFMessage);
123![]()
124
//Add font to xRefs
125
xRefs.Add(mPDF.Length);
126
strPDFMessage = "5 0 obj\n<</Type/Font/Subtype/Type1/BaseFont/Courier/Encoding/WinAnsiEncoding>>\nendobj\n";
127
ConvertToByteAndAddtoStream(strPDFMessage);
128![]()
129
//Add the catalog to xRefs
130
xRefs.Add(mPDF.Length);
131
strPDFMessage = "6 0 obj\n<</Type/Catalog/Pages 4 0 R>>\nendobj\n";
132
ConvertToByteAndAddtoStream(strPDFMessage);
133![]()
134
//xRefs Entry
135
streamStart = mPDF.Length;
136
strPDFMessage = "xref\n0 7\n0000000000 65535 f \n";
137
for (int i = 0; i < xRefs.Count; i++)
138
{
139
strPDFMessage += xRefFormatting((long)xRefs[i]) + " 00000 n \n";
140
}
141
ConvertToByteAndAddtoStream(strPDFMessage);
142
//Trailer for the PDF
143
strPDFMessage = "trailer\n<<\n/Size " + (xRefs.Count + 1) + "\n/Root 6 0 R\n>>\n";
144
ConvertToByteAndAddtoStream(strPDFMessage);
145
//xRef location entry
146
strPDFMessage = "startxref\n" + streamStart + "\n%%EOF\n";
147
ConvertToByteAndAddtoStream(strPDFMessage);
148
//Write the PDF from Memory Stream to File Stream
149
mPDF.WriteTo(pPDF.BaseStream);
150
//Close the Stream
151
mPDF.Close();
152
pPDF.Close();
153
}
154
}
155![]()
using System;2
using System.Data;3
using System.Configuration;4
using System.Web;5
using System.Web.Security;6
using System.Web.UI;7
using System.Web.UI.WebControls;8
using System.Web.UI.WebControls.WebParts;9
using System.Web.UI.HtmlControls;10
using System.IO;11
using System.Text;12
using System.Collections;13

14
public partial class _Default : System.Web.UI.Page 15
{16
static float pageWidth = 594.0f;17
static float pageDepth = 828.0f;18
static float pageMargin = 30.0f;19
static float fontSize = 10.0f;20
static float leadSize = 10.0f;21

22
//指定要生成PDF文件的路径 23
static StreamWriter pPDF = new StreamWriter("E:\\net\\WebSites\\Create_PDF_File\\test.pdf");//指定生成的路径24
25
static MemoryStream mPDF = new MemoryStream();26

27
//Convert the Text Data to PDF format and write back to28
//Memory Stream29
static void ConvertToByteAndAddtoStream(string strMsg)30
{31
Byte[] buffer = null;32
buffer = ASCIIEncoding.ASCII.GetBytes(strMsg);33
mPDF.Write(buffer, 0, buffer.Length);34
buffer = null;35
}36

37
//Format the data length in xRef Format38
static string xRefFormatting(long xValue)39
{40
string strMsg = xValue.ToString();41
int iLen = strMsg.Length;42
if (iLen < 10)43
{44
StringBuilder s = new StringBuilder(); 45
int i = 10 - iLen;46
s.Append('0', i);47
strMsg = s.ToString() + strMsg;48
}49
return strMsg;50
}51
protected void Page_Load(object sender, EventArgs e)52
{53

54
}55
protected void Button1_Click(object sender, EventArgs e)56
{57
//Create a ArrayList for xRefs of PDF Document58
ArrayList xRefs = new ArrayList(); 59
float yPos = 0f;60
long streamStart = 0;61
long streamEnd = 0;62
long streamLen = 0;63
string strPDFMessage = null;64
//PDF Header Message65
strPDFMessage = "%PDF-1.1\n";66
ConvertToByteAndAddtoStream(strPDFMessage);67

68
//ID 1 For Containt69
//ID 2 For Length of the Stream70
//write the Text71

72
//1> Start a new Page73
xRefs.Add(mPDF.Length);74
strPDFMessage = "1 0 obj\n";75
ConvertToByteAndAddtoStream(strPDFMessage);76
strPDFMessage = "<< /Length 2 0 R >>\n";77
ConvertToByteAndAddtoStream(strPDFMessage);78
strPDFMessage = "stream\n";79
ConvertToByteAndAddtoStream(strPDFMessage);80

81
//Get the start of the stream82
streamStart = mPDF.Length;83
strPDFMessage = "BT\n/F0 " + fontSize + " Tf\n";84
ConvertToByteAndAddtoStream(strPDFMessage);85
yPos = pageDepth - pageMargin;86
strPDFMessage = pageMargin + " " + yPos + " Td\n";87
ConvertToByteAndAddtoStream(strPDFMessage);88
strPDFMessage = leadSize + " TL\n";89
ConvertToByteAndAddtoStream(strPDFMessage);90

91
//Add the text data to the PDF memory stream92
strPDFMessage = "(Do a test)Tj\n";93
ConvertToByteAndAddtoStream(strPDFMessage);94
strPDFMessage = "ET\n";95
ConvertToByteAndAddtoStream(strPDFMessage);96
//Get the End of the stream97
streamEnd = mPDF.Length;98
//Get the Length of the stream99
streamLen = streamEnd - streamStart;100
strPDFMessage = "endstream\nendobj\n";101
ConvertToByteAndAddtoStream(strPDFMessage);102

103
//Add 2 object to xRef104
xRefs.Add(mPDF.Length);105
strPDFMessage = "2 0 obj\n" + streamLen + "\nendobj\n";106
ConvertToByteAndAddtoStream(strPDFMessage);107

108
//Add Page to xRefs109
xRefs.Add(mPDF.Length);110
strPDFMessage = "3 0 obj\n<</Type/Page/Parent 4 0 R/Contents 1 0 R>>\nendobj\n";111
ConvertToByteAndAddtoStream(strPDFMessage);112

113
//Build the Pages114
xRefs.Add(mPDF.Length);115
strPDFMessage = "4 0 obj\n<</Type /Pages /Count 1\n";116
ConvertToByteAndAddtoStream(strPDFMessage);117
strPDFMessage = "/Kids[\n3 0 R\n]\n";118
ConvertToByteAndAddtoStream(strPDFMessage);119
strPDFMessage = "/Resources<</ProcSet[/PDF/Text]/Font<</F0 5 0 R>> >>\n";120
ConvertToByteAndAddtoStream(strPDFMessage);121
strPDFMessage = "/MediaBox [ 0 0 " + pageWidth + " " + pageDepth + " ]\n>>\nendobj\n";122
ConvertToByteAndAddtoStream(strPDFMessage);123

124
//Add font to xRefs125
xRefs.Add(mPDF.Length);126
strPDFMessage = "5 0 obj\n<</Type/Font/Subtype/Type1/BaseFont/Courier/Encoding/WinAnsiEncoding>>\nendobj\n";127
ConvertToByteAndAddtoStream(strPDFMessage);128

129
//Add the catalog to xRefs130
xRefs.Add(mPDF.Length);131
strPDFMessage = "6 0 obj\n<</Type/Catalog/Pages 4 0 R>>\nendobj\n";132
ConvertToByteAndAddtoStream(strPDFMessage);133

134
//xRefs Entry 135
streamStart = mPDF.Length;136
strPDFMessage = "xref\n0 7\n0000000000 65535 f \n";137
for (int i = 0; i < xRefs.Count; i++)138
{139
strPDFMessage += xRefFormatting((long)xRefs[i]) + " 00000 n \n";140
}141
ConvertToByteAndAddtoStream(strPDFMessage);142
//Trailer for the PDF143
strPDFMessage = "trailer\n<<\n/Size " + (xRefs.Count + 1) + "\n/Root 6 0 R\n>>\n";144
ConvertToByteAndAddtoStream(strPDFMessage);145
//xRef location entry146
strPDFMessage = "startxref\n" + streamStart + "\n%%EOF\n";147
ConvertToByteAndAddtoStream(strPDFMessage);148
//Write the PDF from Memory Stream to File Stream149
mPDF.WriteTo(pPDF.BaseStream);150
//Close the Stream151
mPDF.Close();152
pPDF.Close();153
}154
}155

(三). 示例代码下载
[本文核心代码为引用,方便查看用]


浙公网安备 33010602011771号