OA办公软件与PDF文件联系紧密,PDF格式的文件也是办公人员必须掌握的!  设为首页 加入收藏夹 我来推荐 
您的位置:首页 > PDF应用技术 > PDF开发技术
PDF开发技术
用C#语言制作PDF文件全攻略图文教程
日期:2009-04-17 20:59:48 人气: 标签:

模板(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)的使用方法。

共有条评论信息评论信息
栏目分类

站点说明 | 站点导航 | 站点公告 |
OAPDF.COM版权所有 2009 V1.1