使用 ItextSharp HTML生成Pdf(C#)
以前生成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#)的更多相关文章
- itextsharp图片生成pdf模糊问题解释
I forget to mention that I' am using itextsharp 5.0.2. It turned out that PDF DPI = 110, which means ...
- iTextSharp简单生成pdf和操作pdf添加水印
遇到需要导出页面到pdf,并添加pdf水印的业务.稍微研究了下,借阅网友的前车之鉴,经过使用可行之后的代码贴出来,做个记录,也供需要的网友借阅. public class PDFSetWaterMar ...
- iTextSharp生成pdf的一个简单例子
效果图: 参考:http://www.cnblogs.com/CareySon/archive/2011/11/09/2243496.html http://www.cnblogs.com/julyl ...
- ITextSharp用来生成 PDF 的一个组件
iTextSharp 是用来生成 PDF 的一个组件,在 1998 年夏天的时候,Bruno Lowagie ,iText 的创作者,参与了学校的一个项目,当时使用 HTML 来生成报告,但是,使用 ...
- C#使用itextsharp生成PDF文件
项目需求需要生成一个PDF文档,使用的是VS2010,ASP.NET. 网络上多次搜索没有自己想要的,于是硬着头皮到itextpdf官网看英文文档,按时完成任务,以实用为主,共享一下: 使用HTML文 ...
- itextsharp生成pdf后的直接打印问题
原文 itextsharp生成pdf后的直接打印问题 小弟这两天用itextsharp生成pdf文档,生成的pdf可以直接保存在指定路径的文件夹下,可是user不想保存,想要点一下button,就可以 ...
- 根据PDF模板生成PDF文件(基于iTextSharp)
根据PDF模板生成PDF文件,这里主要借助iTextSharp工具来完成.场景是这样的,假如要做一个电子协议,用过通过在线填写表单数据,然后系统根据用户填写的数据,生成电子档的协议.原理很简单,但是每 ...
- itextsharp利用模板生成pdf文件笔记
iTextSharp是一款开源的PDF操作类库,使用它可以快速的创建PDF文件. 中文参考网站:http://hardrock.cnblogs.com/ http://pdfhome.hope.com ...
- asp.net MVC设计模式中使用iTextSharp实现html字符串生成PDF文件
因个人需求,需要将html格式转换成PDF并加上水印图片.于是乎第一次接触这种需求的小菜鸟博主我,在某度搜索引擎上不断的查阅关键字资料.踩坑,终于有了一个相应的解决方案.以下是解决步骤,记录下来方便以 ...
随机推荐
- Number()、parseInt()、parseFloat()的区别
最近在一个项目中遇到:需要在前台页面用javascript去处理很数值的计算. 各种用法都有,为了统一且保证处理方式正确,特地总结了一下相关的数值转换的用法: 作用: Number():可以用于任何数 ...
- i++与++i陷阱
对于++i与i++编程必不可少,它们的区别:一般人只知道++i是先将i加一再进行其他操作,i++是先将i进行其他操作,再将其加一. 但是对于i++其中的执行过程,语言环境很关键.先来两个程序,看结果是 ...
- Prerender.io - 预渲染架构,提高AngularJS SEO
近些年来,越来越多的JavaScript框架(即AngularJS,BackboneJS,ReactJS)变得越来越流行.许多公司和开发人员使用这些JavaScript框架开发应用程序.这些框架有很多 ...
- JS入门(三)
数据的类型转换: 之前提到过,js中数据类型分两种, 基本数据类型string number boolean undefined null 复杂数据类型 对象 Date Array ...
- 【原】cookie小结
前记:前段时间搞一个活动,开发的时间被严重压缩,忙到飞起,以致于都没怎么写文章了,内疚. 2月份参加了一场面试,有一些关于cookie的问题回答的不是很好,所以这篇文章我们来对cooKie做一个探讨和 ...
- 百度地图API-控件
初始化百度地图的基础方法我们已经学会了,那么,想让我们的地图展示的更美观,体验度更好,自然离不开百度地图API给我们提供的丰富的插件.同时呢,我们还可以通过Control类自定义控件.那么,百度地图A ...
- SQL函数和SQL Server2008
1.绝对值 SQL:select abs(-1) value O:select abs(-1) value from dual 2.取整(大) S:select ceiling(-1.00 ...
- Spring Data操作Redis详解
Spring Data操作Redis详解 Redis是一种NOSQL数据库,Key-Value形式对数据进行存储,其中数据可以以内存形式存在,也可以持久化到文件系统.Spring data对Redis ...
- 元素类型为 "package" 的内容必须匹配 "(result-types?,interceptors?,default-interceptor-ref?
该错误为struts.xml内配置文件节点顺序错误. package内的元素节点必须按照以下顺序排放: result-types interceptors defau ...
- JDBC调用存储过程的例子
下面是我学到了Oracle存储过程,在这里跟大家简单的分享一下利用JDBC调用存储过程的例子: 废话就不啰嗦,现在就直接上机代码. 首先我利用的是Oracle中默认的 scott 数据库里的 emp员 ...