(一). 功能
创建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
(三). 示例代码下载
本文介绍了一个简单的.NET程序,用于创建包含基本文本内容的PDF文件。该程序通过直接编写PDF格式的字节到内存流中来构造PDF文档,并最终将生成的PDF写入磁盘。
4174

被折叠的 条评论
为什么被折叠?



