以前生成pdf的时候。因为生成的pdf数据是固定的,所以先做好pdf模板,动态的数据可以先用占位符

生成的时候。找到占位符坐标。把数据填充进去

优点:先做好模板。生成的pdf 表格、文、内容会好看一些

缺点:只能用作固定的数据生成。如果所有的数据都是动态从数据库查询的,就不适用

每次都需要找占位符的具体坐标

后来因为数据都是动态生成,这种需求没有办法达到,找了一些资料,html生成 pdf

优点:操作数据方便,把页面写好。帮组类 解析子路径获取该页面的html,然后将html代码生成到pdf

缺点:html需要些行内样式,不能定义宽度 (一开始做的时候。div我给定义个宽度。导出的数据一直都是空的 )

关键代码:

 if (System.IO.Directory.Exists(Server.MapPath(SystemConst.FILEPATH_PDF)) == false) { System.IO.Directory.CreateDirectory(Server.MapPath(SystemConst.FILEPATH_PDF)); }
//路径
var path = Server.MapPath(string.Format(SystemConst.FILEPATH_PDF + "{0}.pdf", model.UName.GetHashCode()));
//存在则删除
if (System.IO.File.Exists(path) == true) { System.IO.File.Delete(path); } var doc = new Document();
var writer = PdfWriter.GetInstance(doc, new FileStream(path, FileMode.Create));
//打开文档
doc.Open();
//解析子路径获取该页面的html
X.Component.Tools.WebClient wc = new Component.Tools.WebClient();
wc.Encoding = System.Text.Encoding.GetEncoding("utf-8");
//跳转到该页面去获取html值
string strUrl = Url.Action("Report", "QuestionnairesMgr", new { id = model.ID, flag = , cid = Request.QueryString["cid"] }, "http");
//给页面添加cookies值(避免需要验证是否登录)
wc.CookieContainer.Add(new Uri(strUrl), new Cookie("_t", X.Component.Tools.CookieHelper.GetCookieValue("_t")));
string htmlDoc = wc.GetHtml(strUrl);
AddHtml(doc, writer, htmlDoc); #region 将图片插入pdf中
//string chartimg = "http://localhost:8090/Assets/userfiles/imagescharts/" + string.Format("report-charts-{0}.png", id);
//Image img = iTextSharp.text.Image.GetInstance(chartimg);
//doc.Add(img);
#endregion //关闭文档
doc.Close();
//输出文件
return File(path, SystemConst.MIME_PDF, model.UName + ".pdf");
    /// <summary>
