基于iTextSharp的PDF操作(PDF打印,PDF下载)

准备

1. iTextSharp的简介

iTextSharp是一个移植于java平台的iText项目,被封装成c#的组件来用于C#生成PDF文档,目前,也有不少操作PDF的类库,(国产的有福盺的,免费试用,用于商业用途收费)但是功能普遍没有iText强大,而且使用没有iText广泛。还有他就是开源的。目前比较新的是5.5版本的。

2. 使用工具

硬件:

PC机:一台

软件:

Windows操作系统

Isual studio 2013  (可以是任意版本)

.Net frameWork 4.5  (可以是任意版本)

iTextSharp 5.5  可以到官网下载(iTextSharp)http://sourceforge.net/projects/itextsharp/

下载后,解压得到iTextSharp.dll文件

基本知识

1. 主要对象

1).Document 对象:

Document 对象主要用于操作页面的大小,就是页面的尺寸。页面的尺寸一般有以下几种:

A0-A10, LEGAL, LETTER, HALFLETTER, _11x17, LEDGER, NOTE, B0-B5, ARCH_A-ARCH_E, FLSA 和 FLSE,例如,需要创建一个A4纸张大小的PDF文档:

Document document = new Document(PageSize.A4);

这个文档漠然是纵向的,如果满足不了你横向文档的需要,可以加上rotate属性。

有的时候,我们需要生成特定颜色的,特定大小的PDF文档,可以使用下面的方法

Rectangle pageSize = new Rectangle(120, 520);     //120*520规格

pageSize.BackgroundColor = new Color(0xFF, 0xFF, 0xDE);   //背景色

Document document = new Document(pageSize);          //新建Documen对象

页边距:

Document document = new Document(PageSize.A5, 36, 72, 108, 180);//默认单位为磅。

2).PdfWriter对象:

创建了Documen对象后,我们就要对PDF文档进行操作(合并,删除,更改,添加内容等)。这个时候必须创建PdfWriter对象实例。PdfWriter类对对象继承自iTextSharp.text.DocWriter抽象类。如果需要创建Ext文件,则需要iTextSharp.text.TeX.TeXWriter这个类。

//注意FileMode-Create表示如果目标文件不存在,则创建,如果已存在,则覆盖。

PdfWriter writer = PdfWriter.GetInstance(document,

new FileStream(strFileName, FileMode.Create));

如代码所示,创建成功了一个PDF的PdfWriter实例。 FileMode.Create:表示如果目标文件不存在,则创建,如果已存在,则覆盖。FileMode.New 表示新建,FileMode.Append表示追加,如果你是操作PDF模版,你可以使用Append。

PdfPTable对象,

我们需要用到的属性:

/// <param name="sdr_Context">List</param>

/// <param name="title">标题名称</param>

/// <param name="fontpath_Title">标题字体路径</param>

/// <param name="fontsize_Title">标题字体大小</param>

/// <param name="fontStyle_Title">标题样式</param>

/// <param name="fontColor_Title">标题颜色</param>

/// <param name="fontpath_Col">列头字体路径</param>

/// <param name="fontsize_Col">列头字体大小</param>

/// <param name="fontStyle_Col">列头字体样式</param>

/// <param name="fontColor_Col">列头字体颜色</param>

/// <param name="col_Width">表格总宽度</param>

/// <param name="arr_Width">每列的宽度</param>

/// <param name="pdf_Filename">在服务器端保存PDF时的文件名</param>

/// <param name="FontPath">正文字体路径</param>

/// <param name="FontSize">正文字体大小</param>

///  <param name="fontStyle_Context">正文字体样式</param>

///  <param name="fontColor_Context">正文字体颜色</param>

方法(长长的,可以封装成对象):

public void exp_Pdf( List<Customer> sdr_Context, string title, string fontpath_Title, float fontsize_Title, int fontStyle_Title,

BaseColor fontColor_Title, string fontpath_Col, float fontsize_Col, int fontStyle_Col, BaseColor fontColor_Col, float col_Width,

int[] arr_Width, string pdf_Filename, string FontPath, float FontSize, int fontStyle_Context, BaseColor fontColor_Context)

2.基本属性设置

字体颜色等

//在服务器端保存PDF时的文件名

string strFileName = pdf_Filename + ".pdf";

//初始化一个目标文档类

Document document = new Document(PageSize.A4.Rotate(), 0, 0, 10, 10);

//调用PDF的写入方法流

//注意FileMode-Create表示如果目标文件不存在,则创建,如果已存在,则覆盖。

PdfWriter writer = PdfWriter.GetInstance(document,

new FileStream(strFileName, FileMode.Create));

