iText 制作PDF
前言
由于在MVC项目中需要使用PDF,所以自己抽空也来看看itext,以便于丰富自己的知识吧。在此也简单的记录一下,说不定以后可能还用的到。
在此您可以下载你想使用的版本http://sourceforge.net/projects/itextsharp/files/itextsharp/。于是我就下载了现在最新的版本5.4.0。

下面我就在Asp.Net Mvc 3.0Web项目中创建最简单的Hello PDF了。当然在项目中要首先引用dll文件。itextsharp.dll
第一步创建一个Document实例
public Document();public Document(Rectangle pageSize);public Document(Rectangle pageSize, float marginLeft, float marginRight, float marginTop, float marginBottom); |
当然F12转到定义就可以看到Document有三个构造函数。
其中第一个Document给size,color,margins都设置了默认值。查看源代码,默认为Document(PageSize.A4, 36, 36, 36, 36);
第一个构造函数以A4页面作为参数调用第二个构造函数。,第二个构造函数以每边36磅页边距为参数调用第三个构造函数。
第二个构造函数就可以自定义页面的大小了,例如
Rectangle pageSize = new Rectangle(144, 720); pageSize.BackgroundColor = new Color(0xFF, 0xFF, 0xDE); Document document = new Document(pageSize); |
通常,你不必创建这样的页面,而可以从下面页面尺寸中选择: A0-A10, LEGAL, LETTER, HALFLETTER, _11x17, LEDGER, NOTE, B0-B5, ARCH_A-ARCH_E, FLSA 和 FLSE
可以直接 Document document =new Document(PageSize.LEGAL);
大多数情况下使用纵向页面,如果希望使用横向页面,你只须使用rotate()函数: Document document = new Document(PageSize.A4.rotate());
当创建一个文件时,你还可以定义上、下、左、右页边距: Document document = new Document(PageSize.A5, 36, 72, 108, 180);
说明: 当创建一个矩形或设置边距时,你可能希望知道该用什么度量单位:厘米、英寸或象素,事实上,默认的度量系统以排版单位磅为基础得出其他单位的近似值,如1英寸=72磅,如果你想在A4页面的PDF中创建一个矩形,你需要计算以下数据:
21 厘米 / 2.54 = 8.2677 英寸
8.2677英寸* 72 = 595 磅
29.7 厘米 / 2.54 = 11.6929 英寸
11.6929英寸* 72 = 842 磅
默认边距为36磅即半英寸。 如果你修改了页面尺寸,仅仅影响到下一页,如果你修改了页边距,则影响到全部,故慎用。
第二步 创建Writer实例
一旦创建了Document,我们可以创建该文档的多个Writer的实例,所有这些Writer实例均继承自抽象类“iTextSharp.text.DocWriter”。
同时还有另外一种情况,你可以用iTextSharp.text.pdf.PdfWriter产生文档PDF文件。
Writer类的构造函数是私有的,你只能通过下面的方法创建一个实例:
public static PdfWriter getInstance(Document document, Stream os);
你可以通过下面的方法创建一个实例:
PdfWriter writer = PdfWriter.getInstance(document, new FileStream("Chap01xx.pdf"));
但是你几乎永远不会用到Writer实例(除非你想创建高级PDF或者希望用一些非常特殊的函数,如ViewerPreferences 或 Encryption)。所以通过下面的办法得到实例已经足够了: PdfWriter.getInstance(document, new FileStream("Chap01xx.pdf"));
在第一步中创建一个文档时,第一个参数意义不大,第二个参数可以是任何一种流,到目前为止我们一直使用System.IO.FileStream将Document写入文件中。
第三步 打开Document
在你写入任何实际数据之前,你可能希望通过以下几种方法写入一些关于本文档的摘要:
public boolean addTitle(String title);
public boolean addSubject(String subject);
public boolean addKeywords(String keywords);
public boolean addAuthor(String author);
public boolean addCreator(String creator);
public boolean addProducer();
public boolean addCreationDate();
public boolean addHeader(String name, String content) ;
你可以选择自己的标题、主题、关键字、作者、创建程序,但以下产品信息将始终被添加:
iTextSharp (或者iTextSharp的引用)和创建时间(实际上这两种方法是自动调用的)。
打开document前要做的事: 你只能在Open方法调用之前添加摘要,这是iText开发工具提供的一个选择。 在HTML中,报头信息被放在文档前面报头标识中间,调用Open方法将导致报头信息写入流,因而在Document被打开后无法更改这些数据。
页面初始化
Open方法在不同的Witer中同时会产生初始化事件,举例来说,如果你需要一个水印或者页眉页角对象出现在文档第一页的开始处,你需要在打开文档前添加这些,同样的用于设置该文档其他页水印、页眉、页角、页数和尺寸。 当调用下列方法:
public bool setPageSize(Rectangle pageSize)<br> public bool Add(Watermark watermark) <br> public void removeWatermark() <br> //setting Header property <br> public void resetHeader() <br> //setting Footer property <br> public void resetFooter() <br> public void resetPageCount() <br> //setting PageCount property |
产生的结果只能在下一个新页中看到(当在本页调用初始化方法时)
阅读器参数:
你可以通过下面的办法为PDF文件指定一些阅读器 (如Adobe Reader) 参数: public void setViewerPreferences(int preferences)
参数可以使用以下一些常量:
文件被打开时,页面布局用到下面的其中一个 :
o PdfWriter.PageLayoutSinglePage – 同时只显示一个页面
o PdfWriter.PageLayoutOneColumn –单列显示
o PdfWriter.PageLayoutTwoColumnLeft –双列显示,奇数页在左
o PdfWriter.PageLayoutTwoColumnRight -双列显示,奇数页在右
文件打开时,页面模式用到下面其中之一:
o PdfWriter.PageModeUseNone – 既不显示大钢也不显示缩略图 o PdfWriter.PageModeUseOutlines – 显示大纲
o PdfWriter.PageModeUseThumbs – 显示缩略图
o PdfWriter.PageModeFullScreen – 全屏模式,没有菜单、windows控件或者其他任何windows可见控件
PdfWriter.HideToolbar – 当文档激活时,是否隐藏阅读程序(如Adobe Reader)的工具条
PdfWriter.HideMenubar -当文档激活时,是否隐藏阅读程序的菜单.
PdfWriter.HideWindowUI -当文档激活时,是否隐藏阅读程序的界面元素,如滚动条、导航条等,而仅仅保留文档显示
PdfWriter.FitWindow – 是否调整文档窗口尺寸以适合显示第一页。
PdfWriter.CenterWindow – 是否将文档窗口放到屏幕中央
在全屏模式下,指定如何显示界面元素(选择一个)
o PdfWriter.NonFullScreenPageModeUseNone -既不显示大钢也不显示缩略图
o PdfWriter.NonFullScreenPageModeUseOutlines – 显示大钢
o PdfWriter.NonFullScreenPageModeUseThumbs – 显示缩略图 说明:你只能在类PdfWriter中调用这些方法。
加密
打开文档之前还要做的一件事情就是加密(如果你希望该文档加密),要达到这个目的,你可以使用下面的方法:
public void setEncryption(boolean strength, String userPassword, String ownerPassword, int permissions);
strength 是下面两个常量之一:
o PdfWriter.STRENGTH40BITS: 40 位
o PdfWriter.STRENGTH128BITS: 128位 (Acrobat Reader 5.0及以上版本支持)
UserPassword和ownerPassword 可以为空或零长度, 这种情况下, ownerPassword 将被随机的字符串代替 Permissions 为下列常量之一:
o PdfWriter.AllowPrinting o PdfWriter.AllowModifyContents
o PdfWriter.AllowCopy
o PdfWriter.AllowModifyAnnotations
o PdfWriter.AllowFillIn
o PdfWriter.AllowScreenReaders
o PdfWriter.AllowAssembly
o PdfWriter.AllowDegradedPrinting
例如:writer.setEncryption(PdfWriter.STRENGTH128BITS, "userpass", "ownerpass", PdfWriter.AllowCopy | PdfWriter.AllowPrinting);
打你试图打开示例代码0110产生的文件时,将要求输入密码('userpass'),因为添加了AllowPrinting参数,你可以打印该文档而不会发生任何问题。
第四步 添加内容
doc.Add(new Paragraph("您好, PDF !", font));
当我们创建了两个writer: writerA 和 writerB:
PdfWriter writerA = PdfWriter.getInstance(document, new FileStream("Chap0111a.pdf", FileMode.Create));
PdfWriter writerB = PdfWriter.getInstance(document, new FileStream("Chap0111b.pdf", FileMode.Create));
我们可以创建两个有细微差别的文档: writerA.Pause();
document.add(new Paragraph("This paragraph will only be added to Chap0111b.pdf, not to Chap0111a.pdf"));
writerA.resume();
你可以比较文件: Chap0111a.pdf和Chap0111b.pdf的区别
第五步关闭 document
关闭 document 非常重要, 因为它将关闭正在运行的Writer并将内容写入文件,该方法在最后被调用,你应该总是要关闭文档。
示例代码