/// 将html代码生成到pdf
/// </summary>
/// <param name="doc"></param>
/// <param name="writer"></param>
/// <param name="_str"></param>
private void AddHtml(Document doc, PdfWriter writer, string _str)
{
byte[] array = System.Text.Encoding.UTF8.GetBytes(_str);
MemoryStream stream = new MemoryStream(array);
XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, stream, (Stream)null, System.Text.Encoding.UTF8, new SongFontFactory());
} /// <summary>
/// 重写iTextSharp字体(仅仅使用宋体)
/// </summary>
public class SongFontFactory : IFontProvider
{
public Font GetFont(String fontname, String encoding, Boolean embedded, float size, int style, BaseColor color)
{ BaseFont bf3 = BaseFont.CreateFont(@"c:\windows\fonts\simsun.ttc,1", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
Font fontContent = new Font(bf3, size, style, color);
return fontContent; }
public Boolean IsRegistered(String fontname)
{
return false;
}
} #endregion

需要用到的dll:

itextsharp.dll

itextsharp.xmlworker.dll

需要用的到帮组类:

WebClient.cs

使用 ItextSharp HTML生成Pdf(C#)的更多相关文章

  1. itextsharp图片生成pdf模糊问题解释

    I forget to mention that I' am using itextsharp 5.0.2. It turned out that PDF DPI = 110, which means ...

  2. iTextSharp简单生成pdf和操作pdf添加水印

    遇到需要导出页面到pdf,并添加pdf水印的业务.稍微研究了下,借阅网友的前车之鉴,经过使用可行之后的代码贴出来,做个记录,也供需要的网友借阅. public class PDFSetWaterMar ...

  3. iTextSharp生成pdf的一个简单例子

    效果图: 参考:http://www.cnblogs.com/CareySon/archive/2011/11/09/2243496.html http://www.cnblogs.com/julyl ...

  4. ITextSharp用来生成 PDF 的一个组件

    iTextSharp 是用来生成  PDF 的一个组件,在 1998 年夏天的时候,Bruno Lowagie ,iText 的创作者,参与了学校的一个项目,当时使用 HTML 来生成报告,但是,使用 ...

  5. C#使用itextsharp生成PDF文件

    项目需求需要生成一个PDF文档,使用的是VS2010,ASP.NET. 网络上多次搜索没有自己想要的,于是硬着头皮到itextpdf官网看英文文档,按时完成任务,以实用为主,共享一下: 使用HTML文 ...

  6. itextsharp生成pdf后的直接打印问题

    原文 itextsharp生成pdf后的直接打印问题 小弟这两天用itextsharp生成pdf文档,生成的pdf可以直接保存在指定路径的文件夹下,可是user不想保存,想要点一下button,就可以 ...

  7. 根据PDF模板生成PDF文件(基于iTextSharp)

    根据PDF模板生成PDF文件,这里主要借助iTextSharp工具来完成.场景是这样的,假如要做一个电子协议,用过通过在线填写表单数据,然后系统根据用户填写的数据,生成电子档的协议.原理很简单,但是每 ...

  8. itextsharp利用模板生成pdf文件笔记

    iTextSharp是一款开源的PDF操作类库,使用它可以快速的创建PDF文件. 中文参考网站:http://hardrock.cnblogs.com/ http://pdfhome.hope.com ...

  9. asp.net MVC设计模式中使用iTextSharp实现html字符串生成PDF文件

    因个人需求,需要将html格式转换成PDF并加上水印图片.于是乎第一次接触这种需求的小菜鸟博主我,在某度搜索引擎上不断的查阅关键字资料.踩坑,终于有了一个相应的解决方案.以下是解决步骤,记录下来方便以 ...

随机推荐

  1. Number()、parseInt()、parseFloat()的区别

    最近在一个项目中遇到:需要在前台页面用javascript去处理很数值的计算. 各种用法都有,为了统一且保证处理方式正确,特地总结了一下相关的数值转换的用法: 作用: Number():可以用于任何数 ...

  2. i++与++i陷阱

    对于++i与i++编程必不可少,它们的区别:一般人只知道++i是先将i加一再进行其他操作,i++是先将i进行其他操作,再将其加一. 但是对于i++其中的执行过程,语言环境很关键.先来两个程序,看结果是 ...

  3. Prerender.io - 预渲染架构,提高AngularJS SEO

    近些年来,越来越多的JavaScript框架(即AngularJS,BackboneJS,ReactJS)变得越来越流行.许多公司和开发人员使用这些JavaScript框架开发应用程序.这些框架有很多 ...

  4. JS入门(三)

    数据的类型转换: 之前提到过,js中数据类型分两种, 基本数据类型string  number   boolean  undefined  null 复杂数据类型 对象   Date   Array ...

  5. 【原】cookie小结

    前记:前段时间搞一个活动,开发的时间被严重压缩,忙到飞起,以致于都没怎么写文章了,内疚. 2月份参加了一场面试,有一些关于cookie的问题回答的不是很好,所以这篇文章我们来对cooKie做一个探讨和 ...

  6. 百度地图API-控件

    初始化百度地图的基础方法我们已经学会了,那么,想让我们的地图展示的更美观,体验度更好,自然离不开百度地图API给我们提供的丰富的插件.同时呢,我们还可以通过Control类自定义控件.那么,百度地图A ...

  7. SQL函数和SQL Server2008

    1.绝对值   SQL:select abs(-1) value  O:select abs(-1) value from dual  2.取整(大)   S:select ceiling(-1.00 ...

  8. Spring Data操作Redis详解

    Spring Data操作Redis详解 Redis是一种NOSQL数据库,Key-Value形式对数据进行存储,其中数据可以以内存形式存在,也可以持久化到文件系统.Spring data对Redis ...

  9. 元素类型为 "package" 的内容必须匹配 "(result-types?,interceptors?,default-interceptor-ref?

    该错误为struts.xml内配置文件节点顺序错误. package内的元素节点必须按照以下顺序排放:  result-types         interceptors         defau ...

  10. JDBC调用存储过程的例子

    下面是我学到了Oracle存储过程,在这里跟大家简单的分享一下利用JDBC调用存储过程的例子: 废话就不啰嗦,现在就直接上机代码. 首先我利用的是Oracle中默认的 scott 数据库里的 emp员 ...