用C#实现生成PDF文档[转帖]

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
//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();
}
}
}

重读《C#风潮》:穿透技术表象的认知带宽修炼指南 编程学习的本质,是认知带宽与问题域匹配的过程。当初学者面对海量框架、API和术语时,真正制约进步的并非知识量,而是同时处理多层抽象(如语法→运行时→系统调用)的认知负荷能力。本文围绕‘认知带宽’与‘问题意识’两大核心热词展开,揭示技术判断力如何从真实系统交互中生长——它不依赖对最新工具的追逐,而源于对不变量的把握、对故障指纹的敏感、以及将抽象概念在真实场景中‘显形’的能力。适用于高校教学重构、转行入门者路径规划、以及工程师突破成长瓶颈的技术实践者。 阅读详情

相关推荐

C#实现生成PDF文档(附源码)

C#实现生成PDF文档(附源码) 收藏 //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 "; ConvertToByteAndAddtoStream(strPDFMessage); xRefs.Add(mPDF.Length); strPDFMessage="1 0 obj "; ConvertToByteAndAddtoStream(strPDFMessage); strPDFMessage="<> "; 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 <> 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<> >> "; ConvertToByteAndAddtoStream(strPDFMessage); strPDFMessage="/MediaBox [ 0 0 "+ pageWidth + " " + pageDepth + " ] >> endobj "; ConvertToByteAndAddtoStream(strPDFMessage); xRefs.Add(mPDF.Length); strPDFMessage="5 0 obj <> endobj "; ConvertToByteAndAddtoStream(strPDFMessage); xRefs.Add(mPDF.Length); strPDFMessage="6 0 obj <> 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 <> "; ConvertToByteAndAddtoStream(strPDFMessage); strPDFMessage="startxref " + streamStart+" %%EOF "; ConvertToByteAndAddtoStream(strPDFMessage); mPDF.WriteTo(pPDF.BaseStream); mPDF.Close(); pPDF.Close(); } } }

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 = 8

masky5310的专栏 676

c# 数据保存为PDF(三) (PdfSharp篇)

因为项目需求需要将数据导出存为PDF文档,方便客户使用。相比于TXT ,EXCEL等格式,导出PDF时可以减少字体乱码,文体格式不一样的痛点。在前面试用了Spire.PDF和Aspose.Pdf都可以导出我想要的格式的PDF,但这两个没有开源,正版都是要收费的,只好另寻他欢罢了。之后,寻寻觅觅,终于遇见PdfSharp,相处一段时间后,那便是日久生情了,陷进去了,从此就是它啦。

weixin_40314351的博客 1万+

C#生成PDF的方法

之前项目中是通过wkhtmltopdf渲染web页面生成pdf文件,这个方案一直不是很稳定,并且在不同的场景样式也常不一样,老需要调整。 今天研究了一下C#直接生成PDF的方案,还是比较简单的,整体方案如下: 通过WPF库生成XPS文件 通过PdfSharp将XPS文件转成PDF文件 首先看一下生成xps文件的代码。,代码如下: var fixedDoc = new FixedDocument(); var pageContent = new PageContent(); var fixedPage =

chinaherolts2008的博客 2224

C# 导出数据到PDF文档

最近因为客户有新的需求,需要将数据导入为PDF格式的,在网上看了很多,虽然不是很全面,但是还是要感谢他们,我把他们所写的代码都进行了整理,现在贴出来让大家参考。 using iTextSharp.text; using iTextSharp.text.pdf; //记住上面这两个DLL命名空间一定要引用才可以的                 Document document = new

5546

C#中操作Word文档

今天,在用c#语言开发一个word报表,在网上看到一些有用的文章,先转帖过来,自己屯着。以下来自http://hi.baidu.com/showlong/blog/item/2198fdfab75a35d4b48f31c0.html  参考:http://xb.hzu.edu.cn/qikan/manage/wenzhang/200906014.pdf      http://kb.cnblogs.com/a/1698486/   在当前项目开发过程中,客户有根据数据库数据生成WORD文档的需求,在和 同事