#region//第一步定义一个Document,并设置页面大小为A4,竖向 Document doc = new Document(PageSize.A4);#endregion#region//第二步创建Writer实例 PdfWriter.GetInstance(doc, new FileStream("D:\\Hello.pdf", FileMode.Create));#endregion#region 设置PDF的头信息,一些属性设置,在Document.Open 之前完成doc.AddAuthor("作者aehyok");doc.AddCreationDate();doc.AddCreator("创建aehyok");doc.AddSubject("Asp.Net Mvc 使用 itextsharp 类库创建PDF文件的例子");doc.AddTitle("此PDF由aehyok创建,嘿嘿");doc.AddKeywords("Asp.Net Mvc,PDF,iTextSharp,aehyok");//自定义头 doc.AddHeader("Expires", "0");#endregion #region//第三步打开documentdoc.Open();#endregion#region//载入字体//"UniGB-UCS2-H" "UniGB-UCS2-V"是简体中文,分别表示横向字 和 // 纵向字 //" STSong-Light"是字体名称 BaseFont baseFT = BaseFont.CreateFont(@"c:\windows\fonts\SIMHEI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);iTextSharp.text.Font font = new iTextSharp.text.Font(baseFT); //写入一个段落, Paragraph #endregion#region///第四步添加内容doc.Add(new Paragraph("您好, PDF !", font));#endregion#region//第五步关闭documentdoc.Close();#endregion//打开PDF,看效果 Process.Start("D:\\Hello.pdf"); |
查看生成的PDF的文档吧