//标题字体

BaseFont basefont_Title = BaseFont.CreateFont(

fontpath_Title,

BaseFont.IDENTITY_H,

BaseFont.NOT_EMBEDDED);

Font font_Title = new Font(basefont_Title, fontsize_Title, fontStyle_Title, fontColor_Title);

//表格列字体

BaseFont basefont_Col = BaseFont.CreateFont(

fontpath_Col,

BaseFont.IDENTITY_H,

BaseFont.NOT_EMBEDDED);

Font font_Col = new Font(basefont_Col, fontsize_Col, fontStyle_Col, fontColor_Col);

//正文字体

BaseFont basefont_Context = BaseFont.CreateFont(

FontPath,

BaseFont.IDENTITY_H,

BaseFont.NOT_EMBEDDED);

Font font_Context = new Font(basefont_Context, FontSize, fontStyle_Context, fontColor_Context);

3.打开文档

//打开目标文档对象document.PageNumber

document.Open();

//添加标题

Paragraph p_Title = new Paragraph(title, font_Title);

p_Title.Alignment = Element.ALIGN_CENTER;

p_Title.IndentationLeft = 200;

p_Title.PaddingTop = 300;

p_Title.ExtraParagraphSpace = 300;

p_Title.SpacingAfter = 100;

document.Add(p_Title);

4.生成表格

//根据数据表内容创建一个PDF格式的表

PdfPTable table = new PdfPTable(5);         //1

table.TotalWidth = col_Width;//表格总宽度

table.LockedWidth = true;//锁定宽度

table.SetWidths(arr_Width);//设置每列宽度

//构建列头

//设置列头背景色

table.DefaultCell.BackgroundColor = iTextSharp.text.BaseColor.LIGHT_GRAY;

//设置列头文字水平、垂直居中

table.DefaultCell.HorizontalAlignment = PdfPCell.ALIGN_CENTER;

table.DefaultCell.VerticalAlignment = PdfPCell.ALIGN_MIDDLE;

// 告诉程序这行是表头,这样页数大于1时程序会自动为你加上表头。

table.HeaderRows = 1;

table.AddCell(new Phrase("222222", font_Col));

table.AddCell(new Phrase("222222", font_Col));

table.AddCell(new Phrase("222222", font_Col));

table.AddCell(new Phrase("222222", font_Col));

table.AddCell(new Phrase("222222", font_Col));

// 添加数据

//设置标题靠左居中

table.DefaultCell.HorizontalAlignment = PdfPCell.ALIGN_LEFT;

// 设置表体背景色

table.DefaultCell.BackgroundColor = BaseColor.WHITE;

for (int i = 0; i < sdr_Context.Count(); i++)

{

table.AddCell(new Phrase(sdr_Context[i].Id.ToString(), font_Context));

table.AddCell(new Phrase(sdr_Context[i].Name, font_Context));

table.AddCell(new Phrase(sdr_Context[i].Place, font_Context));

table.AddCell(new Phrase(sdr_Context[i].Address, font_Context));

table.AddCell(new Phrase(sdr_Context[i].Address, font_Context));

}

5.把表格加进文档

document.Add(table);

6.关闭文档

//关闭目标文件

document.Close();

//关闭写入流

writer.Close();

7.直接打印预览

MemoryStream PDFData = new MemoryStream(data);

System.Web.HttpContext.Current.Response.Clear();

System.Web.HttpContext.Current.Response.ClearContent();

System.Web.HttpContext.Current.Response.ClearHeaders();

System.Web.HttpContext.Current.Response.ContentType = "application/pdf";

System.Web.HttpContext.Current.Response.Charset = string.Empty;

System.Web.HttpContext.Current.Response.Cache.SetCacheability(System.Web.HttpCacheability.Public);

System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition",

"inline; filename=" + strFileName.Replace(" ", "").Replace(":", "-") + ".pdf");

System.Web.HttpContext.Current.Response.OutputStream.Write(PDFData.ToArray(), 0, PDFData.ToArray().Length);

System.Web.HttpContext.Current.Response.OutputStream.Flush();

System.Web.HttpContext.Current.Response.OutputStream.Close();

8.如果需要下载

try

{

//这里是你文件在项目中的位置,根目录下就这么写

String FullFileName = strFileName;

FileInfo DownloadFile = new FileInfo(FullFileName);

//System.Web.HttpContext.Current.Response.Clear();

//System.Web.HttpContext.Current.Response.ClearHeaders();

//System.Web.HttpContext.Current.Response.Buffer = true;

//System.Web.HttpContext.Current.Response.ContentType = "application/octet-stream";

//System.Web.HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename="

//    + System.Web.HttpUtility.UrlEncode(DownloadFile.FullName, System.Text.Encoding.UTF8));

//System.Web.HttpContext.Current.Response.AppendHeader("Content-Length", DownloadFile.Length.ToString());

//System.Web.HttpContext.Current.Response.WriteFile(DownloadFile.FullName);

}