mengan123的专栏 1031

把InfoPath表单导出成PDF格式文档

转帖:http://www.bizsupportonline.net/infopath2007/export-infopath-2007-form-to-pdf.htm 问题:你现在已经有一个InfoPath表单,但是你想把它转化成PDF文档的格式。 解决方案: 你可以通过给表单添加按钮事件或是利用InfoPath2007的自带的另存为PDF OR XPS可以完...

weixin_34327761的博客 460

Flex开源组件——FlexReport (转帖

原文转自:http://www.cnblogs.com/wuhenke/archive/2009/12/03/1616583.html 在我的http://www.cnblogs.com/wuhenke/archive/2009/11/22/1608216.html 已经转载介绍了FlexReport开源组件,只是没有去研究和使用,今晚再次遇到它,才发现它功能如此强大。 FlexRepor

aijingyi的专栏 1137

[转帖]23个.NET开源项目

作者 Abel Avram 译者 王瑜珩 发布于 2009年7月3日 上午1时17分 Eric Nelson是微软技术的传道者,也是MSDN UK Flash的技术编辑,他编写了一个列表,列出23个UK开发人员推荐的.NET开源项目。微软的一些开源项目如ASP.NET MVC、DLR、IronRuby、IronPython、MEF等则未列入其中。 Eric尝试只包含一个测...

aipimao0605的博客 168

[转帖]保证你现在和未来不失业的十种IT关键技术

在当今的IT就业市场,有人欢喜有人忧。有人对目前的工作和薪水很满意,有人目前正面临着下岗,或者已经下岗……可能你是公司里唯一谙熟某项关键技术的高手,缺了你,公司便玩不转了;也可能你所在的公司对你现有的专业技能高枕无忧,认为你在任期内足以胜任公司给你的开发任务(当然就不会再花银子去培训你啦)。不要告诉我你们公司对原来用VB3开发的业务处理系统很满意,而你呢,也认为自己除了用C语言开发程序以...

andy87470093的博客 143

DataGridView

<br />转帖地址:http://www.cnblogs.com/peterzb/archive/2009/05/29/1491891.html<br /> <br />1.DataGridView实现课程表 testcontrol.rar<br /><br />2.DataGridView二维表头及单元格合并 DataGridView单元格合并和二维表头.rar  myMultiColHeaderDgv.rar<br /><br /><br /><br /><br />3.DataGridView单元

ct的专栏 571

winform 把窗口上的全部信息生成PDF文件显示

 using System; using System.IO; using System.Text; using System.Collections; namespace PDFGenerator  { //生成pdf的类 public class PDFGenerator {  //初始化,定义pdf文件大小 static float pageWid

Andrewniu的博客 3806

C++拷贝构造函数深度解析:从默认行为到深拷贝实战

在C++面向对象编程中,对象拷贝是一个基础且关键的概念,它直接关系到程序的正确性与性能。编译器在特定条件下会自动生成默认的拷贝构造函数,但其执行的浅拷贝机制在处理动态内存等资源时存在严重隐患,可能导致内存泄漏或程序崩溃。理解拷贝构造函数的调用时机与行为原理,是掌握C++资源管理(如RAII原则)和编写健壮代码的核心。在实际工程中,根据资源所有权需求选择深拷贝或浅拷贝至关重要,这涉及到对象独立性与数据安全。本文聚焦于C++拷贝构造函数,深入探讨其默认生成规则、深拷贝实现、常见调用场景(如函数传参和容器操作)以

weixin_34168880的博客 706

通过WebRequest获取远程网页图片

using System;using System.Collections;using System.ComponentModel;using System.Data;using System.Drawing;using System.Drawing.Drawing2D;using System.Web;using System.Web.SessionState;using System.Web.

微笑的黄捷 3280
上一篇: C#发送邮件
下一篇: 网络成瘾者智商低于常人 八大特征诊断是否上瘾
asthlon
博客等级 码龄23年 1粉丝 124原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值