iText 制作PDF的更多相关文章
- 用C#制作PDF文件全攻略
用C#制作PDF文件全攻略 目 录 前 言... 3 第一部分 iText的简单应用... 4 第一章 创建一个Document 4 第一步 创建一个Document实例:... 5 第二步 ...
- iText导出pdf、word、图片
一.前言 在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText.通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超级连接显示或 ...
- 【PDF】java使用Itext生成pdf文档--详解
[API接口] 一.Itext简介 API地址:javadoc/index.html:如 D:/MyJAR/原JAR包/PDF/itext-5.5.3/itextpdf-5.5.3-javadoc/ ...
- Itext导出PDF,word,图片案例
iText导出pdf.word.图片 一.前言 在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText.通过在服务器端使用Jsp或JavaBean生 ...
- .NET的那些事儿(9)——C# 2.0 中用iTextSharp制作PDF(基础篇) .
该文主要介绍如何借助iTextSharp在C# 2.0中制作PDF文件,本文的架构大致按照iTextSharp的操作文档进行翻译,如果需要查看原文,请点击一下链接:http://itextsharp. ...
- C#:IText构造PDF文件
IText构造PDF文件 1.1 生成Document Document是我们要生成的PDF文件所有元素的容器,因此要生成一个PDF文档,必须首先定义一个Document对象. Document有三种 ...
- PHP制作pdf文档方法
原文:PHP制作pdf文档方法 本篇博客是在看完 php+mysql web书以后自己的测试代码,虽然是测试代码,但不是简单的粘贴复制,为了学习thinkPHP框架,自己就用这个来做的,而且这本书已经 ...
- python制作pdf电子书
python制作pdf电子书 准备 制作电子书使用的是python的pdfkit这个库,pdfkit是 wkhtmltopdf 的Python封装包,因此在安装这个之前要安装wkhtmltopdf 安 ...
- java itext替换PDF中的文本
itext没有提供直接替换PDF文本的接口,我们可以通过在原有的文本区域覆盖一个遮挡层,再在上面加上文本来实现. 所需jar包: 1.先在PDF需要替换的位置覆盖一个白色遮挡层(颜色可根据PDF文字背 ...
随机推荐
- IT人都很忙(茫)
我发现,身边的盆友都很忙,要么在加班,要么加班刚回家:要么在出差,要么刚出差回来. 难道搞IT的人都很忙么?忙还是茫? 大学期间,不知道未来要干什么,很多人也不清楚应该学习哪些知识和技能,是否需要考证 ...
- Oracle以系统管理员的方式登录失败
解决方法: 因为SYS是在数据库之外的超级管理员,所以我们在登录的时候输入sys后在输入命令:password as sysdba 就可以!例如:输入口令: m1234 as sysdba 参考文章 ...
- 推荐一下《聊聊JVM》的专栏
依照惯例新开了一个专栏后要单推一下.推荐一下<聊聊JVM的专栏>,网上关于JVM的文章太多,这个专栏希望能在已有的资料的基础上写出点新意,对一些重要的概念归纳总结,说说自己的观点.理解和实 ...
- Android应用性能优化系列视图篇——隐藏在资源图片中的内存杀手
图片加载性能优化永远是Android领域中一个无法绕过的话题,经过数年的发展,涌现了很多成熟的图片加载开源库,比如Fresco.Picasso.UIL等等,使得图片加载不再是一个头疼的问题,并且大幅降 ...
- Python安装后,Python IDLE等的位置
安装后,Python的目录下有如下文件:
- 解密Arm中国:全球最具影响力的芯片公司中国布局浮出水面
经济观察报 记者 陈伊凡 沈怡然 李华清 对于Arm与中国合资公司事宜,5月4日下午,Arm授权的代表邮件回复<经济观察报>称:“合资公司目前刚开始运营”,“我们的重点是让这个新的合资公司 ...
- Android 图片压缩,基于比例和质量压缩
package cc.util.android.image; import java.io.ByteArrayOutputStream; import java.io.File; import jav ...
- iOS开发之Quarz2D:九:图形上下文矩阵操作
#import "VCView.h" @implementation VCView - (void)drawRect:(CGRect)rect { // Drawing code ...
- 关于DP与背包
听说过动态规划(DP)的同学应该都知道有背包问题的存在. 首先我们来了解一下动态规划 基本思想: 动态规划算法通常用于求解具有某种最优性质的问题.在这类问题中, 可能会有很多可行解.没一个解都对应于一 ...
- HOOK API入门之Hook自己程序的MessageBoxW(简单入门)
说到HOOK,我看了很多的资料和教程,无奈就是学不会HOOK,不懂是我的理解能力差,还是你们说的 不够明白,直到我看了以下这篇文章,终于学会了HOOK: http://blog.sina.com.cn ...