catch (Exception)

{

throw;

}

finally

{

System.Web.HttpContext.Current.Response.Flush();

System.Web.HttpContext.Current.Response.End();

}

9.实现第X页 共X页

旧的的iTextSharp版本和新的版本不一样,主要是通过页眉和页脚实现。

public class HeaderAndFooterEvent : PdfPageEventHelper, IPdfPageEvent

{

public static PdfTemplate tpl;

public static bool PAGE_NUMBER = false;

iTextSharp.text.Font font = BaseFontAndSize("黑体", 10, Font.NORMAL, BaseColor.BLACK);

//关闭PDF文档时

public override void OnCloseDocument(PdfWriter writer, Document document)

{

BaseFont bf = BaseFont.CreateFont(@"c:\\windows\\FONTS\\simsun.ttc,1", BaseFont.IDENTITY_H, false); //调用的字体

tpl.BeginText();

tpl.SetFontAndSize(bf, 10);//生成的模版的字体、颜色

tpl.ShowText((writer.PageNumber - 1).ToString());//模版显示的内容

tpl.EndText();

tpl.ClosePath();

}

//重写 关闭一个页面时

public override void OnEndPage(PdfWriter writer, Document document)

{

if (PAGE_NUMBER)

{

// Phrase header = new Phrase("PDF测试生成页眉分析报告", font);

Phrase header = new Phrase("第" + (writer.PageNumber) + "页/共  页", font);

PdfContentByte cb = writer.DirectContent;   //模版 显示总共页数

cb.AddTemplate(tpl, document.Right - 140 + document.LeftMargin - 70, document.Top + 40);//调节模版显示的位置

//页眉显示的位置

ColumnText.ShowTextAligned(cb, Element.ALIGN_CENTER, header,

document.Right - 140 + document.LeftMargin-80, document.Top +40, 0);

}

}

//重写 打开一个新页面时

public override void OnStartPage(PdfWriter writer, Document document)

{

if (PAGE_NUMBER)

{

writer.PageCount = writer.PageNumber;

}

}

//定义字体 颜色

public static Font BaseFontAndSize(string font_name, int size, int style, BaseColor baseColor)

{

BaseFont baseFont;

Font font = null;

string file_name = "";

int fontStyle;

switch (font_name)

{

case "黑体":

file_name = "SIMHEI.TTF";

break;

case "华文中宋":

file_name = "STZHONGS.TTF";

break;

case "宋体":

file_name = "SIMYOU.TTF";

break;

default:

file_name = "SIMYOU.TTF";

break;

}

baseFont = BaseFont.CreateFont(@"c:/windows/fonts/" + file_name, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//字体:黑体

if (style < -1)

{

fontStyle = Font.NORMAL;

}

else

{

fontStyle = style;

}

font = new Font(baseFont, size, fontStyle, baseColor);

return font;

}

//定义输出文本

public static Paragraph InsertTitleContent(string text)

{

iTextSharp.text.Font font = BaseFontAndSize("华文中宋", 16, Font.BOLD,BaseColor.BLACK);

//BaseFont bfSun = BaseFont.CreateFont(@"c:\windows\fonts\STZHONGS.TTF", BaseFont.IDENTITY_H, false); //调用的字体

//Font font = new Font(bfSun, 15);

Paragraph paragraph = new Paragraph(text, font);//新建一行

paragraph.Alignment = Element.ALIGN_CENTER;//居中

paragraph.SpacingBefore = 5;

paragraph.SpacingAfter = 5;

paragraph.SetLeading(1, 2);//每行间的间隔

return paragraph;

}

}

运行结果:

注:如需要源代码,请关注百度贴吧,然后发帖支持作者(软件频道)http://tieba.baidu.com/f?kw=%C8%ED%BC%FE%C6%B5%B5%C0&fr=index,最后找作者要代码:QQ:763630473

基于iTextSharp的PDF操作(PDF打印,PDF下载)的更多相关文章

  1. C#使用iTextSharp+ZXing.Net+FreeSpire.PDF生成和打印pdf文档

    项目需求(Winform)可以批量打印某个模板,经过百度和摸索,使用iTextSharp+ZXing.Net+FreeSpire.PDF三个类库实现了生成pdf.生成条形码和打印pdf功能. 首先在项 ...

