admin 管理员组

文章数量: 1184232


2024年3月8日发(作者:物理机系统可以创建docker镜像吗)

iTextSharp使用详解(转)PDF文件是目前比较流行的电子文档格式,在办公自动化(OA)等软件的开发中,经常要用到该格式,但介绍如何制作PDF格式文件的资料非常少,在网上搜来搜去,都转贴的是同一段“暴力”破解的方法,代码片断如下:StreamWriterpPDF=newStreamWriter(filePath);ArrayListxRefs=newArrayList();floatyPos=0f;longstreamStart=0;longstreamEnd=0;longstreamLen=0;stringstrPDFMessage=null;//PDF文档头信息strPDFMessage="%PDF-1.1n";ConvertToByteAndAddtoStream(strPDFMessage);();

strPDFMessage="10objn";ConvertToByteAndAddtoStream(strPDFMessage);strPDFMessage="<>n";ConvertToByteAndAddtoStream(strPDFMessage);strPDFMessage="streamn";ConvertToByteAndAddtoStream(strPDFMessage);……看了上面的制作办法,我眼镜都摔坏了三幅,如果用上面这样原始的办法能制作出满意的PDF文件,那一定是天才所为。后来,我从一个网站(网址:/)中看到了专门制作PDF文件的控件的介绍,暗喜之余,立马下载试验,果然非常轻松地制作出了想要的PDF文件,因为网站为英文,内容又多,读起来非常费力,在解决了自己的问题后,看到许多网友还在为PDF文件制作而郁闷,遂决定将该内容翻译为中文,由于本人英语水平一般,许多地方又晦涩难懂,故翻译质量不是很满意,敬请斧正,但大部分能看懂。本文的目的一是解决部分网友的燃眉之急,二是抛砖引玉,如果哪位仁兄愿意将该网站中的内容准确翻译出来,则是天下之大幸。要用本文的方法生成PDF文件,需要两个控件:和,由于示例代码实在太多,我将代码全部整理出来,放在另外一个文件“示例代码.doc”中,所有这些资源,我均放在了本人的ftp站点(ftp://202.107.251.26)上的“Pdf文件制作全攻略”文件夹中(文件夹中另外两个rar压缩文件为两个控件的源代码,供大家学习研究使用),你可以到这里下载相应的资源,或者直接到原网站下载。

为便于调试和叙述,所有例子均为DOS控制台程序,windows程序使用方法完全一样,按照下面的步骤创建一个可调试的项目:1、打开VS2003;2、单击菜单“文件”→“新建”→“项目”,在项目类型中选择“VisualC#项目”,在模板中选择“控制台应用程序”,输入文件名称如“MakePdf”,指定好存放路径,然后点确定按钮;3、在“解决方案资源管理器”中右键单击“引用”,从弹出的菜单中选择“添加引用”,在“.NET”选项夹中选择“浏览”,添加前面提到的两个应用,如下图:4、在代码窗口顶部添加两个引用:;;至此,准备工作完毕。第一部分iText的简单应用第一章创建一个Document利用iText五步创建一个PDF文件:helloword。第一步,创建一个nt对象的实例:Documentdocument=newDocument();

第二步,为该Document创建一个Writer实例:tance(document,newFileStream("",));第三步,打开当前();第四步,为当前Document添加内容:(newParagraph("HelloWorld"));第五步,关闭();完整的代码见示例代码0101。在例中,不难看出,制作一个PDF文件是非常简单的。注:如果你将例中“(newParagraph("HelloWorld"));”中的字符串“HelloWord”换成中文,如“这是我的第一个PDF文件”,产生的结果一定让你大失所望,因为生成的PDF文件中并没有将中文显示出来,不要担心,在第9章中要专门讲解字体问题,中文显示也就迎刃而解了,如果不能正确显示中文,也就没有必要翻译本文了。下面对这几步做详细介绍。第一步创建一个Document实例:nt-object共有三个构造函数:

publicDocument();publicDocument(RectanglepageSize);publicDocument(RectanglepageSize,intmarginLeft,intmarginRight,intmarginTop,intmarginBottom);第一个构造函数以A4页面作为参数调用第二个构造函数,第二个构造函数以每边36磅页边距为参数调用第三个构造函数u页面尺寸:你可以通过指定的颜色和大小创建你自己的页面,示例代码0102创建一个细长的浅黄色背景的页面:RectanglepageSize=newRectangle(144,720);oundColor=newColor(0xFF,0xFF,0xDE);Documentdocument=newDocument(pageSize);通常,你不必创建这样的页面,而可以从下面页面尺寸中选择:

A0-A10,LEGAL,LETTER,HALFLETTER,_11x17,LEDGER,NOTE,B0-B5,ARCH_A-ARCH_E,FLSA和FLSE大多数情况下使用纵向页面,如果希望使用横向页面,你只须使用rotate()函数:Documentdocument=newDocument(());详细代码见示例代码0103。u页边距:当创建一个文件时,你还可以定义上、下、左、右页边距:Documentdocument=newDocument(PageSize.A5,36,72,108,180);在示例代码0104中你可以看到该文档有一个0.5英寸的左边距和1英寸的右边距,上边距为1.5英寸,下边距为2.5英寸。说明:当创建一个矩形或设置边距时,你可能希望知道该用什么度量单位:厘米、英寸或象素,事实上,默认的度量系统以排版单位磅为基础得出其他单位的近似值,如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实例均继承自抽象类“ter”。同时还有另外一种情况,你可以用ter产生文档PDF文件,如果你想创建一个TeX文档,你可以使用ter包。Writer类的构造函数是私有的,你只能通过下面的方法创建一个实例:publicstaticxxxWritergetInstance(Documentdocument,Streamos);(xxx是Pdf或Xml)你可以通过下面的方法创建一个实例:PdfWriterwriter=tance(document,newFileStream(""));但是你几乎永远不会用到Writer实例(除非你想创建高级PDF或者希望用一些非常特殊的函数,如ViewerPreferences或Encryption)。所以通过下面的办法得到实例已经足够了:tance(document,newFileStream(""));

在第一步中创建一个文档时,第一个参数意义不大,第二个参数可以是任何一种流,到目前为止我们一直使用ream将Document写入文件中,示例代码0105用到了Stream(这不是一个独立的例子,你必须在ServletEngine中测试这些代码。第三步打开Documentu摘要在你写入任何实际数据之前,你可能希望通过以下几种方法写入一些关于本文档的摘要:publicbooleanaddTitle(Stringtitle)publicbooleanaddSubject(Stringsubject)publicbooleanaddKeywords(Stringkeywords)publicbooleanaddAuthor(Stringauthor)publicbooleanaddCreator(Stringcreator)publicbooleanaddProducer()publicbooleanaddCreationDate()publicbooleanaddHeader(Stringname,Stringcontent)你可以选择自己的标题、主题、关键字、作者、创建程序,但以下产品信息将始终被添加:iTextSharp(或者iTextSharp的引用)和创建时间(实际上这两种方法是自动调用的)。你还可以将自定义的名称添加为“报头信息”,但是这对于PdfWriter没有任何作用,如果看看

实例代码0101产生的pdf文件的“文档属性”,我们可以看到仅仅有PDF创建程序和产品日期,而示例代码0106的“文档属性”框中有更多的信息。打开document前要做的事:你只能在Open方法调用之前添加摘要,这是iText开发工具提供的一个选择。在HTML中,报头信息被放在文档前面报头标识中间,调用Open方法将导致报头信息写入流,因而在Document被打开后无法更改这些数据。PDF报头信息不包括摘要,看起来有类似于:%PDF-1.2该行显示生成的文档是一个版本为1.2的PDF格式的文件,在PDF中,摘要保存在PdfInfo对象中,当文档关闭时已经写入PdfWriter中了,因此,没有关于为什么不能修改库来满足任何时候添加或更改摘要的技术原因u页面初始化Open方法在不同的Witer中同时会产生初始化事件,举例来说,如果你需要一个水印或者页眉页角对象出现在文档第一页的开始处,你需要在打开文档前添加这些,同样的用于设置该文档其他页水印、页眉、页角、页数和尺寸。当调用下列方法:publicboolsetPageSize(RectanglepageSize)

publicboolAdd(Watermarkwatermark)publicvoidremoveWatermark()settingHeaderpropertypublicvoidresetHeader()settingFooterpropertypublicvoidresetFooter()publicvoidresetPageCount()settingPageCountproperty产生的结果只能在下一个新页中看到(当在本页调用初始化方法时),代码见示例代码0107,你必须要准备一张名为的图片,如下图:u阅读器参数:你可以通过下面的办法为PDF文件指定一些阅读器(如AdobeReader)参数:publicvoidsetViewerPreferences(intpreferences)在示例代码0108中,指定了下面一些参数:werPreferences(youtTwoColumnLeft);

werPreferences(nubar|olbar);werPreferences(youtTwoColumnLeft|deFullScreen|lScreenPageModeUseThumbs);正如你所看到的,参数可以使用以下一些常量:l文件被打开时,页面布局用到下面的其中一个:youtSinglePage–同时只显示一个页面youtOneColumn–单列显示youtTwoColumnLeft–双列显示,奇数页在左youtTwoColumnRight-双列显示,奇数页在右l文件打开时,页面模式用到下面其中之一:deUseNone–既不显示大钢也不显示缩略图deUseOutlines–显示大纲deUseThumbs–显示缩略图deFullScreen–全屏模式,没有菜单、windows控件或者其他任何windows可见控件olbar–当文档激活时,是否隐藏阅读程序(如AdobeReader)的工具条nubar-当文档激活时,是否隐藏阅读程序的菜单.ndowUI-当文档激活时,是否隐藏阅读程序的界面元素,如滚动条、导航条等,而仅仅保留文档显示dow–是否调整文档窗口尺寸以适合显示第一页。

Window–是否将文档窗口放到屏幕中央l在全屏模式下,指定如何显示界面元素(选择一个)lScreenPageModeUseNone-既不显示大钢也不显示缩略图lScreenPageModeUseOutlines–显示大钢lScreenPageModeUseThumbs–显示缩略图说明:你只能在类PdfWriter中调用这些方法。u加密打开文档之前还要做的一件事情就是加密(如果你希望该文档加密),要达到这个目的,你可以使用下面的方法:publicvoidsetEncryption(booleanstrength,StringuserPassword,StringownerPassword,intpermissions);strength是下面两个常量之一:TH40BITS:40位TH128BITS:128位(AcrobatReader5.0及以上版本支持)UserPassword和ownerPassword可以为空或零长度,这种情况下,ownerPassword将被随机的字符串代替Permissions为下列常量之一:ssembly

egradedPrinting该功能参见示例代码0109和示例代码0110。ryption(TH40BITS,null,null,opy);示例代码0109产生的文件能够被打开而无须密码,但用户不能打印、修改本文档。ryption(TH128BITS,"userpass","ownerpass",opy|rinting);打你试图打开示例代码0110产生的文件时,将要求输入密码('userpass'),因为添加了AllowPrinting参数,你可以打印该文档而不会发生任何问题。第四步添加内容在解释第一步到第三步的不同示例中,你可能已经遇到了一些对象如Phrase,Paragraph等在接下来的几章中,所有这些问题都将得到详细解释。有时你可能想一个writer故意忽略document产生的行为,如示例代码0111:当我们创建了两个writer:writerA和writerB:PdfWriterwriterA=tance(document,newFileStream("",));PdfWriterwriterB=tance(document,newFileStream("",));我们可以创建两个有细微差别的文档:();

(newParagraph(","));();你可以比较文件:和的区别第五步,关闭document关闭document非常重要,因为它将关闭正在运行的Writer并将内容写入文件,该方法在最后被调用,你应该总是要关闭文档。高级话题:阅读PDF文件该部分内容介绍了iText只能产生PDF格式的文件而不能解析PDF格式文件,不再翻译。第二章块、短句和段落块块(Chunk)是能被添加到文档的文本的最小单位,块可以用于构建其他基础元素如短句、段落、锚点等,块是一个有确定字体的字符串,要添加块到文档中时,其他所有布局变量均要被定义。下面一行中,我们创建了一个内容为“helloWorld”、红色、斜体、COURIER字体、尺寸20的一个块:Chunkchunk=newChunk("Helloworld",t(R,20,,newColor(255,0,0)));u典型字体1:在本指南中,除了第九章外(你可以在这里学会使用其他字体),我们将始终使用典型字体1,

这些是不同的典型字体1:·Courier(该字体定宽)·Helvetica·TimesRoman·Symbol·ZapfDingbatsu下划线/删除线如果你希望一些块有下划线或删除线,你可以通过改变字体风格简单做到:Chunkchunk1=newChunk("Thistextisunderlined",t(ICA,12,INE));Chunkchunk2=newChunk("ThisfontisoftypeITALIC|STRIKETHRU",t(ICA,12,|THRU));u上标/下标在块中有几个方法可以调用,其中大部分将在接下来的章节中介绍,本章中只介绍一个方法setTextRise(floatf).你可以使用该方法在上标或下标中写块。

u块的背景如果你想改变块的背景,你可以使用方法setBackground(Colorcolor).这将在块文本的下面添加一个彩色矩形:kground(newColor(0xFF,0xFF,0x00));在示例代码0101中,你可以概览典型字体1和一个使用setTextRise,setBackground等方法的的例子。短句短句(Phrases)是一系列以特定间距(两行之间的距离)作为参数的块,一个短句有一个主字体,但短句中的一些块具有不同于主字体的字体,你有更多的选择去创建短句,一些具体使用参见代码0202。u古希腊语因为古希腊语经常使用,在类Phrase的构造函数中有一个特征:将一个字符串作为参数(如果你想避免这种情况,你只能使用块工作而不能使用字符串),正如你在示例代码0203中看到的,这个特征自动地将913至937(除903)和945至969(古希腊的ASCII值)范围内的所有字体改为希腊符号。u非主要性与其说这是一个特征,不如说是一个缺陷,但无论如何,这使创建一个非主要性的短句或段落成为可能,这将产生一个由下向上书写的临时作用(参见示例代码0204)。如果你想在一页中将一些位置移动到上面时可能有用。

说明,当你穿越上边届时无法检查,也没有办法让你回到前一页。段落段落是一系列块和(或)短句。同短句一样,段落有确定的间距。用户还可以指定缩排;在边和(或)右边保留一定空白,段落可以左对齐、右对齐和居中对齐。添加到文档中的每一个段落将自动另起一行。有几种办法建立一个段落,如:Paragraphp1=newParagraph(newChunk("Thisismyfirstparagraph.",t(ICA,12)));Paragraphp2=newParagraph(newPhrase("Thisismysecondparagraph.",t(ICA,12)));Paragraphp3=newParagraph("Thisismythirdparagraph.",t(ICA,12));所有有些对象将被添加到段落中:("youcanaddstrings,");(newChunk("youcanaddchunks"));(newPhrase("oryoucanaddphrases."));说明:一个段落有一个且仅有一个间距,如果你添加了一个不同字体的短句或块,原来的间距仍然有效,你可以通过SetLeading来改变间距,但是段落中所有内容将使用新的中的间距。见示例代码0205。u保持段落的整体性在示例代码0206中,我们使用了setKeepTogether(true)方法来试图将一个段落放在同一页中,该方法并不是始终有效,举个例子,第一段不能刚好在一页中,于是被分成了两部分。第二段被放置在第二页,但第三段顺沿到了第三页上。

字体的延续你应该掌握字体延续的一些规则,这些规则的应用见示例代码0207,当我们将一些内容用指定的字体(非默认字体)创建一个短句或者段落后再添加更多内容时,初始对象的字体风格将被延续,请看“Hello1!”和“Hello2”:PhrasemyPhrase=newPhrase("Hello2!",newFont(_NEW_ROMAN,8,));(newPhrase("someotherfont",newFont(ICA,8,)));(newPhrase("Thisistheendofthesentence.n",newFont(_NEW_ROMAN,8,)));(myPhrase);我们由TimesNewRoman粗体字开始,添加一些文本使用Helvetica字体而不指定风格,我们发现文本被改变成了粗体,当我们再加一些文本使用TimesNewRoman字体和斜体风格,结果变成了粗斜体。如果我们使用FontFactory来创建字体,字体风格不会被延续,因为FontFactory使用了另外的技术构建一个字体:myPhrase=newPhrase("Hello1bis!",t(_NEW_ROMAN,8,));(newPhrase("someotherfont",t(ICA,8,)));

(newPhrase("Thisistheendofthesentence.n",t(_NEW_ROMAN,8,)));(myPhrase);在上面的代码中,使用Helvetica字体的文本风字体没有指定(既不是粗体也不是斜体)。采用TimesNewRoman的额外文本仅仅显示为斜体。你也看到我们添加了一个段落,添加该段落就如同一个短句。ParagraphmyParagraph=newParagraph("Hello1!",newFont(_NEW_ROMAN,8,));(newParagraph("Thisistheendofthesentence.",t(_NEW_ROMAN,8)));(myParagraph);你可以不这样做,但将失去字体风格的延续,首先不用任何字体创建段落(例中我们仅仅给字体出间距为1.5倍),然后添加内容的不同部分。myParagraph=newParagraph(12);(newParagraph("Hello3!",newFont(_NEW_ROMAN,8,)));(newParagraph("Thisistheendofthesentence.",newFont(_NEW_ROMAN,8,)));

(myParagraph);如果你使用了Phrase对象,你同样会失去字体风格的延续:myPhrase=newPhrase(12);(newPhrase("Hello4!",newFont(_NEW_ROMAN,8,)));(newPhrase("Thisistheendofthesentence.",newFont(_NEW_ROMAN,8,)));(myPhrase);u更改分割符通常,当文本不能放在一行时,文本将被分割成不同的部分,iText首先会查找分割符,如果没有找到,文本将在行尾被截断。有一些预定的分割符如“”空格和“-”连字符,但是你可以使用setSplitCharacter方法来覆盖这些默认值。在示例代码0208中,你可以看到当到达行尾时一个块是如何被分割的。然后分隔符被改成点“.”,该行在该字符处被分割。第三章锚点、列表和注释锚点我们都知道HTML中的超文本链接,当我们点击某些语句,你能够跳转到网上的其他页。在PDF中也可以实现这种功能。事实上,在第十一章整个章节中有关于PDF链接的介绍,但这是iText的更高级的应用,本章中我们处理简单的iText。如果你想在文档中添加一个外部链接(例如使用URL链接到WEB上的其他文档),你可以简单地使用Anchor对象,它派生于Phrase对象,使用方法相同。只有两种额外方法定义两种额

外变量:setName和setReference。外部链接示例:Anchoranchor=newAnchor("website",t(ICA,12,INE,newColor(0,0,255)));nce="";="website";如果你想添加内部链接,你需要选择该链接不同的名称,就象你相位在HTML中利用名称作为锚点一样。为达到该目的,你需要添加一个“#”。内部链接示例:Anchoranchor1=newAnchor("Thisisaninternallink");="link1";Anchoranchor2=newAnchor("Clickheretojumptotheinternallink");nce="#link1";这两个链接的例子请见示例代码0301。列表通过类List和ListItem,你可以添加列表到PDF文件中,对于列表你还可以选择是否排序。

排序列表示例:Listlist=newList(true,20);(newListItem("Firstline"));(newListItem("Thstartonanewline?"));(newListItem("Thirdline"));结果如下:FirstlineThstartonanewline?Thirdline不排序示例如下:Listoverview=newList(false,10);(newListItem("Thisisanitem"));("Thisisanotheritem");结果如下:ThisisanitemThisisanotheritem你可以通过setListSymbol方法更改列表符号:

//用字符串作为列表符号mbol="*";//用Chunk作为列表符号(包含“•”字符)mbol=newChunk("u2022",t(ICA,20));//用图片作为列表符号mbol=newChunk(tance(""),0,0);还可以使用setIndentationLeft和setIndentationRight方法设置缩排,列表符号的缩排在构造函数中设置。更多的例子请参见示例代码0302。注释iText支持不同风格的注释。u文本注释:你可以添加一小段文本到你的文档中,但它并非文档内容的一部分,注释有标题和内容:Annotationa=newAnnotation("authors","Maybeit'sbecauseIwantedtobeanauthormyselfthatIwroteiText.");

u外部链接注释:你需要指定一个可点击的矩形和一个字符串(URL描述)或URL对象:Annotationannot=newAnnotation(100f,700f,200f,800f,newURL(""));Annotationannot=newAnnotation(100f,700f,200f,800f,"");u外部PDF文件链接注释:你需要指定一个可点击的矩形和一个字符串(文件名称)和目的文件或页码。Annotationannot=newAnnotation(100f,700f,200f,800f,"","mark");Annotationannot=newAnnotation(100f,700f,200f,800f,"",2);u指定行为链接注释你需要指定一个可点击的矩形和一个指定的行为:Annotationannot=newAnnotation(100f,700f,200f,800f,AGE);u应用程序链接注释:你需要指定一个可点击的矩形和一个应用程序:Annotationannot=newAnnotation(300f,700f,400f,800f,"C://winnt/",null,null,null);

我们无须在页面上指定一个位置,iText会内部处理。你能够看到iText添加文本注释在页面上当前位置下面,第一个在段后第一行下面,第二个在短句结束处的下面。所有其他注释需要指定想匹配的矩形区域,在示例代码0304中,我们画了一些正方形(使用的函数将在第十章中介绍),为每个正方形添加了一些链接注释。第四章页眉页脚、章节、区域和绘图对象使用在第三至第五章中描述的大量简单iText对象可以避免更多的高级话题(第九至十二章),紧记这些简单对象限制的功能,大量复杂的功能在第三部分。页眉页脚HeaderFooter对象可以于为文档每页添加页眉和页脚。这样一个页眉或页脚包含一个标准的短句(如果需要)和当前页码,如果你需要更多复杂的页眉和页脚(使用表格或者第几页共几页),请阅读第十二章。在示例代码0401中,你可以看到我们首先添加了一个包含页码没有任何边框的页脚。HeaderFooterfooter=newHeaderFooter(newPhrase("Thisispage:"),true);=_BORDER;=footer我们还可以使用下面的构造函数:HeaderFooterfooter=newHeaderFooter(newPhrase("Thisispage"),newPhrase("."));构造函数知道你希望添加一个页码和将其放置在两个短句间,如果你只是设置一个

HeaderFooter而不改变边框,页眉或页脚的文本上下各有一条直线。HeaderFooterheader=newHeaderFooter(newPhrase("Thisisaheaderwithoutapagenumber"),false);=header;章节和区域在第十一章中将描述如何构建一个树的外观,如果你只需要一个简单的章节和(子)区域,你可以用Chapter对象和Section对象自动构建一个树:ParagraphcTitle=newParagraph("Thisischapter1",chapterFont);Chapterchapter=newChapter(cTitle,1);ParagraphsTitle=newParagraph("Thisissection1inchapter1",sectionFont);Sectionsection=tion(sTitle,1);在示例代码0402中,我们添加了一系列的章节和子区域,你可以看到完整的树形,树形结构默认打开,如果你希望部分节点关闭,你必须使用用BookmarkOpen属性其值为false,详见示例代码0403。图形如果你想添加图形,如直线、圆、几何窗体,你应该阅读读十章,但如果你只需要一些有限的功能,你可以使用Graphic对象Graphicgrx=newGraphic();//添加一个矩形

gle(100,700,100,100);//添加一条斜线(100,700);(200,800);//将图形显示出来();(grx);完整的代码请见示例代码0404,如果想看到全部的方法,请参见PdfContentByte对象API。当你想给页面加一个边框或者在文本当前位置画一条水平线时,图形对象非常有用。下面的方法用指定的宽度、间距(如果需要)和颜色画一个边框。publicvoidsetBorder(floatlinewidth,floatextraSpace);publicvoidsetBorder(floatlinewidth,floatextraSpace,Colorcolor);下面的方法用指定的宽度(如果需要)和颜色画一条水平线,线的长度是指定两边缘间可用面积的的百分比。publicvoidsetHorizontalLine(floatlinewidth,floatpercentage)publicvoidsetHorizontalLine(floatlinewidth,floatpercentage,Colorcolor)

示例代码5中,有一个离边界5磅,线宽3磅的边框,还有两条水平线,一条为黑色,5磅宽,可用空间的100%,另外一条为红色,线宽3磅,可用空间的80%。第五章表格重点:如果你仅仅生成PDF文件(没有XML、HTML、RTF……),使用类pdfPTable代替类Table更好。一些简单的表格一个表格是包含单元格排列成矩阵的矩形区域。表格的距阵并不要求是m×n的,它可以有空洞或者单元格比单个的要大。创建一个表格最通用的办法是预先知道有几行几列:publicTable(intcolumns,introws);在示例代码0501中,我们构建了一个简单的表:TableaTable=newTable(2,2);l("0.0");l("0.1");l("1.0");l("1.1");该表格有两行两列,单元格被自动添加,从第一行第一列开始,然后是第二列,当一行满后,下一单元格自动添加到下一行的第一列中。

也可以将单元格添加到表中指定的位置,如示例代码0502,别了要添加引用,以获得Point对象,我们创建了一个4行4列的表格然后添加一些单元格到随机的位置上:TableaTable=newTable(4,4);llEmptyCells=true;l("2.2",newPoint(2,2));l("3.3",newPoint(3,3));l("2.1",newPoint(2,1));l("1.3",newPoint(1,3));你可以看到我们将AutoFillEmptyCells属性设置为true,这将自动、默认的单元格布局填充空的单元格,如果我们忘记了这样做(就象本例中第二个表格),将没有额外的单元格添加,不包含任何单格的行也将被忽略,在本例中,第一行将不显示,因为该行是空行。经常用数据库查询结果来填充表格,大多数情况下,你预先并不知道到底需要多少行,这就是为什么还有第二个构造函数的原因:publicTable(intcolumns);iText根据需要自动添加行,在示例代码0503中,初始化了4行4列,当我们添加第6行和第7行的单元格时,iText自动增加行数到7。增加列数也是可能的,但是有点麻烦,它不能自动生成,你必须使用addColumns方法并设置

列宽,详见示例代码0504。一些表格参数前面例子中的表格并不美观,我们可以设置大量的参数来改变表格外观。类Table和类Cell派生于类Rectangle,我们可以用大量典型的Rectangle方法,让我们来看看示例代码0505。Tabletable=newTable(3);Width=1;Color=newColor(0,0,255);dding=5;acing=5;Cellcell=newCell("header");=true;n=3;l(cell);=newCell("examplecellwithcolspan1androwspan2");n=2;Color=newColor(255,0,0);

l(cell);l("1.1");l("2.1");l("1.2");l("2.2");l("celltest1");cell=newCell("bigcell");n=2;n=2;oundColor=newColor(0xC0,0xC0,0xC0);l(cell);l("celltest2");(table);u单元格间距和填距

在第4行中,我们设置了表格的填距,就是单元格边界和内容间一定数量的空间,在前面的示例中,我们看到文本紧贴边界,通过使用用特定的填距,就可以避免。在第5行中,我们设置了表格的间距,就是单元格和表格边界间的一定数量的空间,不同的单元格间使用了半数空间,具体代码见示例代码0506。u对齐方式在示例代码0506中,我们也改变了单元格“bigcell”的对齐方式:ntalAlignment=_CENTER;alAlignment=_MIDDLE;注:不能总是相信垂直对齐方式。u边框如果我们象在第14行中那样添加了一个单元格,将使用默认的单元格布局(默认的布局可以SetDefalut方法改变),如果我们使用了Cell对象,我们可以控制每一个单元格的布局。在第2和第三中,我们设置整个表格的边框宽度和边框颜色,我们在单元格上可以使用的方法,在12行中,每个单元格用“box”作为边界绘制(就象在HTML中),但是示例代码0507显示,我们在PDF中有大量更多可能。u颜色在第22行中,你也能定义单元格的背景色,在示例代码0507中,我们不使用颜色只是用一定灰度填充。

u行跨和列跨最后,你也能设置单元格的行跨(11/20行)和列跨(8/21列)。通过这种方法可以将几个单元格合并成一个大的单元格。u备注第7行在PDF中没有意义,用于生成HTML,在HTML中并不是总能产生同样的布局,PDF表格有点象:headerexamplecellwithcolspan1androwspan21.12.11.22.2celltest1bigcellcelltest2u表格分割如果一个表格不能放在一页中,将自动被分割,示例代码0508显示了当一个表格到达页边时发生的情况,这将在下一节中解释。

大表格跨越几页的表格将自动被分割成不同的部分。示例代码0509显示了一个跨越多页的报表。该报表有一个表头,如果你希望这个表头在每页都出现,你可以用endHeaders()方法标记表头区域的结束点,见示例代码0510。为做这样的报表,建议设置单元格间距为0和仅使用指定的填距。你可能已经注意到了,当一个表格被分割时,一些边界好象丢失了。这是因为单元格在前一页被完整地绘制了而不会传递给下一页。u强行将一个表格或单元格布置到一页上有有些情况下,你可能希望避免单元格或者整个表被拆分成两个部分,示例代码0511差不多和示例代码0508完全一样,但我们设置了参数TableHasToFit为true,看看示例代码0508和示例代码0511结果区别。在示例代码0512中我们修改了示例代码0510的CellsHaveToFit属性为true,比较两个示例产生结果的区别。内存管理当我们添加一个对象到文档时,该对象一有可能就写入了输出流,但当创建一个表格时,该Table对象一直保存着,对于真正的大表格,这将成为一个问题。同样,当你正写一个HttpServletResponse对象到输出流时,浏览器也可能超时。这就是为什么你自己用fitsPage()方法控制表分割是有用的,示例代码0513告诉你如何做。嵌套表格有两种方法嵌套表格,第一种是利用insertTable方法明确地将一个表格插入到另外一个表格,示例代码0514显示了通过插入到其他表格的办法创建的5个表格。正如你看到的在前面两个表中,所有空的单元格自动得到分割,因为改变了原来的表格。如果一个单元格不空,列跨度和(或)行跨度将自动调整到新的位置,页面上第三个表格显示所有原表中列的相关宽度都得到了

保护,第四个表格显示我们可以在插入了表格后添加其他单元格:该单元格自由地添加到下一个单元格中。最后是一个深度嵌套的表格。当你使用insertTable方法时,插入表的宽度百分比不会被考虑,如果你希望插入表仅占单元格的80%(这是默认的宽度百分比),你不得不在单元格中绕排,见示例代码0515,这也是让一个表结合其他数据存放在同一个单元格中的唯一办法,见示例代码0516。备注:你只能将一个表格插入到列跨度和行跨度均为1的单元格中。表格偏移当一个表格被添加到文档之前,以当前间距为准的新行将被添加(如前一个插入对象的间距)。有时因为前一个插入对象和当前表格间的间距过大或过小你并不希望这样做,如果你想改变这个空间,你不得不设置表格偏移,如示例代码0517。表格的绝对位置是一个通过标准方法创建表格的相当简单的类,但有时你希望表格有一些特殊的行为,这种情况下你将使用更复杂的类ble,示例代码0518是一个非常简单的例子,在第十章和十二章中将有一些更复杂的例子。第六章图片Image对象如果你学习过API,你可能已经注意到可以通过几种构造函数来创建图片,本手册中,我们将仅仅告诉你最简单的解决方案,如访问通过文件名或URL确定的图片生成的Image对象。publicstaticImagegetInstance(Uriurl)publicstaticImagegetInstance(stringfilename)Image是一个抽象类,故得到实例的方法将判断给出的图片的类别(GIF、Jpeg、PNG……)并返回对象的类别Gif、Jpeg、Png……,一些图片会被忽略,如果你想知道哪些图片会被忽略,

请查阅FAQ(/iText/#images)。u通过URL得到图片实例这是添加一个图片最简单的办法,见示例代码0601,我们添加了一个WMF、一个Gif、一个Jpeg和一个PNG图片到文档中,使用4个URL得到:Imagewmf=tance(newURL("../examples/"));Imagegif=tance(newURL("../examples/"));Imagejpeg=tance(newURL("../examples/"));Imagepng=tance(newURL("../examples/"));备注:许多PDF库在插入一个图片前都将其解压缩并转换成位图格式,下面是几个我为什么不这样做的原因:这将导致PDF文件增大,这样产生的PDF文件尺寸是不同图片文件尺寸总和的数十倍。面临一个法律问题:LZW算法受专利保护,所以不允许使用这种算法来解压缩GIF等文件。u通过文件名得到图片实例通过简单地改变图片引用路径将示例代码0601改成示例代码0602:Imagegif=tance("");Imagejpeg=tance("");Imagepng=tance("");

同示例代码0601的区别只是该图象从本地获取而已,另外一个例子见示例代码0603。图片的位置u对齐方式通过下面方法设置图片的对齐方式:Alignment=lignment=Alignment=参见示例代码0604。我们将Vonnegut的图片放在右边,小孩的图片放在中间,hitchcock的图片放在左边。u图片和文本另外,你还可以指定文本相对图片的环绕方式:Alignment=|APAlignment=Alignment=|YING见示例代码0506,文字在Vonnegut图片的左侧,并不在我小孩的图处环绕,且排在Hitchcock图片的上面。

说明:该功能尚有一些BUG。u绝对位置当制作PDF文件时,你可能用到该方法:publicvoidsetAbsolutePosition(intabsoluteX,intabsoluteY)将一个图片放要页面上一个绝对位置的代码见示例代码0606,我们在不同的坐标处添加了两幅图片,这里使用给定的坐标将图片放在了左下角,通过将图片的宽度和高度作为X和Y坐标将设置第一个图片,坐标的2倍设置第二个图片。缩放和旋转图片u缩放有几种办法可以缩放图片:publicvoidscaleAbsolute(intnewWidth,intnewHeight)publicvoidscalePercent(intpercent)publicvoidscalePercent(intpercentX,intpercentY)publicvoidscaleToFit(intfitWidth,intfitHeight)小孩的图片大小为194×202象素,如果你想让图片小一些,你可以通过scaleAbsolute(97,101)进行缩放,使用scalePercent(50)也能到达同样的效果。还可以通过scaleAbsolute(194,101)来减小,所以这些例子都放在了示例代码0607中。

u对分辨率的影响如果一个图片不经任何缩放,其分辨率(resolution)为72,如果该图片缩放比例为50%,则分辨率为144,如果有更低的缩放比,则分辨率将更大,因为象素相同但尺寸变得更小了。使用72/300=24%的比例放置一个300dpi的图片,例:你用300dpi扫描了一个5×5英寸的图片,图片结果为1500×1500象素(5×300),当你用24%(72/300=0.24)的比例将该图片放置到PDF文件中时,PDF中的图片将为5×5英寸1500X1500象素300dpi,该图片将始终为1500X1500象素而不管尺寸如何。u旋转可以通过下面的方法旋转图片publicvoidsetRotation(doubler)详见示例代码0608。原始图片数据到目前为止,所有例子中使用的图片均来自地本地磁盘或者某个网站,但也可能使用包含图片信息的数组来得到图片的实例:publicstaticImagegetInstance(byte[]img)该方法同前面方法的效果相同,返回一个新的Gif,Jpeg或者Png类别的Image对象。在示例代码0609中,我们添加一个从一个Jpeg文件中读入到字节数组中的图片,很明显,使用其他getInstance方法得到实例更优越,但这仅仅是一个例子,该getInstance方法在动态创建那些根本不存在的图片时非常有用。该例子也演示了如何创建和使用一个原始图片。

publicstaticImagegetInstance(intwidth,intheight,intcomponents,intbpc,bytedata[])本例中创建了一个100×100象素的图片,因为每个象素用RGB描述,所以图片大小为100×100×3字节。示例代码0610是一个比较高级的话题,理由如下:首次使用到了类。该类在.net框架中,可以使用更多类型的图片,如TIFF、GIF,而这些图片在iText中均不支持,你可以检查一下.net框架看看你需要的图片格式是否得到支持。前面的例子中,还有一些事情要注意:当添加一个图片时不会出现什么问题,文字始终浮于图片上面,本例中,我们希望图片浮在文字上面。这也是为什么我们将使用tentByte类的原因(见第十章)。你将发现使用的图片为透明的gif格式,你可以到/examples/下载得到。TIFF和CCITT示例代码0611也是一个比较高级的话题,例中转换一个TIFF文件到PDF文件。u图片遮罩示例代码0613在,我们创建了一个用作遮罩的图片

3C7EE7

C3C3E7

7E3C该图片尺寸为8×8象素,每组一个字节,使用makeMask()方法可以转换成遮罩。bytemaskr[]={(byte)0x3c,(byte)0x7e,(byte)0xe7,(byte)0xc3,(byte)0xc3,(byte)0xe7,(byte)0x7e,(byte)0x3c};Imagemask=tance(8,8,1,1,maskr);sk();ertMask(true);我们可以用该遮罩直接遮住其他图片的一部分。PdfContentBytecb=Content;

Imageimage=tance("");ask=mask;或者我们将该遮罩用于模板遮罪中。PdfContentBytecb=Content;ColorFill(255,0,0);ge(mask,Width()*8,0,0,Height()*8,100,400);关于ContentByte对象更多信息请参见第十章。图片和其他对象u图片在块中有时,可以方便地将图片置于块中,通过一定偏移将一个图片置于块中:Chunkck=newChunk(img,0,-5);具体代码见示例代码0614,我们可以添加该特殊图片块到短句、表格等,本例中的图片请到/examples/下载。u图片在表格中你可以将图片添加到单元格中,但有两个副作用:

l表格的宽度是确定,当图片超出单元格的宽度时,将自动缩小。l你不能进行文字绕排和为图片添加下划线。参见示例代码0615。u图片链接注释如果你希望得到一个可点击的图片,或者想添加链接注释到图片上,你需要创建一个Annotation对象,并添加到图片上,你不需要指定位置(你可以使用0,0,0,0),该位置会内部更新以适合该图片。tion=newAnnotation(0,0,0,0,"",3);tion=newAnnotation("picture","Thesearemychildren",0,0,0,0);参加示例代码0616。第二部分其他文档格式第七章XML和(X)HTML本章主要介绍了如何利用iText控件生成XLM文档和(X)HTML文档,但我们对这些并不感兴趣,故只介绍本章中提到的将XML转为PDF。在第一章中,我们通过5步生产一个PDF文件,为了将一个XML文件转换为PDF文件,只需重写第3和第4步,第5步由解析器自动处理。//第3步:创建一个解析器并设置文档句柄:iTextHandlerh=newiTextHandler(document);

//第4步,转换该文档:("");示例代码见示例代码0702第八章RTF文件RTF包RTF包是基于iText包扩展出来的,允许iText除生成PDF文件外还可以输出RTF文件,除了一些在RTF包中不支持的特性外,大多数PDF文件特性都可以使用。创建一个RTF文档创建一个RTF文档和创建一个PDF文档方法是一样的,都是这基本的5步,唯一的区别是第2步中用RtfWriter代替了PdfWriter,见示例代码0801。第1步创建一个nt对象的实例:Documentdocument=newDocument();第2步创建一个document的RtfWriter将document写入你选择的输出流:tance(document,newFileStream(""),);第3步打开document:();第4步添加内容到document

(newParagraph("HelloWorld"));第5步关闭();关于如何创建其他对象并添加到document中,请参见其他章节的内容。不支持的特性水印阅读器参数加密内嵌字体块间距段落右缩排列表右缩排无圆点符号列表嵌套表格除JPEG和PNG的其他图片RTF中扩展的页眉和页脚写入RTF时无法在开始新页前通过setHeader方法改变文档的页眉或页脚,这里有两个办法来解决这个问题。利用“Chapters”,添加一个新“chapter”到文档前,使用setHeader或setFooter,你可以在不同的“Chapters”中使用不同的页眉或页脚,见示例代码0802。使用RtfHeaderFooters类。该类允许你设置4个页眉或页脚,并指定在哪页出现。你当然可以结合Chapter创建4个不同的页眉或页脚,见示例代码0803。u使用RtfHeaderFooters类第1步创建一个RtfHeaderFooters类:

RtfHeaderFootersheaders=newRtfHeaderFooters();第2步添加HeaderFooter对象(_PAGES,newHeaderFooter(newPhrase("Thisheaderisonlyonlefthandpages")));(_PAGES,newHeaderFooter(newPhrase("Thisheaderisonlyonrighthandpages")));第3步如同使用页眉页脚一样使用=headers;使用(...)的常量:FIRST_PAGE:在你文档的第一页使用该页眉或页脚。你将使用lePage=true来完成LEFT_PAGES:所有左边页均使用该页眉或页脚RIGHT_PAGES:所有右边页均使用该页眉或页脚ALL_PAGES:所有页均使用该页眉或页脚,只有和FIRST_PAGE结合使用才有意义。有一件事非常重要:如果你使用LEFT_PAGES或者RIGHT_PAGES来设置页眉或页脚,再使用ALL_PAGES,页眉和页脚均不会起作用。表格效果见示例代码0804。第三部分iText的高级应用第九章字体本章原文讲了许多字体的使用技巧,但就是没有讲如何使用中文,因此,意义不大,再说,如果

不支持中文,前面的也就白翻译了,因此,根据原文讲到的一些知识,我摸索出汉字的使用方法,自己写了本章内容,应该算是“原创”了吧^_^(哎呀!谁拿鸡蛋扔我……)。Windows中一般都是使用TrueType字体,每个中文版Windows操作系统均默认安装了宋体、仿宋、黑体和楷体四种字体,你还可以安装其他第三方字体,如安装了Office2000后,会自动安装华文行楷等字体,比较奇怪的是,在PDF文件中插入了一种本计算机才有的字体,在打开PDF文件的计算机上虽然没有该字体,但仍然能正常显示!这有别于Word文件,Word文件将当前计算机中没有的字体一律用宋体代替,这大概是意外收获吧。字体文件一般保存在windirFonts目录中,扩展名为TTF,还有扩展名为TTC的字体文件,也是TrueType字体,不过是一个集合,也就是里面有多种字体。下面列出windows2000简体中文版四种标准字体的文件名称::宋体和新宋体:楷体:黑体:仿宋体TrueType字体应用按下面的方法写入黑体字文字,大小为32磅:BaseFontbfHei=Font(@"c:",TY_H,_EMBEDDED);Fontfont=newFont(bfHei,32);Stringtext="这是黑体字测试!";


本文标签: 代码 示例 使用 图片 字体