利用ItextSharp产PDF完整操作
记得上回有写到用C#操作Excel(.net 4.0)
/// <summary>
/// 产生PDf
/// </summary>
/// <param name="strFileName">文件名称</param>
/// <param name="dt">数据源</param>
public void PDF(string strFileName, DataTable dt, string PrintName)
{
if (!Directory.Exists(AppConfigString.FilePath))
{
Directory.CreateDirectory(AppConfigString.FilePath);
}
string strPathTemp = AppConfigString.FilePath + DateTime.Now.ToString("yyyyMMddhhmmss") + ".pdf";
//零時的pdf地址,用于水印读取文件
string strPath = AppConfigString.FilePath + strFileName;//真正文件的位置
Document document = new Document(PageSize.A4, , , , );
FileStream stream = new FileStream(strPathTemp, FileMode.Create);
PdfWriter writer = PdfWriter.GetInstance(document, stream);
document.Footer = Foot();//页尾的函数,在open前定义
document.Open();
HeaderFooter head = new HeaderFooter(HeadTable(, PrintName), true);
//true为在页眉的右边生成一个页数,会影响到页眉的高度,在open后定义
//headTable为页眉的函数
head.Border = Rectangle.NO_BORDER;
document.Header = head;
//页眉第一页不会出现,第2页才会出现,所以此地直接在第一列加了一个表头
//页尾在第一页就会出现
document.Add(HeadTable(, PrintName));//第一頁表頭不自動添加
//主要数据的添加
int IRowCount = dt.Rows.Count;
int IColumnCount = dt.Columns.Count;
PdfPTable pdfTb = new PdfPTable(IColumnCount);
pdfTb.HeaderRows = ;//自動加表頭
for (int i = ; i < IRowCount; i++)
{
for (int j = ; j < IColumnCount; j++)
{
string value = dt.Rows[i][j].ToString();
Phrase phs = new Phrase(value, PdfFont.Font());
//此时把数据转为Phrase只是为了使用字体,不然中文不能显示
pdfTb.AddCell(phs);
}
}
document.Add(pdfTb);
document.Close();
writer.Close();
PDFWatermark(strPathTemp, strPath, , , PrintName);//为生成好的文件添加水印 }
上面为一段完整的使用过程,注释是我刚加的,比较详细了,说下面几个问题 1:页眉和页首 》页眉与页首都使用相同的类HeaderFooter,只是页眉是给 document.Header,页尾是给document.Footer 》页尾是在document.open前,页眉是在document.open后 》页眉第一页不会出现,第2页才会出现,所以此地直接在第一列加了一个表头。页尾在第一页就会出现。 2:页眉的制作方法 由于页眉不好制作,所以我选择直接先拼成PdfPTable,再把PdfPTable放到Phrase,再把Phrase放到HeaderFooter给页眉,这样就好操作些 这个是在百度知道上找到的思路,我就这样做了,呵呵... 下面为我制作页眉的方法,一些信息安全问题已换为XXXXX
/// <summary>
/// 產生表頭的數據
/// </summary>
/// <param name="IType">1:ID 2:Name 3:detali</param>
/// <returns></returns>
public Phrase HeadTable(int IType, string PrintName)
{
string strhead = "";
switch (IType)
{
case : strhead = "XXXXXXXXXXXXXXXXXXXX"; break;
case : strhead = "XXXXXXXXXXXXXXXXXXXX"; break;
case : strhead = "XXXXXXXXXXXXXXXXXXXX"; break;
}
Phrase phshead = new Phrase(strhead, PdfFont.Font());
Phrase phsjimi = new Phrase("XXXXXXXXXXXXXXXXXXXX ", PdfFont.Font()); Phrase phsPeople = new Phrase("XXXXXXXXXXXXXXXXXXXX" + PrintName + "XXXXXXXXXXXXXXXXXXXX" + PrintName, PdfFont.Font());
Phrase phsPage = new Phrase(" ", PdfFont.Font());
Phrase phsPrintDate = new Phrase("列印時間:" + DateTime.Now.ToString("yyyy/MM/dd hh:mm") + "\r\n Print Date:" + DateTime.Now.ToString("yyyy/MM/dd hh:mm"), PdfFont.Font());
PdfPCell pchead = new PdfPCell(phshead);
pchead.VerticalAlignment = ;
pchead.HorizontalAlignment = ;
PdfPCell pcjimi = new PdfPCell(phsjimi);
PdfPCell pcPeople = new PdfPCell(phsPeople);
PdfPCell pcPage = new PdfPCell(phsPage);
PdfPCell pcPrintDate = new PdfPCell(phsPrintDate);
PdfPCell pcnull = new PdfPCell();
pchead.Border = ;
pcjimi.Border = ;
pcPeople.Border = ;
pcPage.Border = ;
pcPrintDate.Border = ;
pcnull.Border = ;
pcPeople.PaddingBottom = ;
pcPrintDate.PaddingBottom = ;
Phrase phead = new Phrase();
PdfPTable thead = new PdfPTable();
thead.AddCell(pchead);
thead.AddCell(pcjimi);
thead.AddCell(pcnull);
thead.AddCell(pcPage);
thead.AddCell(pcPeople);
thead.AddCell(pcPrintDate);
thead.SetWidths(new float[] { PageSize.A4.Width, });
phead.Add(thead);
return phead; }
页尾的方法
/// <summary>
/// 页尾
/// </summary>
/// <returns></returns>
public HeaderFooter Foot()
{
string strFoot = @"XXXXXXXXXXXXXXXXXX";
Phrase pfoot = new Phrase(strFoot, PdfFont.Font());
HeaderFooter foot = new HeaderFooter(pfoot, false);
foot.Border = Rectangle.NO_BORDER;
return foot;
}
3:字体的问题 如果没有定义字体,汉字是不会出现的,下面是我定义的字体,使用的ITextSharp控件字体,当然也可以使用字体文件详情可查看http://winsystem.ctocio.com.cn/334/12194834.shtml
/// <summary>
/// 文字类型定义
/// </summary>
/// <param name="IType">返回文字类别</param>
/// <returns></returns>
public static Font Font(int IType)
{
BaseFont.AddToResourceSearch("iTextAsian.dll");
BaseFont.AddToResourceSearch("iTextAsianCmaps.dll");
BaseFont bf = BaseFont.CreateFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
//简体?繁体不能使用
//
Font font = new Font(bf);//普通文章
font.Size = ;
Font fontFoot = new Font(bf);//頁脚文字
fontFoot.Size = ;
fontFoot.Color = Color.RED;
Font fontNormal = new Font(bf);//正常文字
fontNormal.Size = ;
switch (IType)
{
case : return font;
case : return fontFoot;
case : return fontNormal;
default: return fontNormal;
}
}
4:主要内容的制作 根据数据源,利用PdfPTable和Phase等制作,块等我还没用会,主要是样式和定位没搞会下面的博客有在Asp.Net中操作PDF – iTextSharp -利用块,短语,段落添加文本的方法http://www.cnblogs.com/CareySon/archive/2011/11/03/2234625.html5:水印的添加
/// <summary>
/// 為生成的pdf添加水印
/// </summary>
/// <param name="inputfilepath"></param>
/// <param name="outputfilepath"></param>
/// <param name="top"></param>
/// <param name="left"></param>
/// <returns></returns>
public bool PDFWatermark(string inputfilepath, string outputfilepath, float top, float left, string strName)
{
PdfReader pdfReader = null;
PdfStamper pdfStamper = null;
try
{
pdfReader = new PdfReader(inputfilepath); int numberOfPages = pdfReader.NumberOfPages; iTextSharp.text.Rectangle psize = pdfReader.GetPageSize(); float width = psize.Width; float height = psize.Height; pdfStamper = new PdfStamper(pdfReader, new FileStream(outputfilepath, FileMode.Create)); PdfContentByte waterMarkContent; WatermarkCreater wmc = new WatermarkCreater();
Draw.Image image = wmc.GetImageByte(strName, AppConfigString.WaterMarkPath);
var img = Image.GetInstance(image, System.Drawing.Imaging.ImageFormat.Png);
if (left < )
{
left = width - image.Width + left;
}
img.SetAbsolutePosition(left, (height - image.Height) - top);
//每一页加水印,也可以设置某一页加水印
for (int i = ; i <= numberOfPages; i++)
{
waterMarkContent = pdfStamper.GetUnderContent(i); waterMarkContent.AddImage(img);
}
return true;
}
catch (Exception ex)
{
ex.Message.Trim();
return false;
}
finally
{ if (pdfStamper != null)
pdfStamper.Close(); if (pdfReader != null)
pdfReader.Close();
//把添加水印前的pdf文件刪除,保存最新的文件
if (File.Exists(inputfilepath))
{
File.Delete(inputfilepath);
}
} }
这就是我们为什么要用一个零时路径了,先把产出的pdf放到零时路径,用来产生水印的时候读取,生成水印文件后,再把零时文件删除即可其中的WatermarkCreater方法可以看我以前的博客,报表水印的产生http://www.cnblogs.com/xiaoshuai1992/p/waterMark.html,方法相同 至此可以达到客户的要求,但是一些样式的问题就需要大家仔细研究了,这就是我的实践过程,希望可以和大家一起学习了
利用ItextSharp产PDF完整操作的更多相关文章
- 使用ItextSharp产PDF完整操作
原文 使用ItextSharp产PDF完整操作 记得上回有写到用C#操作Excel(.net 4.0) 很多朋友说推荐用NPOI,的确,用微软自带的操作execl会有很大的问题.客户的主机不愿意安装e ...
- 利用NPOI组件产Excel完整操作
最终还是要使用NPOi了.刚开始做的是用com组件,发现如果本机不按照excel就不能使用,后来把其中一支改为了用Itextsharp产生pdf,但是还有几支批次要产生Excel,只能改用NPOI了. ...
- 利用Com组件产Excel完整操作
最近公司要批次产出报表,是利用控制台应用程序操作Excel,并设置各种样式. 在网上搜索此类的例子,但是感觉一些用法都已经发生了变化,我用的.net 4.0 ,Microsoft.Office.Int ...
- 利用ITextSharp导出PDF文件
最近项目中需要到处PDF文件,最后上网搜索了一下,发现ITextSharp比较好用,所以做了一个例子: public string ExportPDF() { //ITextSharp Usage / ...
- 利用ItextSharp 生成PDF文档改进版
导入的ItextSharp.dll一定要是较高的版本 数据库表结构 生成的PDF样式 代码: namespace WebPDF { public partial class _Default : Sy ...
- C# 利用ITextSharp导出PDF文件
最近项目中需要导出PDF文件,最后上网搜索了一下,发现ITextSharp比较好用,所以做了一个例子: public string ExportPDF() { //ITextSharp Usage / ...
- [ASP.NET]利用itextsharp将GridView汇出PDF档
原文 [ASP.NET]利用itextsharp将GridView汇出PDF档 最近在讨论区看到有人说itextsharp可以把网页变成PDF 小弟就去抓一下itextsharp来玩玩,先教大家最实用 ...
- 基于iTextSharp的PDF文档操作
公司是跨境电商,需要和各种物流打交道,需要把东西交给物流,让他们发到世界各地.其中需要物流公司提供一个运单号,来追踪货物到达哪里?! 最近在和DHL物流公司(应该是个大公司)对接,取运单号的方式是调用 ...
- winform利用itextsharp.dll实现图片文件转换PDF格式文件
1.利用itextsharp.dll实现单个图片文件转换为PDF格式文件, 可以使用以下类: void ConvertJPG2PDF(string jpgfile, string pdf) { var ...
随机推荐
- elasticsearch安装教程
目录 1 java8 环境 2 安装elasticsearch 3 安装kibana 4. 单服务器部署多个节点 参考: 1 java8 环境 elasticsearch需要安装java 8 环境,配 ...
- IIS相关服务和无法启动服务W3SVC错误提示
首先,打开“服务”查看下面的服务是否启动.(下面的两个服务就是跟IIS相关的服务,计算机(右键)->管理->服务和应用程序->服务) Windows Process Activati ...
- Android color颜色-色号总结
code时经常会用到颜色,然而对于像我这样的对于颜色不是很敏感的同学来说,就很痛苦了. 我想要某种颜色,但是又说不出来具体是哪种:这边总结了一下color种类以及色号. <?xml versio ...
- Python运算符及逻辑运算
基本运算符 运算符用于执行程序代码运算,会针对一个以上操作数项目来进行运算.例如:2+3,其操作数是2和3,而运算符则是“+”.在计算器语言中运算符大致可以分为5种类型:算术运算符.连接运算符.关系运 ...
- HDU 4669 Mutiples on a circle 动态规划
参考了官方题解给的方法: 对于处理循环,官方给了一种很巧妙的方法: #include <cstdio> #include <cstring> #include <cstd ...
- Access连接字符串
Access2007没有密码连接: <connectionStrings> <add name="myconn" connectionString="P ...
- Redis客户端命令
Redis客户端命令 Redis 命令用于在 redis 服务上执行操作. 要在 redis 服务上执行命令需要一个 redis 客户端.Redis 客户端在我们之前下载的的 redis 的安装包中. ...
- P2294 [HNOI2005]狡猾的商人
题目描述 输入输出格式 输入格式: 从文件input.txt中读入数据,文件第一行为一个正整数w,其中w < 100,表示有w组数据,即w个账本,需要你判断.每组数据的第一行为两个正整数n和m, ...
- 开头什么的肯定要自我介绍然后把它扔到置顶咯>_<~
大家嚎,我是NanoApe~ 现在高一,是个OIer.音游狗和一个爱着二次元的萌汉子妹子,欢迎前来勾搭>_<~ 最近就是要冲省队啦~~~~加油! 扣扣号:879006461 Weibo:伪 ...
- Spring Boot Executable jar/war 原理
spring boot executable jar/war spring boot里其实不仅可以直接以 java -jar demo.jar的方式启动,还可以把jar/war变为一个可以执行的脚本来 ...