  2. C# 打印PDF文档的10种方法

    操作PDF文档时,打印是常见的需求之一.针对不同的打印需求,可分多种情况来进行,如设置静默打印.指定打印页码范围和打印纸张大小.双面打印.黑白打印等等.经过测试,下面将对常见的几种PDF打印需求做一些 ...

  3. 基于iTextSharp的PDF文档操作

    公司是跨境电商,需要和各种物流打交道,需要把东西交给物流,让他们发到世界各地.其中需要物流公司提供一个运单号,来追踪货物到达哪里?! 最近在和DHL物流公司(应该是个大公司)对接,取运单号的方式是调用 ...

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

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

  5. .NET 操作PDF文档以及PDF文件打印摸索总结

    关于生成 PDF 的操作,相信大家的在实际的工作过程中难免会碰到.以前我们通过生成 word 文档来进行文件的打印,但是由于太过依赖 office 软件,因此尝试能不能使用 PDF 进行文件打印. 在 ...

  6. Itextsharp下根据Echarts图像生成pdf

    本文介绍如何在C#中使用ItextSharp生成带echarts图表的pdf 一.生成一个简单的pdf 后台代码 publicActionResultGetPdf() { MemoryStream m ...

  7. 关于这两天研究Java打印pdf方法的记录

    这两天在研究Java调用打印机打印PDF文件的方法,学到了不少东西,特别来记录一下. 关于Java打印网上最多的而且也是Java正统的打印方法就是使用PrintService,一套比較标准的打印代码例 ...

  8. jacob 操作word转pdf

    项目需要对上传的word及pdf进行在线预览,因基于jquery的pdf插件,很方面实现在线预览,而word实现在线预览费劲不少,于是想到在进行上传处理时,直接将word转成pdf,在预览时直接预览p ...

  9. C#调用Python脚本打印pdf文件

     介绍:通过pdf地址先将文件下载到本地,然后调用打印机打印,最后将下载的文件删除. 环境:windows系统.(windows64位) windows系统中安装python3.6.2环境 资料: O ...

随机推荐

  1. java 文件拷贝

    需求:源和目标! 那么我们需要源文件和目标文件! 构建管道的时候就需要两个:输出流和输入流管道! Eg: package july7file; //java7开始的自动关闭资源 import java ...

  2. 1471 - Defense Lines

    After the last war devastated your country, you - as the king of the land of Ardenia - decided it wa ...

  3. 【踩坑记录】vue单个组件内<style lang="stylus" type="text/stylus" scoped>部分渲染失效

    vue组件化应用,近期写的单个组件里有一个的渲染部分样式渲染不上去 因为同结构的其他组件均没有问题,所以排除是.vue文件结构的问题,应该是<style>内部的问题 <style l ...

  4. C# 获取进程退出代码

    我需要写一个程序,让这个程序知道另一个程序是否正常退出,于是就需要获取这个进程的退出代码 在程序如果需要手动退出,可以设置当前的退出代码 static void Main(string[] args) ...

  5. JavaSE基础---异常

    异常 Throwable----具备可拋性:就是该体系中的类和对象都可以被关键字throw或throws所操作. |---Error ---错误,一般不编写针对性处理方式 |---Exception- ...

  6. CFEducational Codeforces Round 66题解报告

    CFEducational Codeforces Round 66题解报告 感觉丧失了唯一一次能在CF上超过wqy的机会QAQ A 不管 B 不能直接累计乘法打\(tag\),要直接跳 C 考虑二分第 ...

  7. destoon自定义文件的伪静态地址优化

    destoon自定义文件的伪静态优化 destoon给出了一个自定义文件传参的方式 在/include/global.func.php 有个rewirte函数来处理 目前的处理方式:index.php ...

  8. 谈谈模型融合之一 —— 集成学习与 AdaBoost

    前言 前面的文章中介绍了决策树以及其它一些算法,但是,会发现,有时候使用使用这些算法并不能达到特别好的效果.于是乎就有了集成学习(Ensemble Learning),通过构建多个学习器一起结合来完成 ...

  9. github 项目搜索技巧-让你更高效精准地搜索项目

    目录 github 搜索技巧 案例 普通搜 搭配技巧搜 限定词 查找某个用户或组织的项目 辅助限定词 还没搞懂的(关于 forks.mirror.issues) 排序(放的是官网的链接) 使用指南 练 ...

  10. 银川区域赛 H道路与航线(原题啊)

    按照<算法竞赛进阶指南>写的 哦对了,注意下最后判断,因为开始拓扑的时候,s可能不在里边,所以不一定等于INF,而是应该大于等于INF #include<cstring> #i ...