天道酬勤

随笔分类 -  iTextSharp

摘要:前言 最近公司一直使用iText开发PDF报表,使用一段时间之后发现iText这个类库虽然是庞大无比,但作为程序猿我们不需要知道所有的类和方法,我们只需要知道如何使用即可。 所以这篇文章就是告诉大家如何快速的使用iTextSharp(iText .net版本)进行开发。 iTextSharp开发步骤 快速开发之前,我们先了解以下4个类: cla... 阅读全文
posted @ 2014-07-12 11:31 JulyLuo 阅读(49183) 评论(6) 推荐(14) 编辑
摘要:断断续续的写了一些关于iText in Action 2nd这本书的很多读书笔记,这里汇总一下方便别人也方便自己。 Part 1 (从头构建pdf文档) Pdf和Itext的介绍 五步创建一个新的pdf文档 Using iText’s Basic building block 文档中添加chunk, 阅读全文
posted @ 2012-07-29 09:51 JulyLuo 阅读(7524) 评论(6) 推荐(8) 编辑
摘要:前言在前面的章节中我们知道一个PdfStamper对象只能对应一个PdfReader对象。因此当我们将多个文档组装或者编辑时就需要用到另一个类:PdfCopy。PdfCopy继承PdfWriter,因此在五步创建文档过程中可以用PdfCopy代替PdfWriter,就如以下代码所示:listing 6.20 SelectPages.csint n = reader.NumberOfPages;Document document = new Document();PdfCopy copy = new PdfCopy(document, new FileStream(result2, FileMo 阅读全文
posted @ 2012-07-28 15:24 JulyLuo 阅读(3507) 评论(0) 推荐(0) 编辑
摘要:前言在目前为止,我们使用iText创建文档都是使用前面提到的五步创建法,但在这一节我们会用PdfStamper类为现有文档添加内容。PdfStamper使用了不同的架构,具体参考以下代码:listing 6.11 SelectPages.cspublic string ContructFile(){ PdfReader reader = new PdfReader(new MovieTemplates().ContructFile()); reader.SelectPages("4-8");……… if (!File.Exists(result1)) { ... 阅读全文
posted @ 2012-07-23 23:28 JulyLuo 阅读(5298) 评论(0) 推荐(0) 编辑
摘要:前言大家可能还记得我们在第五节中创建d的超人pdf文档,那个文档是从包含了Pdf语法的文本文件中构建起来的,图片看起来蛮cool,但那不是标准的构建方式。如果你希望可以重用现有文档内容,使用第五节中那些方法就比较危险。其实有更加安全的方法从现有文档中导入内容,这也是我们这一节要介绍的内容。Importing pages现在我们对第三节中创建的TimeTable文档进行一些操作。假设我们希望重用TimeTable文档中的内容,而且将其的每一页当作一个图片处理。下图就是如果用PdfPTable处理导出页面的效果。代码如下:listing 6.4 ImportingPages1.csdocument 阅读全文
posted @ 2012-07-22 17:12 JulyLuo 阅读(2581) 评论(1) 推荐(0) 编辑
摘要:前言从这一节开始内容集中到操作现有的pdf文档,如何创建pdf文档已经在前五节中有了很详细的说明。这一大章的英文名为Manipulating existing PDF documents,在定下这个名字之前出版社的建议是Editing PDF。但是PDF不是一个适合编辑(edit)的文档格式,PDF是一个呈现的格式,和我们平常用到的word不一样。在word中内容是分布在不同的页上,所以如果用不同的应用程序打开内容就不太一致,比如对同一个文本片段用office打开会出现在页面X上,但如果用Open Office打开就可能会出现在页面Y上,这也是大家选择PDF文档的理由之一。在PDF文档中,不管 阅读全文
posted @ 2012-07-21 23:49 JulyLuo 阅读(4057) 评论(0) 推荐(0) 编辑
摘要:前言 在上一节我们讨论了几种不同页边界的类型后这一节我们继续回到IPdfPageEvent接口中,现在这个接口还剩下以下4个关于文档和页面的方法没有说明: OnOpenDocument----当文档被带打开的时候调用,一般在这个方法中初始化一些需要在整个文档中使用的资源。 OnStartPage----当一个新的页面开启时调用,一般使用这个方法初始化一些页面需要的参数,最后要注意... 阅读全文
posted @ 2012-07-20 19:56 JulyLuo 阅读(3326) 评论(0) 推荐(1) 编辑
摘要:前言目前为止,我们通过Rectangle对象来定义页面的大小,而页面大小是PDF文档中5个不同页边界(page boundaries)的值。我们会在这一节中学习这些页边界,而且会通过一些列子来说明两个最重要页边界已经他们之间的区别。作者可以以自己的样子为模板画一个超人的图片,而且图片有1平方米,但为了避嫌,还是不画的好。但著名的商业画家Dick Kline曾经就为作者画过这样一幅画,并由长期使用iText的用户Bill Segraves送给了作者。这幅画不是有原始的图片元素组成,是由一系列的贝加尔曲线构建而成,这些曲线存储在一个文本文件hero.txt中,以下为具体的代码:listing 5. 阅读全文
posted @ 2012-07-19 19:23 JulyLuo 阅读(2111) 评论(0) 推荐(1) 编辑
摘要:前言 在我们将一些基本构建块(Chunk,Paragraph,Chapter等)添加到Document对象的实例中是,基本的构建块是由PdfWriter对象转换为pdf语法。在这个过程中,有一个我们很少直接使用但很重要的类:PdfDocument。这个类负责检测high-level对象,同时也负责调用IPdfPageEvent接口的页面事件(page event)。IPdfPageEvent接口... 阅读全文
posted @ 2012-07-13 23:17 JulyLuo 阅读(1958) 评论(0) 推荐(0) 编辑
摘要:前言在第二节和第四节中我们使用iText内部使用的对象和方法来构建一个文档。使用Chunk类时我们可以设置其背景色和下划线,使用PdfPTable类时我们可以设置边框和背景色,但如果这些都还不够呢?如果你像为Chunk类创建一个椭圆的背景,为PdfPCell类创建圆角那要如何处理。这一节就是要介绍Chunk,Paragraph,Chapter,Section,PdfPTable和PdfPCell类的自定义功能。在前面的章节中当内容不能完全填充一页时,iText会自动创建新的一页,但我们可能希望在每一页上自动添加一些元数据:页眉,页脚或者水印。这些都可以通过page event事件完成。以上所说 阅读全文
posted @ 2012-07-12 23:29 JulyLuo 阅读(2870) 评论(0) 推荐(2) 编辑
摘要:前言在第二节中我们创建了大量high-level的对象,iText会自动对其布局。在第三节的时候我们学会了writing to direct content,然后使用ColumnText对象将high-levl和lowel-level对象组合起来使用。目前为止我们将PdfPTable对象当作high-level对象使用,因此在其被添加到Document时:单元格的文本内容会被添加到文本层(text layer),其它所有的边框,背景色,图片都添加到文本层的下面。但是我们也可以将PdfPTable添加到文本层的上面抑或是图形层的下面。Working with WriteSelectedRows( 阅读全文
posted @ 2012-07-10 22:19 JulyLuo 阅读(2779) 评论(3) 推荐(2) 编辑
摘要:前言在上一节中,通过listing 4.16产生的表格拥有一个头,表头中显示的为日期。如果我们仔细观察此PDF的话你会发现基本上每一部电影的信息都会超过一页,表格中数据被分割的不错,但是表头却消失了。在这一节中我们会fix这个问题,而且还会为表格添加footer。Repeating headers and footers好了直接上效果图:上图是具体一天的电影播放信息,日期显示在第一行,第二行包括一些列的描述信息:Location,Time,Run Length等,同样的信息还被加入到footer中。为了实现上图的效果我们需要添加三列:背景为黑色且有日期的一列,背景为灰色的二列(一列添加到hea 阅读全文
posted @ 2012-07-09 19:08 JulyLuo 阅读(7252) 评论(2) 推荐(0) 编辑
摘要:前言PdfPCell类继承于Rectangle类,因此也继承了很多修改边框和背景色的属性和方法,后续我们会讨论到,但现在我们先要说明PdfPCell的内容模式。在iText的内部PdfPCell的内容被保存在ColumnText对象里面,如果你对ColumnText类有比较清晰的了解那么PdfPCell就很好理解了。但如果大家跳过了第三节直接到这里的话,那还是希望大家先学习第三节中关于ColumnText的内容。PdfPCell in text mode在这个子节中我们会用Phrase和Chunk对象作为填充表格的内容,以下为效果图:这里不能使用Paragraph,List或者Image对象, 阅读全文
posted @ 2012-07-08 16:56 JulyLuo 阅读(3949) 评论(4) 推荐(1) 编辑
摘要:前言iText已经有10年的历史了,如果有人问在这10年中iText中那个对象是最重要的话,本书的作者会毫不犹豫的说是PdfPTable和PdfPCell。因为作者大部分的工作(相信也是大多数人的工作)就是从数据中取出数据然后在文档中以表格的形式呈现出来。因为两个类实在是太重要,这里我们会花费整个第二章的内容来详细说明。Constructing tables在iText中处理Table的有很多老版本的类如Table和PdfTable,但由于有些缺点,而且在处理多页的情况分割表格,控制表格单元格等情况下力不从心,因此有了PdfPTable和PdfPCell的出现。iText最新的版本已经移出了P 阅读全文
posted @ 2012-07-02 22:55 JulyLuo 阅读(3522) 评论(2) 推荐(1) 编辑
摘要:前言在这一节中我们会讨论两个可重用的对象:Image和PdfTemplate对象。在2.3节我们往文档中添加图片的时候其实就已经接触到Image对象。在一般情况下,图片的字节会被保存在pdf文件中分开的流中,页面如果想要包含这个图片只需引用即可,这种类型的对象也叫做XObject。XObject有很多的类型,不过Image和Form XObject是最重要的。Image XObjects当我们将图片添加到文档中时其实就已经和image XObject打交道了,我们知道通过Document.Add方法添加的图片都位于文本的下面,但如果我们希望图片在文本的上面那要如何实现呢?将图片添加到最上层这里 阅读全文
posted @ 2012-06-30 23:47 JulyLuo 阅读(2463) 评论(0) 推荐(2) 编辑
摘要:前言在这一节中我们将会学习ColumnText对象的使用:如果只是往ColumnText中加入Chunk或者Phrase对象,那么我们就处于文本模式(text mode);如果加入其它高层次的对象那么就处于组合模式(composite mode)。在listing3.13种我们调用方法ShowMovieInfo来文档上打印一个大大的P字符。我们希望通过相同的方法往矩形中添加电影的标题,但是ShowTextAligned方法不能包裹文本,而且在这个方法中我们不能再string或者Chunk对象中使用换行。现在我们使用ColumnText提供的SetSimpleColumn方法来完成前一节的Fil 阅读全文
posted @ 2012-06-28 22:10 JulyLuo 阅读(4026) 评论(0) 推荐(1) 编辑
摘要:iTex in Action 2nd读书笔记3.3节 阅读全文
posted @ 2012-06-27 22:04 JulyLuo 阅读(3539) 评论(1) 推荐(2) 编辑
摘要:前言在第一节中我们学会了如何创建一个pdf文档,在2.2和2.3节时介绍了iText中的high-level对象的使用。接下来中我们会学习一种完全不同的添加内容模式:这通常也叫做low-level operations,因为我们是直接将pdf的语法添加到页面的内容流中。Introducing the concept of direct content好了先上图:图的左边是通过先添加一个包裹了文本"Foobar Film Festival"的Paragraph到文档中,然后又将一张图片添加到文档中,不过图片的定位是通过SetAbsolutePosition方法实现的。在这里添 阅读全文
posted @ 2012-06-25 22:31 JulyLuo 阅读(2991) 评论(1) 推荐(0) 编辑
摘要:Adding Anchor, Image, Chapter, and Section objects在上篇2.1节中,我向大家介绍了很多high-level类的使用。里面用到了ERD图中几乎所有的字段,但有个一没有用到:imdb。这个字段存储的是电影在网站imdb.com上的ID,缩写为IMDB(Internet Movie Database),因此这一节中我们会在文档中加入一些超链接。如果你下载了本书的源代码,里面会有一个resources文件夹,此文件夹中有一个poster文件夹:里面包含了每个imdb对应的图片(如Superman Return(超人归来)的ID是0348150,那么里面 阅读全文
posted @ 2012-06-24 22:43 JulyLuo 阅读(3271) 评论(0) 推荐(0) 编辑
摘要:前言这是我写iText in Action 2nd读书笔记的第二篇,但在上一篇有资源下载和代码的一些说明,如果大家对iTextSharp和PDF有兴趣,希望还是先看第一篇。现在我们将重点集中到第四步:添加内容。这里说的添加内容都是通过Document.Add()方法调用,也就是通过一些high-level的对象实现内容的添加。这一节如标题要介绍Chunk、Phrase、Paragraph和List对象的属性和使用。Document的Add方法接受一个IElement的接口,我们先来看下实现此接口的UML图:上图是iText中对应的类图,在iTextSharp中,只要将接口的名称前加上I即可如( 阅读全文
posted @ 2012-06-23 22:38 JulyLuo 阅读(6285) 评论(0) 推荐(0) 编辑