C# PDF 全攻略

转:http://www.cnblogs.com/zhuor/archive/2005/12/31/308908.html

StreamWriter pPDF=new StreamWriter(filePath);

ArrayList xRefs=new ArrayList();

float yPos =0f;

long streamStart=0;

long streamEnd=0;

long streamLen =0;

string strPDFMessage=null;

//PDF文档头消息

strPDFMessage=”%PDF-1.1\n”;

ConvertToByteAndAddtoStream(strPDFMessage);

xRefs.Add(mPDF.Length);

strPDFMessage=”1 0 obj\n”;

ConvertToByteAndAddtoStream(strPDFMessage);

strPDFMessage=”<< /Length 2 0 R >>\n”;

ConvertToByteAndAddtoStream(strPDFMessage);

strPDFMessage=”stream\n”;

ConvertToByteAndAddtoStream(strPDFMessage);

……

看了下面的炮制方法,我眼镜都摔坏了三幅,虽然用地方那样原本的法门能打造出满足的PDF文件,这必将是天才所为。后来,我从一个网站(网址:http://itextsharp.sourceforge.net/index.[HTML](http://www.blue1000.com/bkhtml/c22/))中看到了专门制作PDF文件的控件的介绍,暗喜之余,立马下载试验,果然非常轻松地制作出了想要的PDF文件,因为网站为英文,内容又多,读起来非常费力,在解决了自己的问题后,看到许多网友还在为PDF文件制作而郁闷,遂决定将该内容翻译为中文,由于本人英语水平一般,许多地方又晦涩难懂,故翻译质量不是很满意,敬请斧正,但大部分能看懂。本文的目的一是解决部分网友的燃眉之急,二是抛砖引玉,如果哪位仁兄愿意将该网站中的内容准确翻译出来,则是天下之大幸。

要用本文的点子生成PDF文件,需要五个控件:itextsharp.dll和ICSharpCode.SharpZipLib.dll,由于示例代码实在太多,我将代码全部整理出来,放在此外一个文件“示例代码.doc”中,所有这一个资源,我均位于了本人的ftp站点(ftp://202.107.251.26)上的“Pdf文件制作全攻略”文件夹中(文件夹中另外六个rar压缩文件为五个控件的源代码,供我们学习钻研采纳),你可以到此地下载相应的资源,或者直接到原网站下载。

为便利调试和讲述,所有例子均为DOS控制台程序,windows程序选用方法完全一致,遵照下边的步子创立一个可调试的项目:

1、 打开VS2003;

2、 单击菜单“文件”→“新建”→“项目”,在档次项目中甄选“Visual
C#系列”,在模板中挑选“控制台应用程序”,输入文件名称如“MakePdf”,指定好存放路径,然后点确定按钮;

3、
在“解决方案资源管理器”中右键单击“引用”,从弹出的菜单中采用“添加引用”,在“.NET”选项夹中接纳“浏览”,添加面前提到的五个应用,如下图:

4、 在代码窗口顶部添加多少个引用:

using iTextSharp.text;

using iTextSharp.text.pdf;

迄今结束,准备干活完毕。

第一有的 iText的概括利用
首先章 创制一个Document
动用iText五步成立一个PDF文件:helloword。

率先步,成立一个 iText夏普.text.Document对象的实例:

Document document = new Document();

其次步,为该Document创建一个Writer实例:

PdfWriter.getInstance(document, new FileStream(“Chap0101.pdf”,
FileMode.Create));

其三步,打开当前Document

document.Open();

第四步,为当下Document添加内容:

document.Add(new Paragraph(“Hello World”));

第五步,关闭Document

document.Close();

完全的代码见示例代码0101。

在例中,不难看出,制作一个PDF文件是卓殊简单的。

注:假若您将例中“document.Add(new Paragraph(“Hello
World”));”中的字符串“Hello
Word”换成闽南语,如“这是自身的首先个PDF文件”,暴发的结果自然让您不尽人意,因为变化的PDF文件中并从未将普通话显示出来,不要担心,在第9章中要特别讲解字体问题,粤语呈现也就迎刃而解了,假设无法正确呈现中文,也就没有必要翻译本文了。

下边对这几步做详细介绍。

首先步 成立一个Document实例:
iText夏普(Sharp).text.Document-object共有五个构造函数:

public Document();

public Document(Rectangle pageSize);

public Document(Rectangle pageSize,

int marginLeft,

int marginRight,

int marginTop,

int marginBottom);

率先个布局函数以A4页面作为参数调用第二个构造函数,第二个构造函数以每边36磅页边距为参数调用第四个构造函数

u 页面尺寸:

您能够因而点名的水彩和分寸创造你协调的页面,示例代码0102创造一个细长的浅肉色背景的页面:

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

大部场馆下利用纵向页面,假如希望利用横向页面,你只须采纳rotate()函数:

Document document = new Document(PageSize.A4.rotate());

详尽代码见示例代码0103。

u 页边距:

当创制一个文书时,你仍可以够定义上、下、左、右页边距:

Document document = new Document(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实例均继承自抽象类“iText夏普(Sharp).text.DocWriter”。

同时还有其它一种意况,你可以用iText夏普.text.pdf.PdfWriter爆发文档PDF文件,倘若您想创制一个TeX文档,你可以动用iText夏普(Sharp).text.TeX.TeXWriter包。

Writer类的构造函数是个人的,你不得不通过下面的办法创立一个实例:

public static xxxWriter getInstance(Document document, Stream os);(xxx
是 Pdf 或 XML)

你能够通过下边的法门创设一个实例:

PdfWriter writer = PdfWriter.getInstance(document, new
FileStream(“Chap01xx.pdf”));

而是你几乎永远不会用到Writer实例(除非你想创设高级PDF或者希望用一些特别特此外函数,如ViewerPreferences
或 Encryption)。所以经过下面的办法得到实例已经足足了:
PdfWriter.getInstance(document, new FileStream(“Chap01xx.pdf”));

在第一步中开创一个文档时,第一个参数意义不大,第二个参数可以是另外一种流,到目前截止大家间接采纳System.IO.FileStream将Document写入文件中,示例代码0105用到了System.IO.MemoryStream(那不是一个独自的例子,你不可能不在Servlet
Engine中测试这么些代码。

第三步 打开Document
u 摘要

在您写入此外实际数目在此以前,你恐怕希望经过以下三种格局写入一些关于本文档的摘要:

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的引用)和开创时间(实际上这两种办法是机动调用的)。

你还足以将自定义的称谓添加为“报头音讯”,可是这对于PdfWriter没有其他功效,假如看看实例代码0101爆发的pdf文件的“文档属性”,我们得以见见只有有PDF创制程序和成品日期,而示例代码0106的“文档属性”框中有更多的音信。

打开document前要做的事:

你只好在Open方法调用在此以前增长摘要,这是iText开发工具提供的一个摘取。

HTML中,报头音讯被放在文档前边报头标识中间,调用Open方法将导致报头音信写入流,因此在Document被打开后不可能改观这一个数量。

PDF报头信息不包括摘要,看起来有近似于:

%PDF-1.2

该行展现生成的文档是一个本子为1.2的PDF格式的文件,在PDF中,摘要保存在PdfInfo对象中,当文档关闭时曾经写入PdfWriter中了,由此,没有关于为啥不可能修改库来满意任何时候增长或改变摘要的技术原因

u 页面开始化

Open方法在不同的Witer中同时会发出先河化事件,举例来说,假使您需要一个水印或者页眉页角对象出现在文档第一页的先导处,你需要在打开文档前添加这一个,同样的用于安装该文档其他页水印、页眉、页角、页数和尺寸。

当调用下列方法:

public bool setPageSize(Rectangle pageSize)

public bool Add(Watermark watermark)

public void removeWatermark()

setting Header property

public void resetHeader()

setting Footer property

public void resetFooter()

public void resetPageCount()

setting PageCount property

暴发的结果只可以在下一个新页中来看(当在本页调用起头化方法时),代码见示例代码0107,你不可能不要预备一张名为watermark.jpg的图形,如下图:

u 阅读器参数:

你可以经过下边的章程为PDF文件指定一些读书器 (如Adobe Reader) 参数:

public void setViewerPreferences(int preferences)

在示范代码0108中,指定了下面一些参数:

writerA.setViewerPreferences(PdfWriter.PageLayoutTwoColumnLeft);

writerB.setViewerPreferences(PdfWriter.HideMenubar |
PdfWriter.HideToolbar);

writerC.setViewerPreferences(PdfWriter.PageLayoutTwoColumnLeft |
PdfWriter.PageModeFullScreen |
PdfWriter.NonFullScreenPageModeUseThumbs);

正如您所寓目的,参数可以使用以下部分常量:

l 文件被打开时,页面布局用到下边的内部一个 :

PdfWriter.PageLayoutSinglePage – 同时只彰显一个页面
PdfWriter.PageLayoutOneColumn –单列呈现
PdfWriter.PageLayoutTwoColumnLeft –双列展现,奇数页在左
PdfWriter.PageLayoutTwoColumnRight -双列呈现,奇数页在右
l 文件打开时,页面模式应用下面其中之一:

PdfWriter.PageModeUseNone – 既不显示大钢也不显得缩略图
PdfWriter.PageModeUseOutlines – 呈现大纲
PdfWriter.PageModeUseThumbs – 呈现缩略图
PdfWriter.PageModeFullScreen –
全屏模式,没有菜单、windows控件或者其他任何windows可见控件
l PdfWriter.HideToolbar – 当文档激活时,是否隐伏阅读程序(如Adobe
Reader)的工具条

l PdfWriter.HideMenubar -当文档激活时,是否隐伏阅读程序的菜单.

l PdfWriter.HideWindowUI
-当文档激活时,是否隐身阅读程序的界面元素,如滚动条、导航条等,而唯有保留文档展现

l PdfWriter.FitWindow – 是否调整文档窗口尺寸以合乎体现第一页。

l PdfWriter.CenterWindow – 是否将文档窗口放到屏幕主题

l 在全屏情势下,指定怎么着展现界面元素(选取一个)

PdfWriter.NonFullScreenPageModeUseNone -既不显得大钢也不显得缩略图
PdfWriter.NonFullScreenPageModeUseOutlines – 突显大钢
PdfWriter.NonFullScreenPageModeUseThumbs – 显示缩略图
表明:你不得不在类PdfWriter中调用那个艺术。

u 加密

打开文档往日还要做的一件事情就是加密(假使您愿意该文档加密),要达到那些目标,你可以应用下边的措施:

public void setEncryption(boolean strength, String userPassword, String
ownerPassword, int permissions);

strength 是上边三个常量之一:
PdfWriter.STRENGTH40BITS: 40 位
PdfWriter.STRENGTH128BITS: 128位 (Acrobat 里德(Reade)r 5.0及以上版本援助)
UserPassword和ownerPassword 能够为空或零长度, 那种情形下,
ownerPassword 将被擅自的字符串代替
Permissions 为下列常量之一:
PdfWriter.AllowPrinting
PdfWriter.AllowModifyContents
PdfWriter.AllowCopy
PdfWriter.AllowModifyAnnotations
PdfWriter.AllowFillIn
PdfWriter.AllowScreenReaders
PdfWriter.AllowAssembly
PdfWriter.AllowDegradedPrinting
该效率参见示例代码0109和演示代码0110。

writer.setEncryption(PdfWriter.STRENGTH40BITS, null, null,
PdfWriter.AllowCopy);

以身作则代码0109发生的公文能够被打开而无须密码,但用户不可以打印、修改本文档。

writer.setEncryption(PdfWriter.STRENGTH128BITS, “userpass”, “ownerpass”,
PdfWriter.AllowCopy | PdfWriter.AllowPrinting);

打你打算打开示例代码0110发生的公文时,将要求输入密码(’userpass’),因为添加了AllowPrinting参数,你可以打印该文档而不会发出其他问题。

第四步 添加内容
在分解第一步到第三步的不等示例中,你或许曾经碰到了一些目的如Phrase,
Paragraph等 在接下去的几章中,所有这多少个题材都将赢得详细分解。

偶然你可能想一个writer故意忽视document发生的作为,如示例代码0111:

当我们创设了五个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并将内容写入文件,该情势在终极被调用,你应有总是要关张文档。

高档话题:阅读PDF文件

该部分内容介绍了iText只可以发出PDF格式的文书而不可能分析PDF格式文件,不再翻译。

其次章 块、短句和段落

块(Chunk)是能被添加到文档的文书的细小单位,块可以用于构建其他基础元素如短句、段落、锚点等,块是一个有确定字体的字符串,要添加块到文档中时,其他具有布局变量均要被定义。下边一行中,大家创设了一个内容为“hello
World”、粉红色、斜体、COURIER字体、尺寸20的一个块:

Chunk chunk = new Chunk(“Hello world”,
FontFactory.getFont(FontFactory.COURIER, 20, Font.ITALIC, new Color(255,
0, 0)));

u 典型字体1:

在本指南中,除了第天问外(你可以在此处学会使用其它字体),大家将始终使用典型字体1,这个是不同的超人字体1:

· Courier (该字体定宽)

· Helvetica

· Times Roman

· Symbol

· ZapfDingbats

u 下划线/删除线

若果你期望一些块有下划线或删除线,你可以透过改动字体风格简单完成:

Chunk chunk1 = new Chunk(“This text is underlined”,
FontFactory.getFont(FontFactory.HELVETICA, 12, Font.UNDERLINE));

Chunk chunk2 = new Chunk(“This font is of type ITALIC | STRIKETHRU”,
FontFactory.getFont(FontFactory.HELVETICA, 12, Font.ITALIC |
Font.STRIKETHRU));

u 上标/下标

在块中有多少个法子可以调用,其中绝大多数将在接下去的章节中介绍,本章中只介绍一个办法
setTextRise(float f). 你可以行使该措施在上标或下标中写块。

u 块的背景

万一您想更改块的背景,你可以运用情势setBackground(Color color).
这将在块文本的下面添加一个彩色矩形:

ck.setBackground(new Color(0xFF, 0xFF, 0x00));

在演示代码0101中,你可以一览典型字体1和一个使用setTextRise,
setBackground等艺术的的例子。

短句
短句(Phrases)是一多样以特定间距(两行之间的距离)作为参数的块,一个短句有一个主字体,但短句中的一些块具有不同于主字体的书体,你有更多的精选去创立短句,一些现实运用参见代码0202。

u 古立陶宛语

因为古丹麦语平时使用,在类Phrase的构造函数中有一个特色:将一个字符串作为参数(若是你想避免这种气象,你不得不动用块工作而无法动用字符串),正如你在演示代码0203中见到的,这几个特点自动地将913至937(除903)和945至969(古希腊的ASCII值)范围内的具有字体改为希腊标志。

u 非紧要性

与其说这是一个表征,不如说是一个瑕疵,但不管怎么样,这使创办一个非紧要性的短句或段落成为可能,这将发出一个由下向上书写的临时效能(参见示例代码0204)。假如您想在一页校官一些职务移动到下边时或者有用。

证实,当您通过下边届时无法检查,也没有主意让您回来前一页。

段落
段落是一密密麻麻块和(或)短句。同短句一样,段落有确定的区间。用户仍是可以指定缩排;在边和(或)左边保留一定空白,段落可以左对齐、右对齐和居中对齐。添加到文档中的每一个段子将自动另起一行。有两种方法建立一个段落,如:

Paragraph p1 = new Paragraph(new Chunk(“This is my first paragraph.”,
FontFactory.getFont(FontFactory.HELVETICA, 12)));

Paragraph p2 = new Paragraph(new Phrase(“This is my second paragraph.”,
FontFactory.getFont(FontFactory.HELVETICA, 12)));

Paragraph p3 = new Paragraph(“This is my third paragraph.”,
FontFactory.getFont(FontFactory.HELVETICA, 12));

拥有有些对象将被添加到段落中:

p1.add(“you can add strings, “); p1.add(new Chunk(“you can add chunks
“)); p1.add(new Phrase(“or you can add phrases.”));

表达:一个段子有一个且仅有一个区间,假使你添加了一个不比字体的短句或块,原来的间隔仍旧有效,你可以透过SetLeading来改变间距,不过段落中兼有情节将接纳新的中的间距。见示例代码0205。

u 保持段落的全部性

在示范代码0206中,大家接纳了setKeepTogether(true)方法来总计将一个段落放在同样页中,该方法并不是始终有效,举个例证,第一段不可能刚好在一页中,于是被分成了两片段。第二段被放置在其次页,但第三段顺沿到了第三页上。

字体的接轨
您应有控制字体延续的一对条条框框,这么些规则的采用见示例代码0207,当我们将部分内容用指定的书体(非默认字体)创造一个短句或者段落后再添加更多内容时,伊始对象的书体风格将被接续,请看“Hello
1!”和“Hello 2”:

Phrase myPhrase = new Phrase(“Hello 2! “, new
Font(Font.TIMES_NEW_ROMAN, 8, Font.BOLD));

myPhrase.Add(new Phrase(“some other font “, new Font(Font.HELVETICA, 8,
Font.ITALIC)));

myPhrase.Add(new Phrase(“This is the end of the sentence.\n”, new
Font(Font.TIMES_NEW_ROMAN, 8, Font.ITALIC)));

document.Add(myPhrase);

俺们由提姆es New Roman
粗体字先导,添加一些文本使用Helvetica字体而不点名风格,大家发现文本被改动成了粗体,当大家再加一些文本使用提姆(Tim)es
New Roman字体和斜体风格,结果变成了粗斜体。

假如我们使用FontFactory来创建字体,字体风格不会被连续,因为FontFactory使用了其它的技术构建一个字体:

myPhrase = new Phrase(“Hello 1bis! “,
FontFactory.getFont(FontFactory.TIMES_NEW_ROMAN, 8, Font.BOLD));

myPhrase.Add(new Phrase(“some other font “,
FontFactory.getFont(FontFactory.HELVETICA, 8, Font.ITALIC)));

myPhrase.Add(new Phrase(“This is the end of the sentence.\n”,
FontFactory.getFont(FontFactory.TIMES_NEW_ROMAN, 8, Font.ITALIC)));

document.Add(myPhrase);

在下面的代码中,使用Helvetica字体的文书风字体没有点名(既不是粗体也不是斜体)。采纳提姆(Tim)es
New Roman的额外文本仅仅展现为斜体。

您也看看大家添加了一个段落,添加该段落就好似一个短句。

Paragraph myParagraph = new Paragraph(“Hello 1! “, new
Font(Font.TIMES_NEW_ROMAN, 8, Font.BOLD));

myParagraph.Add(new Paragraph(“This is the end of the
sentence.”,FontFactory.getFont(new Font.TIMES_NEW_ROMAN, 8)));

document.Add(myParagraph);

你可以不这样做,但将错过字体风格的存续,首先不用其他字体成立段落(例中大家只是给字体出区间为1.5倍),然后添加内容的不比部分。

myParagraph = new Paragraph(12);

myParagraph.Add(new Paragraph(“Hello 3! “, new
Font(Font.TIMES_NEW_ROMAN, 8, Font.BOLD)));

myParagraph.Add(new Paragraph(“This is the end of the sentence.”, new
Font(Font.TIMES_NEW_ROMAN, 8, Font.ITALIC)));

document.Add(myParagraph);

如若你利用了Phrase对象,你一样会错过字体风格的后续:

myPhrase = new Phrase(12);

myPhrase.Add(new Phrase(“Hello 4! “, new Font(Font.TIMES_NEW_ROMAN, 8,
Font.BOLD)));

myPhrase.Add(new Phrase(“This is the end of the sentence.”,
newFont(Font.TIMES_NEW_ROMAN, 8, Font.ITALIC)));

document.Add(myPhrase);

u 更改分割符

一般而言,当文本不可能放在一行时,文本将被剪切成不同的一对,iText首先会招来分割符,假若没有找到,文本将在行尾被截断。有局部预定的撤并符如“
”空格和“-”连字符,不过你可以利用setSplitCharacter方法来覆盖这个默认值。在演示代码0208中,你可以看出当到达行尾时一个块是何等被划分的。然后分隔符被改成点“.”,该行在该字符处被细分。

其三章 锚点、列表和注释
锚点
咱俩都知情HTML中的超文本链接,当大家点击某些语句,你可以跳转到网上的另外页。在PDF中也可以兑现那种功能。事实上,在第十一章整个章节中有至于PDF链接的介绍,但这是iText的更尖端的运用,本章中我们处理大概的iText。

一旦您想在文档中添加一个外表链接(例如利用URL链接到WEB上的其他文档),你可以简简单单地应用Anchor对象,它派生于Phrase对象,使用方法一致。只有两种额外措施定义二种额外变量:setName和
setReference。

外部链接示例:

Anchor anchor = new Anchor(“website”,
FontFactory.getFont(FontFactory.HELVETICA, 12, Font.UNDERLINE, new
Color(0, 0, 255)));

anchor.Reference = “http://itextsharp.sourceforge.net“;

anchor.Name = “website”;

要是你想添加内部链接,你需要采用该链接不同的名号,就象你相位在HTML中采纳名称作为锚点一样。为达到该目标,你需要丰硕一个“#”。

内部链接示例:

Anchor anchor1 = new Anchor(“This is an internal link”);

anchor1.Name = “link1”;

Anchor anchor2 = new Anchor(“Click here to jump to the internal
link”);

anchor.Reference = “#link1”;

这两个链接的事例请见示例代码0301。

列表
由此类List
和ListItem,你可以增长列表到PDF文件中,对于列表你还是可以够采纳是否排序。

排序列表示例:

List list = new List(true, 20);

list.Add(new ListItem(“First line”));

list.Add(new ListItem(“The second line is longer to see what happens
once the end of the line is reached. Will it start on a new line?”));

list.Add(new ListItem(“Third line”));

结果如下:

First line
The second line is longer to see what happens once the end of the line
is reached. Will it start on a new line?
Third line
不排序示例如下:

List overview = new List(false, 10);

overview.Add(new ListItem(“This is an item”));

overview.Add(“This is another item”);

结果如下:

This is an item
This is another item
您可以通过setListSymbol方法更改列表符号:

// 用字符串作为列表符号

list1.ListSymbol = “*”;

// 用Chunk 作为列表符号(包含“•”字符)

list2.ListSymbol = new Chunk(“\u2022”,
FontFactory.getFont(FontFactory.HELVETICA, 20));

//用图片作为列表符号

list3.ListSymbol = new Chunk(Image.getInstance(“myBullet.gif”), 0, 0);

还足以采纳setIndentationLeft和setIndentationRight方法设置缩排,列表符号的缩排在构造函数中设置。更多的事例请参见示例代码0302。

注释
iText帮助不同风格的笺注。

u 文本注释:

您可以添加一小段文本到你的文档中,但它并非文档内容的一局部,注释有题目和情节:

Annotation a = new Annotation(

“authors”,

“Maybe it’s because I wanted to be an author myself that I wrote
iText.”);

u 外部链接注释:

您需要指定一个可点击的矩形和一个字符串(URL描述)或URL对象:

Annotation annot = new Annotation(100f, 700f, 200f, 800f, new
URL(“http://www.lowagie.com“));

Annotation annot = new Annotation(100f, 700f, 200f, 800f,
http://www.lowagie.com“);

u 外部PDF文件链接注释:

你需要指定一个可点击的矩形和一个字符串(文件名称)和目标文件或页码。

Annotation annot = new Annotation(100f, 700f, 200f, 800f, “other.pdf”,
“mark”);

Annotation annot = new Annotation(100f, 700f, 200f, 800f, “other.pdf”,
2);

u 指定行为链接注释

您需要指定一个可点击的矩形和一个点名的所作所为:

Annotation annot = new Annotation(100f, 700f, 200f, 800f,
PdfAction.FIRSTPAGE);

u 应用程序链接注释:

您需要指定一个可点击的矩形和一个应用程序:

Annotation annot = new Annotation(300f, 700f, 400f, 800f,
“C://winnt/notepad.exe”, null, null, null);

咱俩不用在页面上指定一个职务,iText会内部处理。你可以见到iText添加文本注释在页面上脚下岗位下边,第一个在段后第一行下面,第二个在短句结束处的上面。

享有其他注释需要指定想匹配的矩形区域,在演示代码0304中,我们画了一些正方形(使用的函数将在第十章中牵线),为各类正方形添加了有些链接注释。

第四章 页眉页脚、章节、区域和制图对象
采取在第三至第五章中讲述的雅量简短iText对象足以避免更多的尖端话题(第九至十二章),紧记这多少个简单对象限定的功力,大量复杂的功力在第三有些。

页眉页脚
HeaderFooter对象可以于为文档每页添加页眉和页脚。这样一个页眉或页脚包含一个正经的短句(假设需要)和当前页码,倘若您需要更多复杂的页眉和页脚(使用表格或者第几页共几页),请阅读第十二章。

在演示代码0401中,你可以看出大家首先添加了一个包含页码没有任何边框的页脚。

HeaderFooter footer = new HeaderFooter(new Phrase(“This is page: “),
true);

footer.Border = Rectangle.NO_BORDER;

document.Footer = footer

咱俩还足以选择下边的构造函数:

HeaderFooter footer = new HeaderFooter(new Phrase(“This is page “), new
Phrase(“.”));

构造函数知道你愿意充足一个页码和将其放置在七个短句间,如若你只是设置一个HeaderFooter而不改动边框,页眉或页脚的文本上下各有一条直线。

HeaderFooter header = new HeaderFooter(new Phrase(“This is a header
without a page number”), false);

document.Header = header;

章节和区域
在第十一章校官描述如何构建一个树的外观,假设你只需要一个粗略的章节和(子)区域,你可以用Chapter对象和Section对象活动构建一个树:

Paragraph cTitle = new Paragraph(“This is chapter 1”, chapterFont);

Chapter chapter = new Chapter(cTitle, 1);

Paragraph sTitle = new Paragraph(“This is section 1 in chapter 1”,
sectionFont);

Section section = chapter.addSection(sTitle, 1);

在演示代码0402中,我们添加了一名目繁多的章节和子区域,你可以见见完好的树形,树形结构默认打开,假若你指望部分节点关闭,你无法不使用用BookmarkOpen属性其值为false,详见示例代码0403。

图形
假使你想添加图形,如直线、圆、几何窗体,你应有阅读读十章,但万一你只需要一些点滴的功力,你可以应用Graphic对象

Graphic grx = new Graphic();

//添加一个矩形

grx.rectangle(100, 700, 100, 100);

// 添加一条斜线

grx.moveTo(100, 700);

grx.lineTo(200, 800);

// 将图纸呈现出来

grx.stroke();

document.Add(grx);

一体化的代码请见示例代码0404,假使想见见整个的点子,请参见PdfContentByte对象API。

当您想给页面加一个边框或者在文件当前地方画一条水平线时,图形对象特别实惠。下边的格局用指定的肥瘦、间距(假若急需)和颜料画一个边框。

public void setBorder(float linewidth, float
extrASPace);

public void setBorder(float linewidth, float
extrASPace, Color color);

下边的主意用指定的增长率(即使需要)和颜料画一条水平线,线的长度是指定两边缘间可用面积的的比例。

public void setHorizontalLine(float linewidth, float percentage)

public void setHorizontalLine(float linewidth, float percentage, Color
color)

以身作则代码5中,有一个离边界5磅,线宽3磅的边框,还有两条水平线,一条为青色,5磅宽,可用空间的100%,其余一条为藏褐色,线宽3磅,可用空间的80%。

第五章 表格
要害:若是您唯有生成PDF文件(没有XMLHTML、RTF……),使用类pdfPTable代替类Table更好。

一些简短的报表
一个报表是带有单元格排列成矩阵的矩形区域。表格的距阵并不要求是m×n的,它可以有空洞或者单元格比单个的要大。

始建一个表格最通用的法门是预先领会有几行几列:

public Table(int columns, int rows);

在演示代码0501中,我们构建了一个简易的表:

Table aTable = new Table(2,2);

aTable.addCell(“0.0”);

aTable.addCell(“0.1”);

aTable.addCell(“1.0”);

aTable.addCell(“1.1”);

该表格有两行两列,单元格被电动抬高,从第一行第一列始发,然后是第二列,当一行满后,下一单元格自动添加到下一行的率先列中。

也足以将单元格添加到表中指定的地点,如示例代码0502,别了要添加System.Drawing.dll引用,以得到Point对象,大家创立了一个4行4列的表格然后添加一些单元格到自由的地方上:

Table aTable = new Table(4,4);

aTable.AutoFillEmptyCells = true;

aTable.addCell(“2.2”, new Point(2,2));

aTable.addCell(“3.3”, new Point(3,3));

aTable.addCell(“2.1”, new Point(2,1));

aTable.addCell(“1.3”, new Point(1,3));

你能够看到我们将AutoFillEmptyCells属性设置为true,这将电动、默认的单元格布局填充空的单元格,假使大家忘记了如此做(就象本例中第二个表格),将尚未额外的单元格添加,不包含其他单格的行也将被忽视,在本例中,第一行将不显得,因为该行是空行。

经常用数据库查询结果来填充表格,大多数景色下,你预先并不知道到底需要有些行,这就是干吗还有第二个构造函数的来头:

public Table(int columns);

iText遵照需要活动添加行,在演示代码0503中,起头化了4行4列,当我们抬高第6行和第7行的单元格时,iText自动扩充行数到7。

日增列数也是可能的,然则有些麻烦,它无法自动生成,你无法不接纳addColumns方法并设置列宽,详见示例代码0504。

部分表格参数
眼前例子中的表格并不赏心悦目,大家得以设置大量的参数来改变表相当观。类Table和类Cell派生于类Rectangle,我们得以用大方出类拔萃的Rectangle方法,让我们来探视示例代码0505。

Table table = new Table(3);

table.BorderWidth = 1;

table.BorderColor = new Color(0, 0, 255);

table.Cellpadding = 5;

  1. table.Cellspacing = 5;

Cell cell = new Cell(“header”);

cell.Header = true;

cell.Colspan = 3;

table.addCell(cell);

  1. cell = new Cell(“example cell with colspan 1 and rowspan 2”);

cell.Rowspan = 2;

cell.BorderColor = new Color(255, 0, 0);

table.addCell(cell);

table.addCell(“1.1”);

  1. table.addCell(“2.1”);

table.addCell(“1.2”);

table.addCell(“2.2”);

table.addCell(“cell test1”);

cell = new Cell(“big cell”);

  1. cell.Rowspan = 2;

cell.Colspan = 2;

cell.BackgroundColor = new Color(0xC0, 0xC0, 0xC0);

table.addCell(cell);

table.addCell(“cell test2”);

  1. document.Add(table);

u 单元格间距和填距

在第4行中,大家设置了报表的填距,就是单元格边界和内容间一定数量的长空,在后面的以身作则中,大家看来文本紧贴边界,通过动用用特定的填距,就足以制止。

在第5行中,大家设置了报表的区间,就是单元格和表格边界间的一定数量的空中,不同的单元格间使用了半数上空,具体代码见示例代码0506。

u 对齐模式

在演示代码0506中,我们也变更了单元格“big cell”的对齐形式:

cell.HorizontalAlignment = Element.ALIGN_CENTER;

cell.VerticalAlignment = Element.ALIGN_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表格有点象:

header

example cell with colspan 1 and rowspan 2
1.1
2.1

1.2
2.2

cell test1
big cell

cell test2

u 表格分割

若果一个报表无法放在一页中,将活动被细分,示例代码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。

报表的断然地点
iTextSharp.text.Table是一个透过专业措施成立表格的一定简单的类,但偶尔你希望表格有部分新鲜的表现,这种场地下您将使用更复杂的类com.lowagie.text.pdf.PdfPTable,示例代码0518是一个异常简单的例证,在第十章和十二章司令员有一些更复杂的事例。

第六章 图片
Image对象
借使你学习过API,你或许曾经注意到可以经过三种构造函数来创设图片,本手册中,我们将单纯告诉您最简单易行的化解方案,如访问通过文件名或URL确定的图形生成的Image对象。

public static Image getInstance(Uri url)

public static Image getInstance(string filename)

Image是一个抽象类,故得到实例的模式将判断给出的图片的项目(GIF、Jpeg、PNG……)并再次回到对象的品种Gif、Jpeg、Png……,一些图片会被忽视,如若您想知道什么样图片会被忽略,请查阅FAQ(http://www.lowagie.com/iText/faq.[HTML](http://www.blue1000.com/bkhtml/c22/)\#images)。

u 通过URL拿到图片实例

这是加上一个图纸最简单易行的不二法门,见示例代码0601,大家添加了一个WMF、一个Gif、一个Jpeg和一个PNG图片到文档中,使用4个URL得到:

Image wmf = Image.getInstance(new URL(“../examples/harbour.wmf”));

Image gif = Image.getInstance(new URL(“../examples/vonnegut.gif”));

Image jpeg = Image.getInstance(new URL(“../examples/myKids.jpg”));

Image png = Image.getInstance(new URL(“../examples/hitchcock.png”));

备注:许多PDF库在插入一个图形前都将其解压缩并更换成位图格式,下边是多少个自我为啥不这样做的来由:

这将促成PDF文件增大,这样暴发的PDF文件尺寸是例外图片文件尺寸总和的数十倍。
面临一个法规问题:LZW算法受专利尊敬,所以不允许采取这种算法来解压缩GIF等文件。
u 通过文件名取得图片实例

通过简单地改成图片引用路径将示例代码0601改成示例代码0602:

Image gif = Image.getInstance(“vonnegut.gif”);

Image jpeg = Image.getInstance(“myKids.jpg”);

Image png = Image.getInstance(“hitchcock.png”);

同示例代码0601的界别只是该图象从当地拿到而已,另外一个例子见示例代码0603。

图表的岗位
u 对齐方式

通过下面方法设置图片的对齐形式:

Alignment = Image.RIGHT

Alignment = Image.MIDDLE

Alignment = Image.LEFT

参见示例代码0604。

我们将Vonnegut的图样放在右侧,小孩的图片放在中间,hitchcock的图纸放在右侧。

u 图片和文书

除此以外,你还足以指定文本相对图片的拱卫格局:

Alignment = Image.RIGHT | Image.TEXTWRAP

Alignment = Image.MIDDLE

Alignment = Image.LEFT | Image.UNDERLYING

见示例代码0506,文字在Vonnegut图片的左手,并不在我孩子家的图处环绕,且排在Hitchcock图片的地点。

注明:该效能尚有一些BUG。

u 绝对地方

当创建PDF文件时,你可能用到该措施:

public void setAbsolutePosition(int absoluteX, int absoluteY)

将一个图形放要页面上一个万万地方的代码见示例代码0606,我们在不同的坐标处添加了两幅图片,这里运用给定的坐标将图纸放在了左下角,通过将图片的涨幅和冲天作为X和Y坐标将设置第一个图片,坐标的2倍设置第二个图片。

缩放和旋转图片
u 缩放

有两种方法能够缩放图片:

public void scaleAbsolute(int newWidth, int newHeight)

public void scalePercent(int percent)

public void scalePercent(int percentX, int percentY)

public void scaleToFit(int fitWidth, int fitHeight)

少儿的图片大小为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 旋转

可以经过下边的艺术旋转图片

public void setRotation(double r)

详细示例代码0608。

原来图片数据
到近期结束,所有例子中采用的图纸均出自地当地磁盘或者某个网站,但也说不定利用含有图表音信的数组来收获图片的实例:

public static Image getInstance(byte[] img)

该方法同前边方法的职能一样,再次回到一个新的Gif,Jpeg或者Png类其它Image对象。

在演示代码0609中,我们抬高一个从一个Jpeg文件中读入到字节数组中的图片,很显明,使用任何getInstance方法取得实例更优越,但这无非是一个事例,该getInstance方法在动态创设那个根本不存在的图片时丰盛实惠。

该例子也演示了怎么创设和应用一个原本图片。

public static Image getInstance(int width, int height, int components,
int bpc, byte data[])

本例中开创了一个100×100象素的图样,因为各种象素用RGB描述,所以图片大小为100×100×3字节。

System.Drawing.Bitmap
演示代码0610是一个相比较高档的话题,理由如下:

第一次利用到了System.Drawing.Bitmap类。该类在.net框架中,能够动用更多类型的图纸,如TIFF、GIF,而这么些图片在iText中均不扶助,你可以检查一下.net框架看看您需要的图片格式是否拿到襄助。
眼前的例子中,还有部分政工要留意:当添加一个图纸时不会并发什么问题,文字始终浮于图片下边,本例中,我们盼望图片浮在文字方面。这也是怎么我们将接纳iText夏普.text.pdf.PdfContentByte类的原委(见第十章)。
您将发现使用的图片为透明的gif格式,你可以到http://itextsharp.sourceforge.net/examples/h.gif下载得到。
TIFF和CCITT
示范代码0611也是一个相比高级的话题,例中转换一个TIFF文件到PDF文件。

u 图片遮罩

以身作则代码0613在,我们成立了一个看成遮罩的图纸

3C

7E

E7

C3

C3

E7

7E

3C

该图片尺寸为8×8象素,每组一个字节,使用makeMask()方法可以转换成遮罩。

byte maskr[] = {(byte)0x3c, (byte)0x7e, (byte)0xe7, (byte)0xc3,
(byte)0xc3, (byte)0xe7, (byte)0x7e, (byte)0x3c};

Image mask = Image.getInstance(8, 8, 1, 1, maskr);

mask.makeMask();

mask.setInvertMask(true);

大家可以用该遮罩直接遮住另外图片的一局部。

PdfContentByte cb = writer.DirectContent;

Image image = Image.getInstance(“vonnegut.gif”);

image.ImageMask = mask;

要么大家将该遮罩用于模板遮罪中。

PdfContentByte cb = writer.DirectContent;

cb.setRGBColorFill(255, 0, 0);

cb.addImage(mask, mask.scaledWidth() * 8, 0, 0, mask.scaledHeight() *
8, 100, 400);

有关ContentByte对象更多消息请参见第十章。

图形和任何对象
u 图片在块中

偶尔,可以便宜地将图纸置于块中,通过自然偏移将一个图形置于块中:

Chunk ck = new Chunk(img, 0, -5);

切实代码见示例代码0614,我们得以添加该特别图片块到短句、表格等,本例中的图片请到http://itextsharp.sourceforge.net/examples/pngnow.png下载。

u 图片在表格中

您可以将图片添加到单元格中,但有六个副功效:

l 表格的升幅是确定,当图片超出单元格的增长率时,将活动收缩。

l 你不可能举办文字绕排和为图片添加下划线。

参见示例代码0615。

u 图片链接注释

若果您希望赢得一个可点击的图形,或者想添加链接注释到图片上,你需要成立一个Annotation对象,并添加到图片上,你不需要指定地点(你可以使用0,0,0,0),该地方会内部更新以契合该图形。

gif.Annotation = new Annotation(0, 0, 0, 0, “Chap1102b.pdf”, 3);

jpeg.Annotation = new Annotation(“picture”, “These are my children”, 0,
0, 0, 0);

参加示例代码0616。

第二局部 其他文档格式
第七章 XML
(X)HTML
本章紧要介绍了怎么使用iText控件生成XLM文档和(X)HTML文档,但我们对这一个并不感兴趣,故只介绍本章中涉及的将XML转为PDF。

在率先章中,大家透过5步生产一个PDF文件,为了将一个XML文件转换为PDF文件,只需重写第3和第4步,第5步由解析器自动处理。

//第3步:创设一个解析器并设置文档句柄:

iTextHandler h = new iTextHandler(document);

//第4步,转换该文档:

h.Parse(“Chap0701.XML“);

以身作则代码见示例代码0702

第八章 RTF文件
RTF包
RTF包是依照iText包扩充出来的,允许iText除生成PDF文件外仍是可以够输出RTF文件,除了有些在RTF包中不协助的特色外,大多数PDF文件特性都足以运用。

始建一个RTF文档
创设一个RTF文档和创造一个PDF文档方法是同一的,都是这基本的5步,唯一的界别是第2步中用RtfWriter代替了PdfWriter,见示例代码0801。

第1步 创制一个the iText夏普.text.Document对象的实例:

Document document = new Document();

第2步 创立一个document的RtfWriter将document写入你选拔的输出流:

RtfWriter.getInstance(document, new FileStream(“Chap0801.rtf”),
FileMode.Create);

第3步 打开document:

document.Open();

第4步 添加内容到document

document.Add(new Paragraph(“Hello World”));

第5步 关闭document

document.Close();

关于咋样创造其他对象并添加到document中,请参见其他章节的始末。

不帮忙的特性
水印
阅读器参数
加密
内嵌字体
块间距
段落右缩排
列表右缩排
无圆点符号列表
嵌套表格
除JPEG和PNG的另外图片
RTF中扩张的页眉和页脚
写入RTF时无法在起来新页前通过setHeader方法改变文档的页眉或页脚,这里有六个主意来化解这些题目。

采纳“Chapters”,添加一个新“chapter”到文档前,使用setHeader或setFooter,你可以在不同的“Chapters”中利用不同的页眉或页脚,见示例代码0802。
行使RtfHeaderFooters类。该类允许你设置4个页眉或页脚,并点名在哪页出现。你本来可以构成Chapter创立4个不等的页眉或页脚,见示例代码0803。
u 使用RtfHeaderFooters类

第1步创造一个RtfHeaderFooters类:

RtfHeaderFooters headers = new RtfHeaderFooters();

第2步添加HeaderFooter对象

headers.Add(RtfHeaderFooters.LEFT_PAGES, new HeaderFooter(new
Phrase(“This header is only on left hand pages”)));

headers.Add(RtfHeaderFooters.RIGHT_PAGES, new HeaderFooter(new
Phrase(“This header is only on right hand pages”)));

第3步如同使用页眉页脚一样接纳RtfHeaderFooters

document.Header = headers;

使用RtfHeaderFooters.add(…)的常量:

FIRST_PAGE:
在你文档的率先页使用该页眉或页脚。你将接纳rtfWriter.HasTitlePage =
true来完成
LEFT_PAGES: 所有左侧页均使用该页眉或页脚
RIGHT_PAGES: 所有左侧页均使用该页眉或页脚
ALL_PAGES: 所有页均使用该页眉或页脚,只有和FIRST_PAGE
结合使用才有意义。
有一件事不胜重大:假诺你利用LEFT_PAGES或者RIGHT_PAGES来安装页眉或页脚,再使用ALL_PAGES,页眉和页脚均不会起效率。

报表效果见示例代码0804。

其三局部 iText的尖端应用
第九章 字体
本章原文讲了无数字体的行使技巧,但即使从未讲什么样使用粤语,由此,意义不大,再说,即便不帮忙粤语,后面的也就白翻译了,因而,按照原文讲到的有的知识,我找找出汉字的施用办法,自己写了本章内容,应该算是“原创”了吧^_^(哎哎!何人拿鸡蛋扔我……)。

Windows中一般都是运用TrueType字体,每个闽南语版Windows操作系统均默认安装了陶文、黑体、大篆和甲骨文四种字体,你还足以设置其他第三方字体,如安装了Office
2000后,会活动安装华文行楷等字体,相比较奇怪的是,在PDF文件中插入了一种本总计机才有的字体,在开辟PDF文件的微机上即使尚未该字体,但照样能健康突显!这分别Word文件,Word文件将方今总括机中绝非的书体一律用钟鼓文代替,这大概是竟然收获呢。

字体文件一般保存在windir\Fonts目录中,扩张名为TTF,还有扩张名为TTC的字体文件,也是TrueType字体,不过是一个会聚,也就是里面有多种字体。下边列出windows2000简体闽南语版四种标准字体的文件名称:

SIMSUN.TTC:石籀文和新钟鼓文

SIMKAI.TTF:楷体

SIMHEI.TTF:黑体

SIMFANG.TTF:仿宋体

TrueType字体应用
按下边的情势写入行草字文字,大小为32磅:

BaseFont bfHei = BaseFont.createFont(@”c:\winnt\fonts\SIMHEI.TTF”,
BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

Font font = new Font(bfHei, 32);

String text = “这是钟鼓文字测试!”;

document.Add(new Paragraph(text, font));

毫不管BaseFont.createFont方法第二、多少个参数的意味,依葫芦画瓢就行了,第一个参数显示就是字体文件存放的职位。

背后的代码都特别好领悟,不再赘言。

TruType字体集合的施用
字体集合的行使同地点差不多,只是在在createFont方中要指定使用哪一种字体。如:

BaseFont bfSun=BaseFont.createFont(@”c:\winnt\fonts\SIMSUN.TTC,1″,
BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

font = new Font(bfSun, 16);

text = “这是字体集合中的新石籀文测试!”;

document.Add(new Paragraph(text, font));

不难看出,在运用BaseFont.createFont方法时,首个参数@”c:\winnt\fonts\SIMSUN.TTC,1″中多了一个“,1”,表示使用序号为1字体,序号为0的字体为小篆。

到底大家不是做排版软件,有了地方的章程就大多够用了,真正很复杂的PDF文件制作,不妨做成XML文本(最简便易行的法子就是用Word排版,然后另存为web页了),然后按第七章的办法转换。

代码见示例代码0901。

第十章 图象和文书的相对化地点
pdfContentByte
到近期结束,大家曾经使用了简便易行的iText,大家早已添加了文本、图片、段落、章节、列表、表格等,没有涉嫌到布局问题。Itext分割文本到每页中,并将各样单词、句子、段落布置到页面上,但有时候我们并不需要这种活动格式,有时大家期望将部分图象或者文本放置在某页的指定地方,为促成该效能,大家将接纳PdfContentByte类。

为代表第一章,仅用PdfWriter类的getInstance方法是不够的,你必须真正地拥有一个PdfWriter对象,你可以经过在行使Writer对象中动用getDirectContent()方来得到该对象。例:

PdfWriter writer = PdfWriter.getInstance(document, new
FileOutputStream(“test.pdf”));

PdfContentByte cb = writer.DirectContent;

证实:当您添加高级对象(如表格)时,六个PdfContentByte对象将被里面接纳:一个用以文书,一个用用于图象(如边界或单元格背景)。文本绘制浮于图象的方面。

当您通过getDirectContent()方法直接接纳PdfContentByte对象时,你所添加的有着目的都将浮于文本和图象。倘使你想避免这种景观和愿意丰盛内容在图象或文本的暗中,你需要利用用getDirectContentUnder()方。

一句话,当一页完成时,4层的重合按照如下顺序:

1、 通过getDirectContentUnder()得到的PdfContentByte

2、 包含图象或高档对象的内部PdfContentByte

3、 病文本或高级对象的中间PdfContentByte

4、 通过getDirectContent()得到的PdfContentByte

简单图形
在演示代码1001中,绘制了一些简便图形,我们拔取了诸如moveTo和lineTo方法来在运动到页面上近期岗位然后画一条直线到另外地方。我们采纳了诸如setLineWidth和setLineDash方法来改变直线的外观,如:

cb.LineWidth = 10f;

cb.moveTo(100, 700);

cb.lineTo(200, 800);

cb.stroke();

表明:当您转移诸如颜色、线宽等特性时,只有你在调用stroke方法时才起效果。在例中绘制三角形时,大家设置颜色为红色,在利用stroke方法前我们转移颜色为褐色,则绘制三角形的结果为为革命而不是褐色,该例中还有矩形、圆等采纳方法。

文本
当你想将文件写入ContentByte中时,你无法不使用模式beginText()和endText,你也务必安装字体和尺寸。就象图形示例中千篇一律,还有好多办法用于写入和停放文本,但你最急需的是模式showTextAligned和措施showText配合setTextMatrix。

例1:

BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252,
BaseFont.NOT_EMBEDDED); cb.beginText();

cb.setFontAndSize(bf, 12);

cb.showTextAligned(PdfContentByte.ALIGN_CENTER, text + “This text is
centered”, 250, 700, 0);

cb.endText();

例2:

BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252,
BaseFont.NOT_EMBEDDED);

cb.beginText();

cb.setFontAndSize(bf, 12);

cb.setTextMatrix(100, 400);

cb.showText(“Text at position 100,400.”);

cb.endText();

请参见示例代码1002。

模板(Form xObjects)
当我们在第四章研究页眉和页脚时,我们定义了一小块添加到每一页的音信,实际上,该小块音讯写到了文本的每一个新页上。这并不是最划算的缓解方案,更好的艺术是将该音讯作为一个Form
Xobject仅在文档中添加四回,在其可见地方再一次出现。我达到该目标,我们将应用模板。

u 创制一个PdfTemplate

u
创立PdfTemplate的最好点子是调用PdfContentByte对象中的createTemplate方法:

PdfContentByte-object:

PdfTemplate template = cb.createTemplate(500, 200);

这样,该模板的宽度为500,中度为200。

透过该模板大家得以做象PdfContentByte同样的事情

template.moveTo(0, 200);

template.lineTo(500, 0);

template.stroke();

template.beginText();

BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252,
BaseFont.NOT_EMBEDDED);

template.setFontAndSize(bf, 12);

template.setTextMatrix(100, 100);

template.showText(“Text at the position 100,100 (relative to the
template!)”);

template.endText();

u 添加一个模板到文档

透过象下面一样在相对地点添加一个模板:

cb.addTemplate(template, 0, 400);

您还足以做一些妙不可言的事情,如缩放或旋转他们:

//将模板旋转90度

cb.addTemplate(template, 0, 1, -1, 0, 500, 200);

// 缩放模板为50%

cb.addTemplate(template, .5f, 0, 0, .5f, 100, 400);

//缩放模板为200%

cb.addTemplate(template, 2, 0, 0, 2, -200, 400);

现实演示见示例代码1003。

u 第几页共几页

在部分意况下,你期望插入一些您在写本页时外壳无法知道的信息到文本中去,如:在一篇文档的首先页,你并不知道该文档共有几页。只好在形成了方方面面文档时才精晓总的页数。当使用模板时,该问题就不设有了。在演示代码0103中,我们在加上模板到ContentByte前添加了有的消息到模板中,这是尚未必要的。大家可以在任什么日期候增长新闻到模板,因为iText添加Form
Xobject是在PDF停止的地方(当通过close方法关闭该文档时调用)。示例代码1004来得了第一创设4页然后添加总到页数,该例分外简单和行之有效。

分栏
在本章从前,你早就控制了什么将文件放在一个纯属地方,这种情形下,我们要确定文件的上马坐标。假若我们想知道文书的终结地方,大家得做一些总结工作。

现在大家要加一些文件到一个矩形框的其中,希望文本到达左边界时自动换行。超出矩形部分将不出示,可以透过ColumnText类实现。

举个例证:

为展现一个点名的短句在坐标(100, 300)和(200,
500)间的矩形内居中,大家应用下边的代码:

PdfContentByte cb = writer.DirectContent;

ColumnText ct = new ColumnText(cb);

ct.setSimpleColumn(phrase, 60, 300, 100, 500, 15,
Element.ALIGN_CENTER);

ct.go();

通过查看示例代码1005,你会及时发现经过该措施能够能够画一些繁杂的报表而无须Table对象。

另一个事例:

未曾必要两回性将文件全体充分进去,你可以先定义一个矩形,然后添加一些文书,最后用go方法突显分栏。

PdfContentByte cb = writer.DirectContent;

ColumnText ct = new ColumnText(cb);

ct.setSim7pleColumn(60, 300, 100, 500, 15, Element.ALIGN_CENTER);

ct.addText(phrase1);

ct.addText(phrase2);

ct.addText(phrase3);

ct.go();

详细示例代码1006。

多栏

本来,假设文本超出了矩形范围,我们并不想不见那多少个多出的文件,或许大家想将这多少个文件展现到另外栏中。这就是干什么大家要翻开go方法重临值的缘故。尽管回到标识为“NO_MORE_COLUMN”,表示该栏中并未丰裕的空间存放该公文,假使持有的公文均显示出来,标识将为“NO_MORE_TEXT”。

请参见示例代码1007。

难堪栏

概念一个非矩形的区域来显示栏也是可能的,通过利用setColumns方法,我们为文本定义了一个左左侧际。

float[] left = {70,790, 70,60};

float[] right = {300,790, 300,700, 240,700, 240,590, 300,590, 300,106,
270,60};

ct.setColumns(left, right);

右侧界是一条直线,而左侧界是不对的。该函数的结果可以引致部分老大幽默的布局,见示例代码1008,本例中您将动用一个名为caesar_coin.jpg的图片:

PdfTable
在第5章中,大家简要地讲述了PdfPTable对象,现在大家将研商该对象更多的的特性。

你能够用3种不同的章程创造PdfTable:

PdfPTable(float[] relativeWidths);

PdfPTable(int numColumns);

PdfPTable(PdfPTable table);

你可以给该表设置更多的参数,如表宽度、列宽度、水平对齐形式等,你可以由此下边的法子添加单元格:

public void addCell(PdfPCell cell);

public void addCell(PdfPTable table);

public void addCell(Phrase phrase);

public void addCell(String text);

除开单元格填距和和距离,这多少个主意同Table对象至极接近。这个参数对各样单元格个体举办了安装,当然,你可以设置单元格的默认值,为改变单元格的默认值,使用getDefaultCell()和调用一个或更多的类PdfPCell的方法(你可以安装对齐格局、间距、边框、颜色仍然低于低度)。

注:通过PdfPTable,你能更改一个单元格的列跨度,但无法改变行跨度!在PdfPTable内部是局部独自的行,要让它辅助行跨度更改需要对PdfPTable对象举行很大的调整,不要期待在不久前内实现,你可以用嵌套表来解决这多少个题材。

你可以象第5章一样将一个PdfPTable添加到当下文档中,但您也可以增长一个表在当前页中的相对地方:

public float writeSelectedRows(int rowStart, int rowEnd, float xPos,
float yPos, PdfContentByte canvas);

参数rowStart是您想起初的行的多少,参数rowEnd是您想浮现的尾声的行(倘使您想体现所有的行,用-1),xPos和yPos是表格的坐标,canvas是一个PdfContentByte对象。在示范代码1009中,大家添加了一个表在(100,600)处:

table.writeSelectedRows(0, -1, 100, 600, writer.DirectContent);

选择PdfPTable,你无法设置行跨度和(或)来跨度(怎么和下面的有点争论?)你能够行使嵌套表来解决,见示例代码1010。

说到底,示例代码1011和演示代码1012显得了PdfTable可以和templates 和
columns一起利用,在演示代码1012少校用到cover.png图片如下:

颜色(SpotColors)和图案(Patterns)
颜色(spotcolors)的选择见示例代码1013,示例代码1014和演示代码1015示范了图画(patterns)的使用情势。

第十一章 本地和外边转账、目的和大意
本土转化
偶然你需要一个同意读者从文档的一个地点跳转到其余一个地点的链接,你可以透过类Chunk的setLocalGoto
和setLocalDestination六个措施实现,例:

Chunk localgoto = new Chunk(“this word”,
FontFactory.getFont(FontFactory.HELVETICA, 12, Font.NORMAL, new Color(0,
0, 255))).setLocalGoto(“test”);

Chunk destination = new Chunk(“local destination”,
FontFactory.getFont(FontFactory.HELVETICA, 12, Font.NORMAL, new Color(0,
255, 0))).setLocalDestination(“test”);

见示例代码1101。

异乡转账
在第3章中,我们演示了一个锚点咋样转向到其它URL,一个锚点通过不同的字体、风格和颜料,可以蕴涵不同的Chunks,在iText的尖端应用中,下边定义链接到URL的其它情势:

Chunk chunk = new Chunk(“anchor”,
FontFactory.getFont(FontFactory.HELVETICA, 12)).setAnchor(new
URL(“http://www.lowagie.com/iText/“));

u 转到PDF文档中的指定地方

一经您在文档中指定了一个目的地,你可以从此外一个文档跳转到这里,为兑现该意义,你可以动用办法:

setRemoteGoto: Chunk chunk = new Chunk(“jump”,
FontFactory.getFont(FontFactory.HELVETICA, 12,
Font.ITALIC)).setRemoteGoto(“test.pdf”, “test”));

test.pdf是另外一个pdf文件,”test”是该公文的一个目的地。

跳转到另一个PDF文件指定页

行使模式setRemoteGoto,用页码参数代替名称参数,可以分外容易地跳转定其余一个文档的指定页:

chunk = new Chunk(“jump”, FontFactory.getFont(FontFactory.HELVETICA, 12,
Font.ITALIC)).setRemoteGoto(“test.pdf”, 3));

见示例代码1102

u 启动一个应用程序

可以采取上边的办法启动一个应用程序:

public PdfAction(String application, String parameters, String
operation, String defaultDir)

只要application为“c:/winnt/notepad.exe”(另外参数可以为null),你可以通过PDF文件中的链接来启动记事本程序。

u 文件和URL

假如您想跳转到其他文档或URL,你需要通过下边的构造函数之一创建一个:

PdfAction(String filename, String name);

PdfAction(String filename, int page);

PdfAction(URL url);

PdfAction(String url);

面前三个构造函数允许你跳转到文件的指定地方或页码,后四个构造函数允许你跳转到其他URL上。

另外部分略。 

相关文章