iCeSnaker - Program rhapsody
谱写程序的狂想曲
posts - 49, comments - 261, trackbacks - 9, articles - 13
用C#实现生成PDF文档
Posted on 2004-11-06 23:16
iCeSnaker
阅读(1071)
评论(5)
编辑
收藏
所属分类:
C#
//
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();
}
}
}
Feedback
#1楼
回复
引用
查看
2004-11-06 23:23 by
unruledboy(灵感之源)
还是建议大家使用sf.net上的几个PDF开源组件:)
#2楼
[
楼主
]
回复
引用
查看
2004-11-06 23:31 by
iCeSnaker
Such as:sf的sharpPDF
#3楼
[
楼主
]
回复
引用
查看
2004-11-06 23:32 by
iCeSnaker
另:我发现回复的邮件提示竟然没有???
#4楼
回复
引用
查看
2004-11-07 12:40 by
XiaoHui
有的啊,起码我的前几天都有的.我用的hotmail.
#5楼
回复
引用
查看
2004-11-07 23:37 by
laye [未注册用户]
是不是不能转换汉字的文档啊?
社区
新闻
新用户注册
刷新评论列表
标题
姓名
主页
Email
(只有博主才能看到)
验证码
*
看不清,换一张
[
登录
][
注册
]
内容(请不要发表任何与政治相关的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
另存
打印
所属分类的其他文章:
·
用C#实现生成PDF文档
·
C# Delegate 简介
·
C#中为DataGrid添加下拉列表框
·
将sql server中的数据倒入Excel(c#)
·
在.net中轻松掌握Windows窗体间的数据交互(三)
·
在.net中轻松掌握Windows窗体间的数据交互(二)
·
在.net中轻松掌握Windows窗体间的数据交互(一)
·
C# 编码规范和编程好习惯
·
C#实现的基本算法
·
DataGrid资料
最新IT新闻:
·
Joost借道TOM在线 将正式进军中国
·
微软副总裁公开承认Vista存在问题
·
互联网DNS存在重大漏洞 黑客可能控制网络流量
·
Opera提出网络标准课程 发布标准教育倡议
·
SubSonic 2.1 版本发布
博客园新闻频道
博客园首页
社区
Powered by:
博客园
Copyright © iCeSnaker
导航
博客园
首页
新随笔
联系
订阅
管理
公告
微软提供的免费计数器
人的命运是像云彩一样随风飘流呢,还是说云彩它自己选择了飘流的方向呢,我还不太清楚,无论是那种情况,它们都可能会飘往同一个地方,但是如果选择了后者的话,人会朝着自己的人生目标而不断地努力,而拥有这种想法的人才是真正的强者。
MSN: iCeSnaker@msn.com
与我联系
发短消息
常用链接
我的随笔
我的空间
我的短信
我的评论
更多链接
我的参与
我的新闻
最新评论
我的标签
留言簿
(10)
给我留言
查看留言
随笔分类
.Net Framework
C#(18)
Database(2)
InfoPath(1)
Longhorn(1)
Misc(18)
Software Engineering(2)
Software Testing(5)
随笔档案
2005年1月 (3)
2004年12月 (2)
2004年11月 (3)
2004年10月 (2)
2004年9月 (5)
2004年8月 (5)
2004年7月 (20)
2004年6月 (4)
2004年4月 (5)
文章分类
Algorithm(7)
C#(6)
文章档案
2004年11月 (2)
2004年9月 (8)
2004年8月 (3)
Community&Personal
ASP.Net
CodeProject
CSDN
Eastasp(电子书)
Experts-exchange
GameRes文档中心
Microsoft下载中心
MSDN
NetYi(电子书)
Planet-Source-Code.com
S.SITE.ORG
SourceForge
Theserverside
搜索
最新评论
1. re: How-to guide: Connecting an InfoPath form to an Access database
In the Submit box in the Submitting Forms dialog box, click Submit to a database, and then click OK....
--leizhu
2. re: DataGrid资料
很好
--可vin
阅读排行榜
1. DataGrid资料(34093)
2. C#中为DataGrid添加下拉列表框(9586)
3. 发帖子谢谢JohnnyHu(7909)
4. 两个桌面主题(5464)
5. Longhorn 4074手记(4852)
评论排行榜
1. 发帖子谢谢JohnnyHu(32)
2. DataGrid资料(28)
3. 呐喊 -- 希望博客圆一直是世外桃源(22)
4. [讨论] 制作博客园年刊(19)
5. Longhorn 4074手记(19)