.NET的那些事儿(9)——C# 2.0 中用iTextSharp制作PDF(基础篇)
该文主要介绍如何借助iTextSharp在C# 2.0中制作PDF文件,本文的架构大致按照iTextSharp的操作文档进行翻译,如果需要查看原文,请点击一下链接:http://itextsharp.sourceforge.net/tutorial/
一、 iTextSharp的介绍和下载
(1)用户可以浏览官网进行查看:http://itextsharp.sourceforge.net/index.html
iText# (iTextSharp) is a port of the iText open source java library written entirely in C# for the .NET platform. iText# is a library that allows you to generate PDF files on the fly. It is implemented as an assembly.
(2)以下链接用于下载:http://sourceforge.net/project/platformdownload.php?group_id=72954
下载后为一个解压缩文件,用户直接解压后得到一个dll动态链接库,在创建的项目中直接引入即可使用(本文的所有代码均在VS 2005环境下测试通过)
二、创建一个PDF文档(原文:http://itextsharp.sourceforge.net/tutorial/ch01.html)
2.1 示例代码分析
创建一个PDF文档大致包括五个步骤,代码如下:
该段代码的效果是可以在当前工作目录下,生成一个名字叫做Chap0101.pdf的PDF文档
2.2 第一步:创建Document对象
(1) Document对象
iTextSharp.text.Document有三个构造函数,分别为:
第一个构造函数调用第二个构造函数,参数为PageSize.A4
第二个构造函数调用第三个构造函数,其中每个边距默认值为36
(2) Page Size
你可以创建自己的用于特定颜色的Rectangle对象,并将其作为pageSize。我们对前面的代码进行修改,即创建一个长的、窄的、背景颜色为淡黄色的PDF文档。代码如下:
大多pageSizes都是采用了PORTRAIT格式,如果你想在LANDSCAPE应用它们,你必须使用rotate(),代码如下:
(3) Margins
在创建document的过程中,你也可以定义左、右、上、下边距,代码如下所示:
注意:如果你修改pageSize,会在下一个页面创建时产生影响;如果你修改margins,则会在当前页面立即产生影响。
2.3 创建Write对象
一旦成功创建了document,我们必须创建一个或者多个实例用于监听document,所有的writers继承于iTextSharp.text.DocWriter类。即你可以iTextSharp.text.pdf.PdfWriter 使用来生成PDF文档,而如果需要生成Tex文档你必须使用iTextSharp.text.TeX.TeXWriter。
你可以使用以下的方式创建实例:
在使用过程中,你几乎不会使用到writer对象(除了你想创建高级的PDF文件或者你想使用一些特定的函数,比如ViewerPreferences或者Encryption),所以获取这类实例就足够了。
该函数的第一个参数即第一步所创建的document对象;
第二个参数为不同类型的Stream对象,目前我们都只使用System.IO.FileStream,后来我们会使用到System.IO.MemoryStream.
2.4 元数据以及打开document
在你添加实际数据(即内容)是,你可能想加入某些关系到document的元数据,其方法如下:
你可以选择自己的Title,Subject,Keywords,Author以及Creator,但是添加制作者的函数必须一直使用,以及添加创建时间的方法添加的当前系统的时间(事实上,这两个方法是被自动调用的),你可以用客户的姓名作为Header,但是这对于PdfWrite没有任何影响。
2.5 添加内容
1、在前面的三个步骤中,你遇到了诸如:Phrase,Paragraph…的对象,在以后的章节会详细的给予介绍。有些时候,你可能希望writer可以忽略document中的行为,相关的代码可以查看
2、如果你想创建两个writer:writerA和writerB(这个代码在第二步会丢出异常)
实际上,我们需要对其进行简单的修改,修改后的代码如下:
2.6 关闭document
关闭document相当重要,因为它会影响和关闭writer写的输出流,close方法为finalize方法,但是你不能依靠它,你必须手工对其进行关闭。
三、Chunks, Phrases 和Paragraphs(原文http://itextsharp.sourceforge.net/tutorial/ch02.html)
3.1 Chunk
Chunk是能够添加到document文本中最小的重要部分。Chunk能够为其他的元素诸如Phrase以及Paragrph等构建块,一个Chunk就是一个附有指定字体的字符串,在添加chunk的文本的对象中,所有其他的版面设计参数都应该定义。
下面的代码表示我们创建内容为"Hello world"格式为(red, italic COURIER font of size 20)的Chunk:
3.2 Phrases
Phrases是一系列拥有特定的作为额外参数的leading(=两行之间的空间)的Chunk
Phrases拥有一个主字体,但是其他的chunks可以拥有不同于这个主字体的其余字体,你可以从多种构造函数中创建Phrases对象。代码如下:
3.3 Phragraph
Phragraph是一系列的chunk或者phrase.跟phrase类似,Phragraph也有特定的leading,用户也可以定义特定的缩排。每个加到document的Phragraph都会自动生成新的一行。Phragraph的构造函数包括如下几种:
所有的paragraph对象还可以利用add()添加paragraph对象。代码如下:
注意:每一个paragraph只能且需有一个leading,如果你想添加其他字体的phrase或者chunk,原先的leading依旧有效,你可以利用方法setLeading修改leading,但是这样会造成所有paragraph的内容都会拥有新的leading.测试代码如下:
以下的代码我们应用方法setKeepTogether(true)来保证paragraph在一个page上,这个并不经常发生。
四、Anchor(锚)、List(列表)和Annotation(注释)
(原文:http://itextsharp.sourceforge.net/tutorial/ch03.html)
4.1 Anchor
我们都知道HTML中的超文本链接,只要你点击指定的文字,你就可以跳转到网络中的其他页面,这种功能在PDF中同样存在,在后面的章节会详细的介绍PDF中的链接Chapter 11,。但是这是iText的另外一种高级编程,我们这里只是介绍简单的iText.
如果你想添加外部的link到document中(比如用URL链接到网页中的另外一个document),你可以简单的使用Anchor对象,该对象继承于Phrase对象,它们具有相同的使用方法,但是它还有两个额外的方法:setName和setReference,具体的使用代码如下:
如果你想添加内部的链接,你需要为链接选择独特的名字,这就像在HTML中为锚所使用的名字,当你为这个目标设定索引时,你需要在前面添加一个#符号,具体代码如下:
4.2 List
利用List和ListItem类,你就可以为PDF文件添加列表了,如果你想拥有有序(ordered)列表或者无序列表(unordered)你都可以使用这两个类。
(1) ordered列表
结果为:
(2) 无序列表
结果为:
你可以用setListSymbol方法改变列表标识符,代码如下所示:
还有一些方法用于改变列表的缩排:setIndentationLeft和setIndentationRight.
而列表符的缩排可以在构造函数中给予设定,参考代码如下:
4.3 Annotation
在iText中支持不同类型的注释:
(1) Text:你可以向document添加一些小块的文本,但是这些文本并不属于内容的一部分,Annotation有一个标题和一些内容,具体代码如下:
(2) External links(外部链接):你可以指定一个可被点击的矩形或者字符串(称为URL)或者URL对象,具体代码如下:
(3) External PDF file(外部PDF文件):你可以设定一个可点击的矩形和字符串(文件名称)和目的文件或者页码:
(4) Named action(指定的行为):你必须制定一个可点击的矩形和一个指定的行为:
(5) Application(应用):你必须制定一个可点击的矩形和一个应用程序
5、HeaderFooters,Chapters,Sections和Graphic对象(原文:http://itextsharp.sourceforge.net/tutorial/ch04.html)
5.1 HeaderFooter
HeaderFooter对象是一个能够为document的每个页面添加footer和header的对象,这些页眉和页脚都包含着标准的短语和当前的页码(如果有需要)。如果你需要更加复杂的页眉和页脚(有表格或者有page X of Y),您需要阅读12章节Chapter 12:
下面的核心代码表示我们第一个添加一个包含页码但是么有任何边界的页眉。
具体代码如下:
我们也可以用一下的构造函数:
如果你设置HeadFooter对象没有改变边界,页眉或者页脚会在文本的上下有一条线。
5.2 Chapters和Section
十一章(Chapter 11 本文的12节)描述了如何创建大纲树,如果你只是需要附有一些章节或者子段的简单的树,你可以利用Chapter和Section类来自动创建,核心代码如下:
下面的代码,我们添加一系列的章节和子章节,运行程序后,你可以查看到PDF文件拥有完整的大纲树,这个大纲树被默认打开,如果你想使得有一部大纲关闭,你可以把BookmarkOpen属性设置为false.
5.3 Graphic
如果你想添加诸如线段、圆、几何图形等,你可以查看本文的第11章或者查看原文(Chapter 10),但如果你只是需要有限的功能,你可以直接使用Graphic对象。核心代码如下:
详细代码如下(在目前测试过程中,Ghaphic类不能使用,目前还不知道什么原因)
六、表格Table(原文:http://itextsharp.sourceforge.net/tutorial/ch05.html)
提示:如果你仅仅只生成PDF(并非XML,HTML,RTF)文件,你最好可以用PdfPTable类取代Table类
6.1 一些简单的表格
Table(表格)就是一个包含Cells(单元格)的Rectangle(矩阵).并按照一些特定的矩阵进行排序。表格中的矩阵并一定要M*N,它还可以只包含比unit大的单元格或者hole,其核心代码如下:
下面的代码我们创建一个非常简单的表格:
以上代码创建了一个含有2行2列的表格,单元格自动添加,开始于第一行的第一列,然后第二列,当一个行满了以后,下一个单元格就在下一行的第一列添加。如下图所示:
以下代码为在表格指定的位置进行添加单元格,在测试本代码,您必须添加引用System.Drawing.dll库文件来访问Point对象,我们在该代码创建一个4X4的表格,然后在随机的位置添加单元格。
核心代码如下:
详细代码如下:
从以上代码可以看出,我们必须设置属性AutoFillEmptyCells属性为true,如果你忘记设置该属性(就像本代码生成的第二个表格),这样就不会有额外的单元格添加当然不包括任何单元格的行也会被忽略。在本例中,第一行没有显示,就是因为它是空的。
通常情况下,我们会用数据库查询结果来填满表格,在许多例子中,我们并不知道我们究竟需要多少行,这里有个构造函数可以解决这个问题,如下:
如果有需要,iText会自动添加行,在下面的例子,我们初始化了一个4X4的表格,当我们在6行和7行添加单元格的时候,iText自动将行数升至为7.具体代码如下所示:
同样,添加列数也是可能的,但是有一定的难度,它不会进行自动的添加,你需要使用addColumns方法以及为列的宽度进行设置,在下面的代码可以看出。
6.2 一些表格参数
以上创建的一些表格看起来效果都不怎么好,我们可以通过设置一些表格参数来改变表格的外观。Table类和Cell类都是继承于Rectangle类,所以我们可以利用一些rectangle的典型的方法,如下面代码:
.NET的那些事儿(9)——C# 2.0 中用iTextSharp制作PDF(基础篇)相关推荐
- .NET的那些事儿(9)——C# 2.0 中用iTextSharp制作PDF(基础篇) .
该文主要介绍如何借助iTextSharp在C# 2.0中制作PDF文件,本文的架构大致按照iTextSharp的操作文档进行翻译,如果需要查看原文,请点击一下链接:http://itextsharp. ...
- unity 引用prefab_Unity手游实战:从0开始SLG——资源管理系统-基础篇(一)浅谈Asset(Unity资产映射)...
1.1什么是Assets 对于Assets一般来说我们有两层认知,一层来自于Unity的默认工程目录Assets,一层来自于Unity的打包系统AssetBundles.那么我们就从这两个方面来归一化 ...
- protege5.0构建知识图谱(基础篇)
protege5.0的基本使用介绍 今天新学习了利用protege5.0构建知识图谱,和大家分享下学习经历. protege的安装以及可视化插件graphviz的安装参照了前辈的博客,这里表示一下感谢 ...
- unity asset store下载不了_Unity手游实战:从0开始SLG——资源管理系统-基础篇(三)AssetBundle原理...
先用一句话介绍一下AssetBundle吧. AssetBundle系统提供了一种压缩文件的格式,可以把1到多个文件进行索引和序列化. Unity项目在交付安装之后,会通过AssetBundle对不包 ...
- 全网最新Spring Boot2.5.1整合Activiti5.22.0企业实战教程<基础篇>
文章目录 前言 一.新建流程图 1.新建processes文件夹 2.绘制流程图 3.完整的xml文件 二 Service总览 三.部署流程 1.涉及表 2.部署分析 四.查询流程定义 五.启动流程实 ...
- Android 系统(98)---Android app 在线更新那点事儿(适配Android6.0、7.0、8.0)
Android app 在线更新那点事儿(适配Android6.0.7.0.8.0) 一.前言 app在线更新是一个比较常见需求,新版本发布时,用户进入我们的app,就会弹出更新提示框,第一时间更新新 ...
- asp.net 2.0中用GRIDVIEW插入新记录
出处:www.knowsky.com 作者:www.knowsky.com <script language=JavaScript src="/ad/ad.js">&l ...
- emqx速度_EMQX-3.0性能测试报告-ReadtheDocs.PDF
EMQX-3.0性能测试报告-ReadtheDocs.PDF EMQX-3.0性性性能能能测测测试试试报报报告告告 Release 3.0.4 杭杭杭州州州 云云云科科科技技技有有有限限限公公公司司司 ...
- angular 如何在index html 页面包含子页面_Webpack4.0各个击破(1)html篇
webpack作为前端最火的构建工具,是前端自动化工具链最重要的部分,使用门槛较高.本系列是笔者自己的学习记录,比较基础,希望通过问题 + 解决方式的模式,以前端构建中遇到的具体需求为出发点,学习we ...
最新文章
- DAY02 WINDOWS Ghost系统的备份与还原以及不同虚拟机的通信的实现
- IT工程师实战英语之一
- Java字符串String比较不要用==原因
- apache文件服务器加权限,apache2运行权限设置
- Redis 五种数据类型
- redis 流 stream的使用总结 - 如何遍历
- Linux系统下如何配置SSH?如何开启SSH?
- 语音识别是如何识别出各地方言的?
- iphone储存空间系统怎么清理_iPhone内存总是不够用?那是你不会清理,这样清立马腾出10G空间...
- 华为8lite支持云闪付吗_2K/120Hz屏?华为P40Pro尊享版价格曝光 | 一加8曝4.15发布
- Java经典设计模式(1):五大创建型模式(附实例和详解)
- 5 EDA技术实用教程【基本语句2】
- PCM音量控制(高级篇)
- 使用LSTM生成序列、自动问答使用?分割即可!
- 使用hibernate映射oracle两个表空间的表,Hibernate每个具体类一张表映射(使用XML)
- Gif录制工具Gyazo 官方版
- Validator框架的使用
- python编程技巧
- 组件绑定事件与源生事件
- 错误0x80080005的解决办法
热门文章
- CSS+HTML实现学成在线静态页面
- NetXpert XG帮您解决“布线安装与维护”难题
- AYITOJ ROUND #1题解
- python笔记手册_《Python 学习手册》读书笔记
- 春秋云镜靶场Initial-WriteUP 专业徽章手把手教学
- 考研数据结构之队列(3.3)——练习题之设计一个循环队列,用front和rear分别作为队头和队尾指针,另外用一个标志tag表示队列是空还是不空来设计队列的结构和相关基本运算算法(C表示)
- python实现之多元函数作图
- android代码修改mp3文件封面,从android中的mp3文件中提取专辑封面
- 如何在 Ubuntu 20.04 / KylinOS-V10-SP1 上安装 Sublime Text 4
- linux centos安装wine qq,centos7下安装wine+QQ成功实例