你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:技术专栏 / Linux开发
c#制作pdf全攻略(3)
 
嵌套表格
有两种方法嵌套表格,第一种是利用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#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框架看看你需要的图片格式是否得到支持。
前面的例子中,还有一些事情要注意:当添加一个图片时不会出现什么问题,文字始终浮于图片上面,本例中,我们希望图片浮在文字上面。这也是为什么我们将使用iTextSharp.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。
(编辑:aniston)
  推荐精品文章

·2024年12月目录 
·2024年11月目录 
·2024年10月目录 
·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089